https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85924
Bug ID: 85924 Summary: [6 Regression] ASAN: segfault in __interceptor_clock_gettime ( because 'asan_linux.o' for libasan.a built with -DPIC ) Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: sanitizer Assignee: unassigned at gcc dot gnu.org Reporter: jason.vas.dias at gmail dot com CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org, jakub at gcc dot gnu.org, kcc at gcc dot gnu.org, marxin at gcc dot gnu.org Target Milestone: --- This is a re-occurence of bug #59063, as tested by gcc/testsuite/c-c++-common/asan/pr59063-2.c , which fails for builds of gcc-6-branch r260671 . Problem: on an up-to-date RHEL-7.5 x86_64 system (SL) , where libtool resolves to /usr/bin/libtool (v2.4.2), after building in GCC_SRC='.' & running 'make check' : $ cd x86_64-linux-gnu # default $OBJDIR $ cd libsanitizer/asan $ rm -f asan_linux.o $ make asan_linux.o 2>&1 | tee make_asan_linux.build.log /home/devel/OS/gcc-6-branch/host-x86_64-linux-gnu/gcc/xgcc -shared-libgcc -B/home/devel/OS/gcc-6-branch/host-x86_64-linux-gnu/gcc -nostdinc++ -L/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libstdc++-v3/src -L/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libstdc++-v3/src/.libs -L/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libstdc++-v3/libsupc++/.libs -B/usr/local/x86_64-linux-gnu/bin/ -B/usr/local/x86_64-linux-gnu/lib/ -isystem /usr/local/x86_64-linux-gnu/include -isystem /usr/local/x86_64-linux-gnu/sys-include -D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -DASAN_HAS_EXCEPTIONS=1 -DASAN_NEEDS_SEGV=1 -DCAN_SANITIZE_UB=0 -D_OBSTACK_SIZE_T="SIZE_T" -I. -I../../.././libsanitizer/asan -I.. -I ../../.././libsanitizer/include -I ../../.././libsanitizer -Wall -W -Wno-unused-parameter -Wwrite-strings -pedantic -Wno-long-long \ -fPIC \ # ^^^^^ OUCH! causes infinite recursion and core dump in # __interception::sigaction -no-builtin -fno-exceptions -fno-rtti -fomit-frame-pointer -funwind-tables -fvisibility=hidden -Wno-variadic-macros -fno-ipa-icf -I../../libstdc++-v3/include -I../../libstdc++-v3/include/x86_64-linux-gnu -I../../.././libsanitizer/../libstdc++-v3/libsupc++ -std=gnu++11 -g -O2 -D_GNU_SOURCE -MT asan_linux.o -MD -MP -MF .deps/asan_linux.Tpo -c -o asan_linux.o ../../.././libsanitizer/asan/asan_linux.cc mv -f .deps/asan_linux.Tpo .deps/asan_linux.Po (Same happens for './asan_rtl.o') . For some reason, for only the gcc-6-branch (NOT the gcc-{4,5,7}-branches, libtool 2.4.2 is appending '-fPIC' to the compile options for ./asan_linux.o ( which is meant ONLY to be included in the static .libs/libasan.a ; .libs/asan_linux.o is always correctly compiled with '-fPIC -DPIC' , and is destined for inclusion in .libs/libasan.so.* ). Unfortunately, setting -fPIC does make 'PIC' defined() . So the __asan_init method thinks it is in a SHARED LIBRARY, and invokes : dlsym(RTLD_NEXT,'sigaction'); but since the default load module now interposes its '__interception::sigaction' , (which is called by REAL(sigaction)) , __interception::sigaction , which dereferences that dlsym return value, calls itself in an infinite loop until the process runs out of stack and coredumps . I cannot understand why the build scripts or libtool should be appending -fPIC here - they do not in gcc-{4,5,7}-branches .