Hi, I tracked down an issue on Solaris/OpenSolaris/OpenIndiana where C++ libraries built by libtool would cause abort/traps when an exception was being thrown.
The underlying cause is that the C-library was linked before libgcc, leading to the C-library generating the abort before libgcc could do what it was supposed to do. I only observed this problem on x86-based Solaris, not on Sparc. The reason for this follows from what GCC does to link an object. It specifies by default -lgcc -lc -lgcc, however on Sparc systems (unrelated to Solaris) it adds another -lc because libgcc might need the C-library in turn. [1] Libtool apparently figures out what libs to link to by watching what the compiler does. It applies duplicate elimination on the result of that (don't know why) causing -lgcc_s -lc -lgcc_s to be turned into -lc -lgcc_s. As result, the library aborts on Solaris when it throws an exception because -lc comes before -lgcc_s. On Sparc, the result is -lgcc_s -lc, probably because both were double. I'm not sure this can be properly fixed by making sure -lgcc_s -lc remains, since GCC purposely emits the same library multiple times, so I decided to just disable the duplicate elimination for Solaris. [1] http://gcc.gnu.org/ml/gcc-patches/2002-04/msg00176.html -- Fabian Groffen Gentoo on a different level
On Solaris, catch code for C++ exceptions is in libgcc_s. The libc has default catch code as well, that does an abort. GCC by default emits on purpose -lgcc_s -lc -lgcc_s. libtool's de-duplication magic turns this into -lc -lgcc_s, which unsurprisingly is the wrong order, since exceptions will be seen by libc first. Disable de-duplication for this reason, such that we can have working C++ libtool built libraries. --- libltdl/config/ltmain.m4sh +++ libltdl/config/ltmain.m4sh @@ -398,7 +398,7 @@ test "$opt_debug" = : || func_append preserve_args " --debug" case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; --- libltdl/config/ltmain.sh +++ libltdl/config/ltmain.sh @@ -1180,7 +1180,7 @@ test "$opt_debug" = : || func_append preserve_args " --debug" case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;;
signature.asc
Description: Digital signature