Получение неопределенного символа: __asan_memset при попытке использовать дезинфицирующее средство адреса Clang

Я пытаюсь использовать средство очистки адресов с clang для компиляции приложения C++, но получаю следующую ошибку:

/Class.so: неопределенный символ: __asan_memset

Я добавил -fsanitize=address к флагам компилятора

/opt/llvm-3.8.0/bin/clang++ -M --gcc-toolchain=/opt/gcc-5.2.0 -fsanitize=адрес

и я добавил -fsanitize=address и -lasan к флагам компоновщика:

-fsanitize=адрес -lasan -shared -fuse-ld=gold-2.25 -o Class.so Class.o

Что еще мне нужно сделать, чтобы заставить это работать?


person user997112    schedule 31.05.2018    source источник


Ответы (1)


Ваш основной исполняемый файл, вероятно, не связан с -fsanitize=address. По умолчанию Clang связывает библиотеку времени выполнения Asan (которая предоставляет определения __asan_memset и других символов Asan) только с исполняемыми, а не с общими библиотеками, и это вызывает ошибки в вашем случае.

Чтобы обойти это, вы можете либо повторно связать исполняемый файл с помощью -fsanitize=address, либо повторно связать продезинфицированные шлибы с помощью -shared-libasan и запустить с помощью LD_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so).

Дополнительные сведения см. на вики-странице AsanDSO.

person yugr    schedule 31.05.2018
comment
Нужно ли указывать -lasan в строке исполняемого компоновщика? - person user997112; 31.05.2018
comment
@user997112 user997112 Нет, это не одобрялось разработчиками Asan, например. здесь. Связывание с -fsanitize=address добавляет -lasan внутренне (в дополнение к другим важным вещам). - person yugr; 31.05.2018
comment
У меня та же проблема, но, к сожалению, мой основной исполняемый файл называется /usr/bin/python, и я не могу повторно связать его :( (модуль python загружает очищенный .so с помощью ctypes.CDLL). - person Bulletmagnet; 08.03.2019
comment
@Bulletmagnet В этом случае просто обязательно скомпилируйте / свяжите продезинфицированные шлибы с -fsanitize=address -shared-libasan и используйте LD_PRELOAD=.... - person yugr; 11.03.2019