Autoconf, Automake, and Libtool: libltdl Dependent Libraries

| ### 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.

This document was generated by Gary V. Vaughan on May, 24 2001 using texi2html