Ваш инструментарий несколько озадачен тем, какая версия GCC и
сбой связи является одним из следствий этой путаницы.
Вы говорите нам, что используете GCC 7.3.1, но первая из неразрешенных ссылок на __asan_init_v1
:
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/libasan_preinit.o:(.preinit_array+0x0) : undefined reference to « __asan_init_v1
показывает, что gcc
, который вызвал связь с -fsanitize=address
, связал код инициализации сантитизатора адреса
с вашей установки GCC 4.8.5.
В GCC 7 файл libasan_preinit.o
не содержит ссылок на __asan_init_v1
, как видно на
ноутбук, над которым я сейчас работаю:
$ nm /usr/lib/gcc/x86_64-linux-gnu/7/libasan_preinit.o
U __asan_init
0000000000000000 D __local_asan_preinit
Он вызывает __asan_init
, что действительно определено в libasan
цепочки инструментов:
$ nm -D /usr/lib/gcc/x86_64-linux-gnu/7/libasan.so | grep __asan_init
00000000000ecdb0 T __asan_init
С другой стороны, в GCC 4.8.5 libasan
сделал не определил функцию __asan_init
и сделал определить __asan_init_v1
:
:~/Downloads/gcc-4.8.5$ grep -r '__asan_init_v'
gcc/ChangeLog: * sanitizer.def: Rename __asan_init to __asan_init_v1.
gcc/sanitizer.def:DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_INIT, "__asan_init_v1",
libsanitizer/asan/asan_interface_internal.h: void __asan_init_v1() SANITIZER_INTERFACE_ATTRIBUTE;
libsanitizer/asan/asan_interface_internal.h: #define __asan_init __asan_init_v1
Там, __asan_init
был просто внутренний #define
, который совмещал действительную функцию __asan_init_v1
, как
за libsanitizer/asan/asan_interface_internal.h
, но в этот файл в GCC 7
// This function should be called at the very beginning of the process,
// before any instrumented code is executed and before any call to malloc.
SANITIZER_INTERFACE_ATTRIBUTE void __asan_init();
это реальная функция, как сообщает nm
.
Таким образом, основа доказательства состоит в том, что вы связываетесь с libasan
GCC 7.3.1.
но также связывание кода инициализации библиотеки GCC 4.8.5. У меня нет видимости
как вы попали в эту версию GCC - насколько я знаю, может быть ошибкой упаковки - но
вам нужно будет исправить это, чтобы устранить эти ошибки связи.