2017-02-16 15 views
3

Чтобы иметь возможность отлаживать и путать весь дистрибутив Linux, я хотел бы установить ASAN (AddressSanitizer, https://en.wikipedia.org/wiki/AddressSanitizer) как вариант по умолчанию для gcc. Таким образом, как правило, чтобы достичь того, чего я хочу, в общем, я поставил следующие переменные перед скомпилировать Линукс пакет:Включить AddressSanitizer по умолчанию в gcc

CFLAGS="-fsanitize=address,undefined -Wformat -Werror=format-security -Werror=array-bounds -g" 
CXXFLAGS="-fsanitize=address,undefined -Wformat -Werror=format-security -Werror=array-bounds -g" 
LDFLAGS="-fsanitize=address,undefined" 

и попытаться собрать и запустить свой код. Я хотел бы иметь его по умолчанию gcc.

Один из вариантов - использование файлов спецификаций: https://gcc.gnu.org/onlinedocs/gcc/Spec-Files.html. Однако я не нашел способ установить «catch all rules» для компиляции и привязки всего кода c/C++ с помощью AddressSanitizer.

Мои вопросы:

  • Любой пример того, как сделать это с помощью спецификации файлов?
  • Это лучший способ сделать это?
  • Любой другой альтернативный подход?

ответ

2

Прежде всего, убедитесь, чтобы взглянуть на существующем целые дистрибутивы Асан enablings в Tizen (также here) и Gentoo.

В целом существует два основных подхода:

  • настроить систему сборки, чтобы включить Асан по умолчанию, как правило, с использованием CFLAGS и CXXFLAGS; это не всегда будет работать, потому что многие пакеты игнорировать их (я думаю, что это то, что Ханно Boeck сделал в Gentoo)
  • заменить /usr/bin/gcc, /usr/bin/g++ и /usr/bin/cc (и может x86_64-linux-gnu-gcc, x86_64-linux-gnu-g++) с обертками, которые бы добавить Асан флаги и перенаправлять вызовы на оригинал исполняемые (это подход, который мы в конце концов взяли в Tizen и нашел его очень успешно)

Как примечание стороны, я хотел бы предложить, чтобы добавить следующие параметры

CFLAGS += -fsanitize-recover=address,undefined 

в противном случае отказ загрузки в т ранние стадии. Также посмотрите на предлагаемые настройки ASAN_OPTIONS в приведенных выше ссылках, людям потребовалось много времени, чтобы выяснить их.

+0

привет, не могли бы вы указать мне пример оболочки gcc? Я нашел, например, https://github.com/gawen947/gcc-wrapper, который я мог бы изучить, однако, если у вас есть что-то уже в виду, было бы лучше .. –

+1

@VP. Ну, это действительно просто примитивная оболочечная оболочка, которая вызывает «true» gcc с помощью «-fanitize = address -fsanitize-recover = address -fno-common и т. Д.». Gcc-обертки - обычная практика (см., Например, [инструкции pbuilder] (https://wiki.debian.org/PbuilderTricks#How_to_use_pbuilder_to_test_build_with_gcc-snapshot)), но я боюсь, что у меня нет ссылки на Асана. – yugr

+0

Хорошо, я сделал что-то вроде export MYFLAGS = "..."; exec/usr/bin/gcc-6 $ @ но он не работал как-то .. спасибо вам большое спасибо! –