http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56393



Kostya Serebryany <kcc at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

             Status|UNCONFIRMED                 |ASSIGNED

   Last reconfirmed|                            |2013-02-19

     Ever Confirmed|0                           |1



--- Comment #6 from Kostya Serebryany <kcc at gcc dot gnu.org> 2013-02-19 
18:33:32 UTC ---

The problem also shows up with clang. 

Funny. C++ global init has greater priority than C global init. 



This is the usual place from where __asan_init is called: 



gcc: 

#0  __asan_init_v1 () at ../../../../gcc/libsanitizer/asan/asan_rtl.cc:315

#1  0x0000000000417819 in _GLOBAL__sub_I_00099_1_g ()

#2  0x000000000041788d in __libc_csu_init ()

#3  0x00007ffff761b700 in __libc_start_main 

#4  0x0000000000401ec9 in _start ()



clang: 

#0  __asan_init_v1 () 

#1  0x0000000000419dcd in asan.module_ctor ()

#2  0x0000000000419e8d in __libc_csu_init ()

#3  0x00007ffff761b700 in __libc_start_main 

#4  0x0000000000419b15 in _start ()



This is where your test case crashes: 

#0  0x000000000041a864 in boost::exception_ptr

boost::get_static_exception_object<boost::bad_alloc_>() ()

#1  0x00007ffff7ff62c9 in __cxx_global_var_init () from ./libhoge.so

#2  0x00007ffff7ff62f9 in global constructors keyed to a () from ./libhoge.so

#3  0x00007ffff7de9306 in call_init 

#4  0x00007ffff7de93df in call_init 

#5  _dl_init 

#6  0x00007ffff7ddb6ea in _dl_start_user



Apparently, _dl_start_user starts before _start. 



In fact, I think that we saw something like this before and this is why 

in one of our settings we run __asan_init from the preinit array. I.e. from

here: 



#0  __asan_init_v1 () at 

#1  0x00007ffff7de943e in _dl_init

#2  0x00007ffff7ddb6ea in _dl_start_user () from /lib64/ld-linux-x86-64.so.2



Looks like it's time to enable the preinit hack by default on linux, it's

pretty stable now.

Thoughts? 



You may temporary change "defined(ASAN_USE_PREINIT_ARRAY)" to '1' in

asan_rtl.cc,

or add something like this into your code: 

  __attribute__((section(".preinit_array")))

    typeof(__asan_init) *__asan_preinit =__asan_init;

Reply via email to