|
18.2.4 Dependent Libraries
On modern Unices(42), the shared library architecture
is smart enough to encode all of the other libraries that a dynamic
module depends on as part of the format of the file which is that
module. On these architectures, when you lt_dlopen a module, if
any shared libraries it depends on are not already loaded into the main
application, the system runtime loader will ensure that they too are
loaded so that all of the module's symbols are satisfied.
Less well endowed systems(43), cannot do this by themselves. Since Libtool release 1.4,
libltdl uses the record of inter-library dependencies in the
libtool pseudo-library (see section 10. Introducing GNU Libtool) to manually
load dependent libraries as part of the lt_dlopen call.
An example of the sort of difficulties that can arise from trying to
load a module that has a complex library dependency chain is typified by a
problem I encountered with GNU Guile a few years ago: Earlier
releases of the libXt Athena widget wrapper library for GNU Guile
failed to load on my a.out based GNU/Linux system. When I tried to
load the module into a running Guile interpreter, it couldn't resolve
any of the symbols that referred to libXt. I soon discovered that the
libraries that the module depended upon were not loaded by virtue of
loading the module itself. I needed to build the interpreter itself
with libXt and rely on back-linking to resolve the `Xt' references
when I loaded the module. This pretty much defeated the whole point of
having the wrapper library as a module. Had Libtool been around in
those days, it would have been able to load libXt as part of the process
of loading the module.
If you program with the X window system, you will know that the list of
libraries you need to link into your applications soon grows to be very
large. Worse, if you want to load an X extension module into a non-X
aware application, you will encounter the problems I found with Guile,
unless you link your module with libtool and dynamically load
it with libltdl. At the moment, the various X Window libraries
are not built with libtool, so you must be sure to list all of the
dependencies when you link a module. By doing this, Libtool can use the
list to check that all of the libraries required by a module are loaded
correctly as part of the call to lt_dlopen , like this:
|
$ libtool --mode=link gcc -o module.so -module -avoid-version \
source.c -L/usr/X11R6/lib -lXt -lX11
...
$ file .libs/module.so
.libs/module.so: ELF 32-bit LSB shared object, Intel 80386,
version 1, not stripped
$ ldd .libs/module.so
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4012f00)
libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x4014500)
|
Or, if you are using Automake:
|
...
lib_LTLIBRARIES = module.la
module_la_SOURCES = source.c
module_la_LDFLAGS = -module -avoid-version -L$(X11LIBDIR)
module_la_LIBADD = -lXt -lX11
...
|
It is especially important to be aware of this if you develop on a
modern platform which correctly handles these dependencies natively (as
in the example above), since the code may still work on your machine
even if you don't correctly note all of the dependencies. It will only
break if someone tries to use it on a machine that needs Libtool's help
for it to work, thus reducing the portability of your project.
|