http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55909
Bug #: 55909 Summary: libtool test exposes what I think is some alignment issue in libstd++ Classification: Unclassified Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: philip.copel...@oracle.com Created attachment 29107 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29107 Original libtool cpp file While debugging libtool breakage on sparc64 (64bit Big Endian) gcc-4.7.2-8.fc18.sparc64 glibc-2.16-28.fc18.sparc64 [mockbuild@localhost 104]$ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/sparc64-redhat-linux/4.7.2/lto-wrapper Target: sparc64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --disable-build-with-cxx --disable-build-poststage1-with-cxx --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,lto --enable-plugin --enable-initfini-array --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-long-double-128 --with-cpu=ultrasparc --disable-multilib --build=sparc64-redhat-linux Thread model: posix gcc version 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC) ------------------------------------------------------------------------------- ++ at_fn_check_prepare_dynamic 'if /builddir/build/BUILD/libtool-2.4.2/libtool --mode=execute -dlopen m/module.la "./main" ; then :; else lt_status=0; test "Xsparc64-redhat-linux-gnu" != "Xsparc64-redhat-linux-gnu" && test -x "./main" && exit 77; exit ; fi' exceptions.at:385 ++ case $1 in ++ at_fn_check_prepare_trace exceptions.at:385 ++ printf '%s\n' exceptions.at:385 ++ at_check_trace=: ++ at_check_filter=: ++ : ++ : ++ at_status=139 ++ at_failed=false ++ : ++ echo stderr: stderr: ++ cat /builddir/build/BUILD/libtool-2.4.2/tests/testsuite.dir/at-groups/104/stderr ++ : ++ /builddir/build/BUILD/libtool-2.4.2/libtool --mode=execute -dlopen m/module.la ./main exceptions_in_prog /builddir/build/BUILD/libtool-2.4.2/tests/testsuite.dir/at-groups/104/test-source: line 565: 61893 Segmentation fault (core dumped) $LIBTOOL --mode=execute -dlopen m/module.la "$lt_exe" ++ lt_status=139 ------------------------------------------------------------------------------ This eventually boils down to [mockbuild@localhost 104]$ /builddir/build/BUILD/libtool-2.4.2/libtool --verbose --mode=execute -dlopen m/module.la ./.libs/lt-main exceptions_in_prog Segmentation fault (core dumped) [mockbuild@localhost 104]$ gdb ./.libs/lt-main (gdb) set environment LD_LIBRARY_PATH=m (gdb) run exceptions_in_prog Program received signal SIGSEGV, Segmentation fault. 0xfffff8010061a558 in __frame_dummy_init_array_entry () from /lib64/libstdc++.so.6 (gdb) where #0 0xfffff8010061a558 in __frame_dummy_init_array_entry () from /lib64/libstdc++.so.6 #1 0xfffff80100490988 in __cxxabiv1::__cxa_get_globals () at ../../../../libstdc++-v3/libsupc++/eh_globals.cc:63 #2 0xfffff801004907cc in std::uncaught_exception () at ../../../../libstdc++-v3/libsupc++/eh_catch.cc:136 #3 0xfffff801004ccbe4 in ~sentry (this=0x7fefffff1b0, __in_chrg=<optimized out>) at /usr/src/debug/gcc-4.7.2-20121109/obj-sparc64-redhat-linux/sparc64-redhat-linux/libstdc++-v3/include/ostream:429 #4 std::__ostream_insert<char, std::char_traits<char> > (__out=..., __s=<optimized out>, __n=<optimized out>) at /usr/src/debug/gcc-4.7.2-20121109/obj-sparc64-redhat-linux/sparc64-redhat-linux/libstdc++-v3/include/bits/ostream_insert.h:112 #5 0x000000000010321c in operator<< <std::char_traits<char> > ( __s=0x1085f8 "exceptions_in_prog\n", __out=...) at /usr/lib/gcc/sparc64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ostream:533 #6 exceptions_in_prog () at main.cpp:30 #7 0x0000000000102e78 in main () at main.cpp:120 ------------------------------------------------------------------------------- Lets read that in order with some program text around it that might make some better sense: #7 0x0000000000102e78 in main () at main.cpp:120 (gdb) list 115 int main (void) 116 { 117 118 LTDL_SET_PRELOADED_SYMBOLS(); 119 120 if (exceptions_in_prog ()) 121 return 1; 122 if (exceptions_in_lib ()) 123 return 1; 124 if (exceptions_in_module ()) #6 exceptions_in_prog () at main.cpp:30 (gdb) list 25 return 0; 26 } 27 28 int exceptions_in_prog (void) 29 { 30 std::cerr << "exceptions_in_prog\n"; 31 try { 32 foo (); 33 } 34 catch (exc e) { #5 0x000000000010321c in operator<< <std::char_traits<char> > ( __s=0x1085f8 "exceptions_in_prog\n", __out=...) at /usr/lib/gcc/sparc64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ostream:533 533 __ostream_insert(__out, __s, (gdb) list 528 operator<<(basic_ostream<char, _Traits>& __out, const char* __s) 529 { 530 if (!__s) 531 __out.setstate(ios_base::badbit); 532 else 533 __ostream_insert(__out, __s, 534 static_cast<streamsize>(_Traits::length(__s))); 535 return __out; 536 } 537 (gdb) down #4 std::__ostream_insert<char, std::char_traits<char> > (__out=..., __s=<optimized out>, __n=<optimized out>) at /usr/src/debug/gcc-4.7.2-20121109/obj-sparc64-redhat-linux/sparc64-redhat-linux/libstdc++-v3/include/bits/ostream_insert.h:112 112 return __out; (gdb) list 107 __throw_exception_again; 108 } 109 __catch(...) 110 { __out._M_setstate(__ios_base::badbit); } 111 } 112 return __out; 113 } 114 115 // Inhibit implicit instantiations for required instantiations, 116 // which are defined via explicit instantiations elsewhere. #3 0xfffff801004ccbe4 in ~sentry (this=0x7fefffff1b0, __in_chrg=<optimized out>) at /usr/src/debug/gcc-4.7.2-20121109/obj-sparc64-redhat-linux/sparc64-redhat-linux/libstdc++-v3/include/ostream:429 429 if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception()) (gdb) list 424 * @c flush() on the output stream. 425 */ 426 ~sentry() 427 { 428 // XXX MT 429 if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception()) 430 { 431 // Can't call flush directly or else will get into recursive lock. 432 if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1) 433 _M_os.setstate(ios_base::badbit); #2 0xfffff801004907cc in std::uncaught_exception () at ../../../../libstdc++-v3/libsupc++/eh_catch.cc:136 136 __cxa_eh_globals *globals = __cxa_get_globals (); (gdb) list 131 132 133 bool 134 std::uncaught_exception() throw() 135 { 136 __cxa_eh_globals *globals = __cxa_get_globals (); 137 return globals->uncaughtExceptions != 0; 138 } #1 0xfffff80100490988 in __cxxabiv1::__cxa_get_globals () at ../../../../libstdc++-v3/libsupc++/eh_globals.cc:63 63 { return get_global(); } (gdb) list 58 __cxxabiv1::__cxa_get_globals_fast() _GLIBCXX_NOTHROW 59 { return get_global(); } 60 61 extern "C" __cxa_eh_globals* 62 __cxxabiv1::__cxa_get_globals() _GLIBCXX_NOTHROW 63 { return get_global(); } 64 65 66 #else 67 #0 0xfffff8010061a558 in __frame_dummy_init_array_entry () from /lib64/libstdc++.so.6 (gdb) list 68 // Single-threaded fallback buffer. 69 static __cxa_eh_globals eh_globals; 70 71 #if __GTHREADS 72 73 static void 74 eh_globals_dtor(void* ptr) 75 { 76 if (ptr) 77 { ------------------------------------------------------------------------------- I suspect this may be an endian/alignment bug as the same g++ program will run correctly on an x86_64 system, however my c++ foo is somewhat weak when it comes to the lower levels. The above is about as far as I can debug this.