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=:
       ;;

Attachment: signature.asc
Description: Digital signature

Reply via email to