Package: libtool Version: 1.5.22-4 After changing my OS from fedora core 5 to debian testing, one of my projects started to dump core. I tracked down the reason for it, and it turned out that during linking one library was suddenly put way more to the front (to the left).
That this can be blamed to debian's libtool version has been verified by changing ONLY the 'libtool' file installed in the srcdir of the application: With debians libtool, I get: ~/projects/edragon/edragon-objdir/src>grep '^VERSION' ../libtool VERSION="1.5.22 Debian 1.5.22-4" ~/projects/edragon/edragon-objdir/src>rm edragon ~/projects/edragon/edragon-objdir/src>make Making all in include make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/include' make all-recursive make[2]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/include' Making all in IniFile make[3]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/include/IniFile' make[3]: Nothing to be done for `all'. make[3]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/include/IniFile' make[3]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/include' make[3]: Nothing to be done for `all-am'. make[3]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/include' make[2]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/include' make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/include' Making all in utils make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/utils' make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/utils' Making all in gui make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/gui' Making all in include make[2]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/gui/include' make[2]: Nothing to be done for `all'. make[2]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/gui/include' make[2]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/gui' make[2]: Nothing to be done for `all-am'. make[2]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/gui' make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/gui' Making all in . make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src' /bin/sh ../libtool --tag=CXX --mode=link g++ -g -DCWDEBUG -I/usr/local/install/4.1.2-20060901/include -W -Wall -Wundef -DDEBUG -I"/usr/include/boost-1_33_1" -export-dynamic -o edragon -export-dynamic -no-undefined -Wl,--whole-archive,utils/.libs/libutils.a,--no-whole-archive edragon-Application.o edragon-GUI_interface.o edragon-IniFile.o edragon-PathList.o edragon-PluginFile.o edragon-PluginsManager.o edragon-RCFile.o edragon-Runtime.o edragon-XMLFile.o edragon-testsuite_hooks.o ../libltdl/libltdlc.la -L/usr/local/install/4.1.2-20060901/lib -lcwd -lboost_filesystem-gcc-d-1_33_1 -L/usr/local/install/4.1.2-20060901/lib -lcairo -L/usr/local/install/4.1.2-20060901/lib -lglib-2.0 -L/usr/local/install/4.1.2-20060901/lib -lxmlwrapp -lxsltwrapp -lxslt -lxml2 -L/usr/local/install/4.1.2-20060901/lib -lcw g++ -g -DCWDEBUG -I/usr/local/install/4.1.2-20060901/include -W -Wall -Wundef -DDEBUG -I/usr/include/boost-1_33_1 -o edragon -Wl,--whole-archive -Wl,utils/.libs/libutils.a -Wl,--no-whole-archive edragon-Application.o edragon-GUI_interface.o edragon-IniFile.o edragon-PathList.o edragon-PluginFile.o edragon-PluginsManager.o edragon-RCFile.o edragon-Runtime.o edragon-XMLFile.o edragon-testsuite_hooks.o -Wl,--export-dynamic ../libltdl/.libs/libltdlc.a -ldl -L/usr/local/install/4.1.2-20060901/lib /usr/local/install/4.1.2-20060901/lib/libcwd.so -lboost_filesystem-gcc-d-1_33_1 /usr/local/install/4.1.2-20060901/lib/libcairo.so /usr/local/install/4.1.2-20060901/lib/libglib-2.0.so /usr/local/install/4.1.2-20060901/lib/libxmlwrapp.so /usr/local/install/4.1.2-20060901/lib/libxsltwrapp.so /usr/lib/libxslt.so /usr/lib/libxml2.so /usr/local/install/4.1.2-20060901/lib/libcw.so -Wl,--rpath -Wl,/usr/local/install/4.1.2-20060901/lib -Wl,--rpath -Wl,/usr/local/install/4.1.2-20060901/lib make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src' Making all in plugins make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/plugins' make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/plugins' Making all in testsuite make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/testsuite' make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/testsuite' The problem here is that -ldl appears before /usr/local/install/4.1.2-20060901/lib/libcwd.so Using the original libtool, this does not happen: ~/projects/edragon/edragon-objdir/src>cp -p ../libtool.nondeb ../libtool ~/projects/edragon/edragon-objdir/src>grep '^VERSION' ../libtool VERSION=1.5.22 ~/projects/edragon/edragon-objdir/src>rm edragon ~/projects/edragon/edragon-objdir/src>make Making all in include make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/include' make all-recursive make[2]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/include' Making all in IniFile make[3]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/include/IniFile' make[3]: Nothing to be done for `all'. make[3]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/include/IniFile' make[3]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/include' make[3]: Nothing to be done for `all-am'. make[3]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/include' make[2]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/include' make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/include' Making all in utils make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/utils' make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/utils' Making all in gui make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/gui' Making all in include make[2]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/gui/include' make[2]: Nothing to be done for `all'. make[2]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/gui/include' make[2]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/gui' make[2]: Nothing to be done for `all-am'. make[2]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/gui' make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/gui' Making all in . make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src' /bin/sh ../libtool --tag=CXX --mode=link g++ -g -DCWDEBUG -I/usr/local/install/4.1.2-20060901/include -W -Wall -Wundef -DDEBUG -I"/usr/include/boost-1_33_1" -export-dynamic -o edragon -export-dynamic -no-undefined -Wl,--whole-archive,utils/.libs/libutils.a,--no-whole-archive edragon-Application.o edragon-GUI_interface.o edragon-IniFile.o edragon-PathList.o edragon-PluginFile.o edragon-PluginsManager.o edragon-RCFile.o edragon-Runtime.o edragon-XMLFile.o edragon-testsuite_hooks.o ../libltdl/libltdlc.la -L/usr/local/install/4.1.2-20060901/lib -lcwd -lboost_filesystem-gcc-d-1_33_1 -L/usr/local/install/4.1.2-20060901/lib -lcairo -L/usr/local/install/4.1.2-20060901/lib -lglib-2.0 -L/usr/local/install/4.1.2-20060901/lib -lxmlwrapp -lxsltwrapp -lxslt -lxml2 -L/usr/local/install/4.1.2-20060901/lib -lcw g++ -g -DCWDEBUG -I/usr/local/install/4.1.2-20060901/include -W -Wall -Wundef -DDEBUG -I/usr/include/boost-1_33_1 -o edragon -Wl,--whole-archive -Wl,utils/.libs/libutils.a -Wl,--no-whole-archive edragon-Application.o edragon-GUI_interface.o edragon-IniFile.o edragon-PathList.o edragon-PluginFile.o edragon-PluginsManager.o edragon-RCFile.o edragon-Runtime.o edragon-XMLFile.o edragon-testsuite_hooks.o -Wl,--export-dynamic ../libltdl/.libs/libltdlc.a -L/usr/local/install/4.1.2-20060901/lib -lboost_filesystem-gcc-d-1_33_1 /usr/local/install/4.1.2-20060901/lib/libcairo.so -lSM -lICE -lXrender -lX11 -lpng12 /usr/lib/libfreetype.so -lz -lfontconfig /usr/local/install/4.1.2-20060901/lib/libglib-2.0.so -L/usr/lib /usr/local/install/4.1.2-20060901/lib/libxsltwrapp.so /usr/local/install/4.1.2-20060901/lib/libxmlwrapp.so /usr/lib/libexslt.so /usr/lib/libxslt.so -lm /usr/lib/libxml2.so /usr/local/install/4.1.2-20060901/lib/libcw.so /usr/local/install/4.1.2-20060901/lib/libcwd.so -ldl -Wl,--rpath -Wl,/usr/local/install/4.1.2-20060901/lib -Wl,--rpath -Wl,/usr/local/install/4.1.2-20060901/lib make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src' Making all in plugins make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/plugins' make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/plugins' Making all in testsuite make[1]: Entering directory `/home/carlo/projects/edragon/edragon-objdir/src/testsuite' make[1]: Leaving directory `/home/carlo/projects/edragon/edragon-objdir/src/testsuite' As you can see, now -ldl appears directly BEHIND libcwd.so. That this is correct is because libcwd also depends on -ldl. Note that the exact reason for the coredump (although I think it is not relevant for this bug report) is that libcwd defines an dlopen/dlclose of it's own and calls dlsym(RTLD_NEXT, "dlopen") to get the real dlopen. This doesn't work anymore when -ldl is specified first. The reason that with debian's version of libtool the -ldl is put infront of libcwd.so at all, is because ../libltdl/libltdlc.la depends on it. The contents of ../libltdl/libltdlc.la is: --------------------------------------------------------------------------------- # libltdlc.la - a libtool library file # Generated by ltmain.sh - GNU libtool 1.5.22 Debian 1.5.22-4 (1.1220.2.365 2005/12/18 22:14:06) # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='' # Names of this library. library_names='' # The name of the static archive. old_library='libltdlc.a' # Libraries that this one depends upon. dependency_libs=' -ldl' # Version information for libltdlc. current= age= revision= # Is this an already installed library? installed=no # Should we warn about portability when linking against -modules? shouldnotlink=no # Files to dlopen/dlpreopen dlopen='' dlpreopen='' # Directory that this library needs to be installed in: libdir='' --------------------------------------------------------------------------------- Note I use this same file in both cases, yet the original libtool puts the -ldl behind libcwd, because also libcwd depends on it. Being passed "-L/usr/local/install/4.1.2-20060901/lib -lcwd" it should be able to find /usr/local/install/4.1.2-20060901/lib/libcwd.la which has these contents: --------------------------------------------------------------------------------- # libcwd.la - a libtool library file # Generated by ltmain.sh - GNU libtool 1.5.22 Debian 1.5.22-4 (1.1220.2.365 2005/12/18 22:14:06) # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='libcwd.so.0' # Names of this library. library_names='libcwd.so.0.99.45 libcwd.so.0 libcwd.so' # The name of the static archive. old_library='' # Libraries that this one depends upon. dependency_libs=' -ldl' # Version information for libcwd. current=99 age=99 revision=45 # Is this an already installed library? installed=yes # Should we warn about portability when linking against -modules? shouldnotlink=no # Files to dlopen/dlpreopen dlopen='' dlpreopen='' # Directory that this library needs to be installed in: libdir='/usr/local/install/4.1.2-20060901/lib' --------------------------------------------------------------------------------- So, basically - the bug is this: Assume we have three libraries, the order in which they are linked is important. Library x depends on z, and library y depends on z. The order in which they need to be linked is therefore: -lx -ly -lz, or -ly -lx -lz. Passing just -lx -ly to libtool should figure out that both depend on -lz and add that BEHIND both. libtool 1.5.22 gets this correct, debian's version does not. Note that passing -ly -lz -lx -lz also won't work. -- Carlo Wood <[EMAIL PROTECTED]>