Я пытаюсь заставить ASAN работать с одной программой, но все, что я делал, приводило к ASAN:DEADLYSIGNAL
, поэтому я попытался сузить круг и настроить небольшую тестовую программу всего с несколькими параметрами компилятора, просто чтобы посмотреть, будет ли она работать вообще:
$ cat > test.c <<EOF
int main(void) { return 0; }
EOF
Вот командная строка:
$ gcc -g -O0 -fno-omit-frame-pointer -fsanitize=address test.c && ./a.out
ASAN:DEADLYSIGNAL
=================================================================
==5711==ERROR: AddressSanitizer: SEGV on unknown address 0xb7f11e70 (pc 0xb7f11e84 bp 0xb7ab6320 sp 0xbf92368c T16777215)
==5711==The signal is caused by a WRITE memory access.
#0 0xb7f11e83 in _dl_get_tls_static_info (/lib/ld-linux.so.2+0x11e83)
#1 0xb7a24ff9 (/usr/lib/i386-linux-gnu/libasan.so.4+0x101ff9)
#2 0xb7a10f15 (/usr/lib/i386-linux-gnu/libasan.so.4+0xedf15)
#3 0xb7f0f91a (/lib/ld-linux.so.2+0xf91a)
#4 0xb7f00cb9 (/lib/ld-linux.so.2+0xcb9)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/lib/ld-linux.so.2+0x11e83) in _dl_get_tls_static_info
==5711==ABORTING
(Та же ошибка, что и для «настоящей» программы.)
С -static-libasan
трассировка стека немного более наглядна:
$ gcc -g -O0 -fno-omit-frame-pointer -fsanitize=address -static-libasan test.c && ./a.out
ASAN:DEADLYSIGNAL
=================================================================
==5719==ERROR: AddressSanitizer: SEGV on unknown address 0xb7fc6e70 (pc 0xb7fc6e84 bp 0x005f91a0 sp 0xbfe77c2c T16777215)
==5719==The signal is caused by a WRITE memory access.
#0 0xb7fc6e83 in _dl_get_tls_static_info (/lib/ld-linux.so.2+0x11e83)
#1 0x560a49 in __sanitizer::InitTlsSize() (/home/gkirilov/test/a.out+0xe9a49)
#2 0x552e05 in __asan::AsanInitInternal() (/home/gkirilov/test/a.out+0xdbe05)
#3 0xb7fc491a (/lib/ld-linux.so.2+0xf91a)
#4 0xb7fb5cb9 (/lib/ld-linux.so.2+0xcb9)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/lib/ld-linux.so.2+0x11e83) in _dl_get_tls_static_info
==5719==ABORTING
Вот некоторые подробности о системе:
$ uname -a
Linux drinkpad 4.14.0-3-686-pae #1 SMP Debian 4.14.17-1 (2018-02-14) i686 GNU/Linux
$ gcc --version
gcc (Debian 7.3.0-11) 7.3.0
$ /lib/i386-linux-gnu/libc-2.27.so
Compiled by GNU CC version 7.3.0.
libc ABIs: UNIQUE IFUNC
Я также попробовал clang-6
и gcc-8
(с ASAN v5), опять же, со статическим и общим либасаном, и получил те же сообщения.
Моя платформа не поддерживается? Но затем я установил все инструменты из официальных репозиториев Debian.
На домашней странице ASAN указано, что он был протестирован только на 64-битной Ubuntu, но я думаю, что он устарел, так как в таблице выше перечислены как Linux x86, так и x86_64.
Я что-то не так делаю или моя платформа не поддерживается?