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]>

Reply via email to