AddressSanitizer: Откуда мы знаем, что объектный файл/исполняемый файл на языке C скомпилирован с помощью AddressSanitizer?

Мы планируем интегрировать инструмент AddressSanitizer в нашу инфраструктуру сборки.

Для этого я работаю над нашими файлами GNUmake, чтобы скомпилировать весь мой код C с помощью AddressSanitizer (добавляя флаг :-fsanitize=address). Теперь я хотел бы проверить, скомпилирован ли созданный объектный файл или исполняемый файл с помощью AddressSanitizer или нет.

Есть ли способ, которым я могу проверить то же самое.

Я просто пытаюсь запустить nm | грэп асан :-

Это дает следующие неопределенные ссылочные символы.

     U __asan_init
     U __asan_option_detect_stack_use_after_return
     U __asan_register_globals
     U __asan_report_load1
     U __asan_report_load4
     U __asan_stack_malloc_1
     U __asan_unregister_globals

Я не уверен, что это правильный способ проверки. Он показывает неопределенную ссылку, как указано выше. Я не уверен, правильно ли я интегрировал AddressSanitizer в нашу систему сборки. Можно ли просто скомпилировать код с ( -fsanitize=address) ? или еще мне нужно что-то сделать здесь для успешного использования AddressSanitizer.

Пожалуйста, помогите мне в этом. Заранее спасибо.


person santosh    schedule 20.01.2020    source источник
comment
Можно ли просто скомпилировать код с ( -fsanitize=address) - вам нужно и скомпилировать (-c), и связать с этим флагом.   -  person yugr    schedule 20.01.2020
comment
yugr, Да, для линковки я тоже использую флаг, но при линковке мне также нужно использовать библиотеку asan, верно? то есть -L/test/common/pkg/gcc/v4.8.0/lib -lasan   -  person santosh    schedule 20.01.2020
comment
Нет, -fsanitize=address добавит эти флаги за вас.   -  person yugr    schedule 20.01.2020
comment
если мы не свяжемся через -L/test/.... -lasan, символы не будут осквернены, как я уже говорил, верно? Только использование флага -fsanitize=address без использования библиотеки -lasan является правильным способом использования дезинфицирующего средства адреса?   -  person santosh    schedule 20.01.2020
comment
При связывании внутренний -fsanitize=address расширяется до -L... -lasan и множества других вещей. Разработчики Asan предлагают использовать -fsanitize=address вместо явного -lasan. Проверьте этот ответ для получения более подробной информации.   -  person yugr    schedule 20.01.2020
comment
Спасибо @ yugr, после компиляции моего кода с параметром -fsanitize=address я вижу символы, относящиеся к асану, и они не определены. Это должно быть хорошо, верно? Просто запуск наших команд сборки с флагом -fsanitize=address указывает на успешное использование средства очистки адресов независимо от того, определен символ или нет? Я думал, что эти символы должны быть определены.   -  person santosh    schedule 20.01.2020
comment
В GCC ожидаются неопределенные символы в финальном исполняемом файле, потому что они будут импортированы при запуске из libasan.so (если вы используете Clang, они будут определены, потому что он связывает libclangrt_asan статически).   -  person yugr    schedule 20.01.2020
comment
Привет, югр. После успешной сборки, когда я пытаюсь запустить тесты, я получаю неопределенную ссылку на ошибку символов __asan_report_store4. Нужно ли нам также указывать флаг «-fsanitize=address» при создании файлов .so? Недостаточно только предоставления одного и того же флага при компиляции файлов .c?   -  person santosh    schedule 21.01.2020
comment
я использую gcc6.3 и как я могу определить эти символы? Как вы упоминали в других сообщениях, использование -lasan не является правильным способом. Не могли бы вы рассказать мне, как сделать символы, определенные комбинацией gcc.   -  person santosh    schedule 21.01.2020
comment
Пожалуйста, прочитайте ссылку на ответ, который я разместил выше.   -  person yugr    schedule 21.01.2020
comment
Отвечает ли это на ваш вопрос? Как использовать AddressSanitizer с GCC?   -  person yugr    schedule 21.01.2020
comment
Да, я следовал тому же. Моя сборка проходит успешно, но тесты завершаются с ошибкой: ==57920==Среда выполнения ASan не стоит первой в исходном списке библиотек; вы должны либо связать среду выполнения с вашим приложением, либо предварительно загрузить его вручную с помощью LD_PRELOAD. xrun: *E,ELBERR: Ошибка во время обработки (статус 1), выход.   -  person santosh    schedule 21.01.2020
comment
Это другая проблема, и ответ на нее зависит от деталей компиляции вашего приложения (например, создаете ли вы разделяемую библиотеку или исполняемый файл и как вы его запускаете). Я предлагаю опубликовать другой вопрос, желательно с небольшим репродукционным случаем.   -  person yugr    schedule 21.01.2020


Ответы (1)


Поиск ссылок на функции Asan (обычно __asan_report_) в таблице символов — это нормально при проверке объектных файлов. Для связанных исполняемых файлов это также работает в большинстве случаев (кроме случаев, когда вы связываетесь с GCC и -static-libasan -s).

person yugr    schedule 20.01.2020