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 .

Reply via email to