| \input texinfo @c -*-texinfo-*- |
| @c %**start of header |
| @setfilename libtool.info |
| @settitle Libtool |
| @c For double-sided printing, uncomment: |
| @c @setchapternewpage odd |
| @c %**end of header |
| |
| @include version.texi |
| @set BUGADDR the libtool bug reporting address @email{bug-libtool@@gnu.org} |
| @set MAILLIST the libtool mailing list @email{libtool@@gnu.org} |
| @set objdir .libs |
| |
| @dircategory GNU programming tools |
| @direntry |
| * Libtool: (libtool). Generic shared library support script. |
| @end direntry |
| |
| @dircategory Individual utilities |
| @direntry |
| * libtoolize: (libtool)Invoking libtoolize. Adding libtool support. |
| @end direntry |
| |
| @ifinfo |
| This file documents GNU Libtool @value{VERSION} |
| |
| Copyright (C) 1996-2000 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.1 |
| or any later version published by the Free Software Foundation; |
| with the no Invariant Sections, with no Front-Cover Texts, |
| and with no Back-Cover Texts. A copy of the license is included in |
| the section entitled "GNU Free Documentation License". |
| |
| @ignore |
| Permission is granted to process this file through TeX and print the |
| results, provided the printed document carries copying permission notice |
| identical to this one except for the removal of this paragraph |
| |
| @end ignore |
| @end ifinfo |
| |
| @titlepage |
| @title GNU Libtool |
| @subtitle For version @value{VERSION}, @value{UPDATED} |
| @author Gordon Matzigkeit |
| @author Alexandre Oliva |
| @author Thomas Tanner |
| @author Gary V. Vaughan |
| |
| @page |
| @vskip 0pt plus 1filll |
| Copyright @copyright{} 1996-2000 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.1 |
| or any later version published by the Free Software Foundation; |
| with the no Invariant Sections, with no Front-Cover Texts, |
| and with no Back-Cover Texts. A copy of the license is included in |
| the section entitled "GNU Free Documentation License". |
| |
| @end titlepage |
| |
| @c Put everything in one index (arbitrarily chosen to be the concept index). |
| @syncodeindex vr cp |
| @syncodeindex fn cp |
| @syncodeindex tp cp |
| @synindex pg cp |
| |
| @ifinfo |
| @node Top, Introduction, (dir), (dir) |
| @comment node-name, next, previous, up |
| @top Shared library support for GNU |
| |
| This file documents GNU Libtool, a script that allows package developers |
| to provide generic shared library support. This edition documents |
| version @value{VERSION}. |
| |
| @xref{Reporting bugs}, for information on how to report problems with |
| libtool. |
| |
| @menu |
| * Introduction:: What the heck is libtool? |
| * Libtool paradigm:: How libtool's view of libraries is different. |
| * Using libtool:: Example of using libtool to build libraries. |
| * Invoking libtool:: Running the @code{libtool} script. |
| * Integrating libtool:: Using libtool in your own packages. |
| * Versioning:: Using library interface versions. |
| * Library tips:: Tips for library interface design. |
| * Inter-library dependencies:: Libraries that depend on other libraries. |
| * Dlopened modules:: @code{dlopen}ing libtool-created libraries. |
| * Using libltdl:: Libtool's portable @code{dlopen} wrapper library. |
| * Other languages:: Using libtool without a C compiler. |
| * Troubleshooting:: When libtool doesn't work as advertised. |
| * Maintaining:: Information used by the libtool maintainer. |
| * GNU Free Documentation License:: License for this manual. |
| * Index:: Full index. |
| |
| @detailmenu --- The Detailed Node Listing --- |
| |
| Introduction |
| |
| * Motivation:: Why does GNU need a libtool? |
| * Issues:: The problems that need to be addressed. |
| * Other implementations:: How other people have solved these issues. |
| * Postmortem:: Learning from past difficulties. |
| |
| Using libtool |
| |
| * Creating object files:: Compiling object files for libraries. |
| * Linking libraries:: Creating libraries from object files. |
| * Linking executables:: Linking object files against libtool libraries. |
| * Debugging executables:: Running GDB on libtool-generated programs. |
| * Installing libraries:: Making libraries available to users. |
| * Installing executables:: Making programs available to users. |
| * Static libraries:: When shared libraries are not wanted. |
| |
| Invoking @code{libtool} |
| |
| * Compile mode:: Creating library object files. |
| * Link mode:: Generating executables and libraries. |
| * Execute mode:: Debugging libtool-generated programs. |
| * Install mode:: Making libraries and executables public. |
| * Finish mode:: Completing a library installation. |
| * Uninstall mode:: Removing installed executables and libraries. |
| * Clean mode:: Removing uninstalled executables and libraries. |
| |
| Integrating libtool with your package |
| |
| * Makefile rules:: Writing @file{Makefile} rules for libtool. |
| * Using Automake:: Automatically supporting libtool. |
| * Configuring:: Configuring libtool for a host system. |
| * Distributing:: What files to distribute with your package. |
| * Static-only libraries:: Sometimes shared libraries are just a pain. |
| |
| Configuring libtool |
| |
| * AC_PROG_LIBTOOL:: Configuring @code{libtool} in @file{configure.in}. |
| |
| Including libtool in your package |
| |
| * Invoking libtoolize:: @code{libtoolize} command line options. |
| * Autoconf .o macros:: Autoconf macros that set object file names. |
| |
| Library interface versions |
| |
| * Interfaces:: What are library interfaces? |
| * Libtool versioning:: Libtool's versioning system. |
| * Updating version info:: Changing version information before releases. |
| * Release numbers:: Breaking binary compatibility for aesthetics. |
| |
| Tips for interface design |
| |
| * C header files:: How to write portable include files. |
| |
| Dlopened modules |
| |
| * Building modules:: Creating dlopenable objects and libraries. |
| * Dlpreopening:: Dlopening that works on static platforms. |
| * Finding the dlname:: Choosing the right file to @code{dlopen}. |
| * Dlopen issues:: Unresolved problems that need your attention. |
| |
| Using libltdl |
| |
| * Libltdl interface:: How to use libltdl in your programs. |
| * Modules for libltdl:: Creating modules that can be @code{dlopen}ed. |
| * Thread Saftey in libltdl:: Registering callbacks for multi-thread safety. |
| * User defined module data:: Associating data with loaded modules. |
| * Module loaders for libltdl:: Creating user defined module loaders. |
| * Distributing libltdl:: How to distribute libltdl with your package. |
| |
| Using libtool with other languages |
| |
| * C++ libraries:: |
| |
| Troubleshooting |
| |
| * Libtool test suite:: Libtool's self-tests. |
| * Reporting bugs:: How to report problems with libtool. |
| |
| The libtool test suite |
| |
| * Test descriptions:: The contents of the test suite. |
| * When tests fail:: What to do when a test fails. |
| |
| Maintenance notes for libtool |
| |
| * New ports:: How to port libtool to new systems. |
| * Tested platforms:: When libtool was last tested. |
| * Platform quirks:: Information about different library systems. |
| * libtool script contents:: Configuration information that libtool uses. |
| * Cheap tricks:: Making libtool maintainership easier. |
| |
| Porting libtool to new systems |
| |
| * Information sources:: Where to find relevant documentation |
| * Porting inter-library dependencies:: Implementation details explained |
| |
| Platform quirks |
| |
| * References:: Finding more information. |
| * Compilers:: Creating object files from source files. |
| * Reloadable objects:: Binding object files together. |
| * Multiple dependencies:: Removing duplicate dependant libraries. |
| * Archivers:: Programs that create static archives. |
| |
| @end detailmenu |
| @end menu |
| |
| @end ifinfo |
| |
| @node Introduction |
| @chapter Introduction |
| |
| In the past, if a source code package developer wanted to take advantage |
| of the power of shared libraries, he needed to write custom support code |
| for each platform on which his package ran. He also had to design a |
| configuration interface so that the package installer could choose what sort of |
| libraries were built. |
| |
| GNU Libtool simplifies the developer's job by encapsulating both the |
| platform-specific dependencies, and the user interface, in a single |
| script. GNU Libtool is designed so that the complete functionality of |
| each host type is available via a generic interface, but nasty quirks |
| are hidden from the programmer. |
| |
| GNU Libtool's consistent interface is reassuring@dots{} users don't need |
| to read obscure documentation in order to have their favorite source |
| package build shared libraries. They just run your package |
| @code{configure} script (or equivalent), and libtool does all the dirty |
| work. |
| |
| There are several examples throughout this document. All assume the |
| same environment: we want to build a library, @file{libhello}, in a |
| generic way. |
| |
| @file{libhello} could be a shared library, a static library, or |
| both@dots{} whatever is available on the host system, as long as libtool |
| has been ported to it. |
| |
| This chapter explains the original design philosophy of libtool. Feel |
| free to skip to the next chapter, unless you are interested in history, |
| or want to write code to extend libtool in a consistent way. |
| |
| @menu |
| * Motivation:: Why does GNU need a libtool? |
| * Issues:: The problems that need to be addressed. |
| * Other implementations:: How other people have solved these issues. |
| * Postmortem:: Learning from past difficulties. |
| @end menu |
| |
| @node Motivation |
| @section Motivation for writing libtool |
| |
| @cindex motivation for writing libtool |
| @cindex design philosophy |
| Since early 1995, several different GNU developers have recognized the |
| importance of having shared library support for their packages. The |
| primary motivation for such a change is to encourage modularity and |
| reuse of code (both conceptually and physically) in GNU programs. |
| |
| Such a demand means that the way libraries are built in GNU packages |
| needs to be general, to allow for any library type the package installer |
| might want. The problem is compounded by the absence of a standard |
| procedure for creating shared libraries on different platforms. |
| |
| The following sections outline the major issues facing shared library |
| support in GNU, and how shared library support could be standardized |
| with libtool. |
| |
| @cindex specifications for libtool |
| @cindex libtool specifications |
| The following specifications were used in developing and evaluating this |
| system: |
| |
| @enumerate |
| @item |
| The system must be as elegant as possible. |
| |
| @item |
| The system must be fully integrated with the GNU Autoconf and Automake |
| utilities, so that it will be easy for GNU maintainers to use. However, |
| the system must not require these tools, so that it can be used by |
| non-GNU packages. |
| |
| @item |
| Portability to other (non-GNU) architectures and tools is desirable. |
| @end enumerate |
| |
| @node Issues |
| @section Implementation issues |
| |
| @cindex tricky design issues |
| @cindex design issues |
| The following issues need to be addressed in any reusable shared library |
| system, specifically libtool: |
| |
| @enumerate |
| @item |
| The package installer should be able to control what sort of libraries |
| are built. |
| |
| @item |
| It can be tricky to run dynamically linked programs whose libraries have |
| not yet been installed. @code{LD_LIBRARY_PATH} must be set properly (if |
| it is supported), or programs fail to run. |
| |
| @item |
| The system must operate consistently even on hosts which don't support |
| shared libraries. |
| |
| @item |
| The commands required to build shared libraries may differ wildly from |
| host to host. These need to be determined at configure time in |
| a consistent way. |
| |
| @item |
| It is not always obvious with which suffix a shared library should be |
| installed. This makes it difficult for @file{Makefile} rules, since they |
| generally assume that file names are the same from host to host. |
| |
| @item |
| The system needs a simple library version number abstraction, so that |
| shared libraries can be upgraded in place. The programmer should be |
| informed how to design the interfaces to the library to maximize binary |
| compatibility. |
| |
| @item |
| The install @file{Makefile} target should warn the package installer to set |
| the proper environment variables (@code{LD_LIBRARY_PATH} or equivalent), |
| or run @code{ldconfig}. |
| @end enumerate |
| |
| @node Other implementations |
| @section Other implementations |
| |
| Even before libtool was developed, many free software packages built and |
| installed their own shared libraries. At first, these packages were |
| examined to avoid reinventing existing features. |
| |
| Now it is clear that none of these packages have documented the details |
| of shared library systems that libtool requires. So, other packages |
| have been more or less abandoned as influences. |
| |
| @node Postmortem |
| @section A postmortem analysis of other implementations |
| |
| @cindex other implementations, flaws in |
| @cindex reusability of library systems |
| In all fairness, each of the implementations that were examined do the |
| job that they were intended to do, for a number of different host |
| systems. However, none of these solutions seem to function well as a |
| generalized, reusable component. |
| |
| @cindex complexity of library systems |
| Most were too complex to use (much less modify) without understanding |
| exactly what the implementation does, and they were generally not |
| documented. |
| |
| The main difficulty is that different vendors have different views of |
| what libraries are, and none of the packages which were examined seemed |
| to be confident enough to settle on a single paradigm that just |
| @emph{works}. |
| |
| Ideally, libtool would be a standard that would be implemented as series |
| of extensions and modifications to existing library systems to make them |
| work consistently. However, it is not an easy task to convince |
| operating system developers to mend their evil ways, and people want to |
| build shared libraries right now, even on buggy, broken, confused |
| operating systems. |
| |
| For this reason, libtool was designed as an independent shell script. |
| It isolates the problems and inconsistencies in library building that |
| plague @file{Makefile} writers by wrapping the compiler suite on |
| different platforms with a consistent, powerful interface. |
| |
| With luck, libtool will be useful to and used by the GNU community, and |
| that the lessons that were learned in writing it will be taken up by |
| designers of future library systems. |
| |
| @node Libtool paradigm |
| @chapter The libtool paradigm |
| |
| At first, libtool was designed to support an arbitrary number of library |
| object types. After libtool was ported to more platforms, a new |
| paradigm gradually developed for describing the relationship between |
| libraries and programs. |
| |
| @cindex definition of libraries |
| @cindex libraries, definition of |
| In summary, ``libraries are programs with multiple entry points, and |
| more formally defined interfaces.'' |
| |
| Version 0.7 of libtool was a complete redesign and rewrite of libtool to |
| reflect this new paradigm. So far, it has proved to be successful: |
| libtool is simpler and more useful than before. |
| |
| The best way to introduce the libtool paradigm is to contrast it with |
| the paradigm of existing library systems, with examples from each. It |
| is a new way of thinking, so it may take a little time to absorb, but |
| when you understand it, the world becomes simpler. |
| |
| @node Using libtool |
| @chapter Using libtool |
| |
| @cindex examples of using libtool |
| @cindex libtool examples |
| It makes little sense to talk about using libtool in your own packages |
| until you have seen how it makes your life simpler. The examples in |
| this chapter introduce the main features of libtool by comparing the |
| standard library building procedure to libtool's operation on two |
| different platforms: |
| |
| @table @samp |
| @item a23 |
| An Ultrix 4.2 platform with only static libraries. |
| |
| @item burger |
| A NetBSD/i386 1.2 platform with shared libraries. |
| @end table |
| |
| You can follow these examples on your own platform, using the |
| preconfigured libtool script that was installed with libtool |
| (@pxref{Configuring}). |
| |
| Source files for the following examples are taken from the @file{demo} |
| subdirectory of the libtool distribution. Assume that we are building a |
| library, @file{libhello}, out of the files @file{foo.c} and |
| @file{hello.c}. |
| |
| Note that the @file{foo.c} source file uses the @code{cos} math library |
| function, which is usually found in the standalone math library, and not |
| the C library (@pxref{Trig Functions, , Trigonometric Functions, libc, |
| The GNU C Library Reference Manual}). So, we need to add @kbd{-lm} to |
| the end of the link line whenever we link @file{foo.o} or @file{foo.lo} |
| into an executable or a library (@pxref{Inter-library dependencies}). |
| |
| The same rule applies whenever you use functions that don't appear in |
| the standard C library@dots{} you need to add the appropriate |
| @kbd{-l@var{name}} flag to the end of the link line when you link |
| against those objects. |
| |
| After we have built that library, we want to create a program by linking |
| @file{main.o} against @file{libhello}. |
| |
| @menu |
| * Creating object files:: Compiling object files for libraries. |
| * Linking libraries:: Creating libraries from object files. |
| * Linking executables:: Linking object files against libtool libraries. |
| * Debugging executables:: Running GDB on libtool-generated programs. |
| * Installing libraries:: Making libraries available to users. |
| * Installing executables:: Making programs available to users. |
| * Static libraries:: When shared libraries are not wanted. |
| @end menu |
| |
| @node Creating object files |
| @section Creating object files |
| |
| @cindex compiling object files |
| @cindex object files, compiling |
| To create an object file from a source file, the compiler is invoked |
| with the `-c' flag (and any other desired flags): |
| |
| @example |
| burger$ @kbd{gcc -g -O -c main.c} |
| burger$ |
| @end example |
| |
| The above compiler command produces an object file, @file{main.o}, from |
| the source file @file{main.c}. |
| |
| For most library systems, creating object files that become part of a |
| static library is as simple as creating object files that are linked to |
| form an executable: |
| |
| @example |
| burger$ @kbd{gcc -g -O -c foo.c} |
| burger$ @kbd{gcc -g -O -c hello.c} |
| burger$ |
| @end example |
| |
| @cindex position-independent code |
| @cindex PIC (position-independent code) |
| Shared libraries, however, may only be built from |
| @dfn{position-independent code} (PIC). So, special flags must be passed |
| to the compiler to tell it to generate PIC rather than the standard |
| position-dependent code. |
| |
| @cindex library object file |
| @cindex @samp{.lo} files |
| @cindex object files, library |
| Since this is a library implementation detail, libtool hides the |
| complexity of PIC compiler flags by using separate library object files |
| (which end in @samp{.lo} instead of @samp{.o}). On systems without shared |
| libraries (or without special PIC compiler flags), these library object |
| files are identical to ``standard'' object files. |
| |
| To create library object files for @file{foo.c} and @file{hello.c}, |
| simply invoke libtool with the standard compilation command as |
| arguments (@pxref{Compile mode}): |
| |
| @example |
| a23$ @kbd{libtool gcc -g -O -c foo.c} |
| gcc -g -O -c foo.c |
| echo timestamp > foo.lo |
| a23$ @kbd{libtool gcc -g -O -c hello.c} |
| gcc -g -O -c hello.c |
| echo timestamp > hello.lo |
| a23$ |
| @end example |
| |
| Note that libtool creates two files for each invocation. The @samp{.lo} |
| file is a library object, which may be built into a shared library, and |
| the @samp{.o} file is a standard object file. On @samp{a23}, the |
| library objects are just timestamps, because only static libraries are |
| supported. |
| |
| On shared library systems, libtool automatically inserts the PIC |
| generation flags into the compilation command, so that the library |
| object and the standard object differ: |
| |
| @example |
| burger$ @kbd{libtool gcc -g -O -c foo.c} |
| gcc -g -O -c -fPIC -DPIC foo.c |
| mv -f foo.o foo.lo |
| gcc -g -O -c foo.c >/dev/null 2>&1 |
| burger$ @kbd{libtool gcc -g -O -c hello.c} |
| gcc -g -O -c -fPIC -DPIC hello.c |
| mv -f hello.o hello.lo |
| gcc -g -O -c hello.c >/dev/null 2>&1 |
| burger$ |
| @end example |
| |
| Notice that the second run of GCC has its output discarded. This is |
| done so that compiler warnings aren't annoyingly duplicated. |
| |
| @node Linking libraries |
| @section Linking libraries |
| |
| @pindex ar |
| Without libtool, the programmer would invoke the @code{ar} command to |
| create a static library: |
| |
| @example |
| burger$ @kbd{ar cru libhello.a hello.o foo.o} |
| burger$ |
| @end example |
| |
| @pindex ranlib |
| But of course, that would be too simple, so many systems require that |
| you run the @code{ranlib} command on the resulting library (to give it |
| better karma, or something): |
| |
| @example |
| burger$ @kbd{ranlib libhello.a} |
| burger$ |
| @end example |
| |
| It seems more natural to use the C compiler for this task, given |
| libtool's ``libraries are programs'' approach. So, on platforms without |
| shared libraries, libtool simply acts as a wrapper for the system |
| @code{ar} (and possibly @code{ranlib}) commands. |
| |
| @cindex libtool libraries |
| @cindex @samp{.la} files |
| Again, the libtool library name differs from the standard name (it has a |
| @samp{.la} suffix instead of a @samp{.a} suffix). The arguments to libtool are |
| the same ones you would use to produce an executable named |
| @file{libhello.la} with your compiler (@pxref{Link mode}): |
| |
| @example |
| a23$ @kbd{libtool gcc -g -O -o libhello.la foo.o hello.o} |
| libtool: cannot build libtool library `libhello.la' from non-libtool \ |
| objects |
| a23$ |
| @end example |
| |
| Aha! Libtool caught a common error@dots{} trying to build a library |
| from standard objects instead of library objects. This doesn't matter |
| for static libraries, but on shared library systems, it is of great |
| importance. |
| |
| So, let's try again, this time with the library object files. Remember |
| also that we need to add @kbd{-lm} to the link command line because |
| @file{foo.c} uses the @code{cos} math library function (@pxref{Using |
| libtool}). |
| |
| Another complication in building shared libraries is that we need to |
| specify the path to the directory in which they (eventually) will be |
| installed (in this case, @file{/usr/local/lib})@footnote{If you don't |
| specify an @code{rpath}, then libtool builds a libtool convenience |
| archive, not a shared library (@pxref{Static libraries}).}: |
| |
| @example |
| a23$ @kbd{libtool gcc -g -O -o libhello.la foo.lo hello.lo \ |
| -rpath /usr/local/lib -lm} |
| mkdir @value{objdir} |
| ar cru @value{objdir}/libhello.a foo.o hello.o |
| ranlib @value{objdir}/libhello.a |
| creating libhello.la |
| a23$ |
| @end example |
| |
| Now, let's try the same trick on the shared library platform: |
| |
| @example |
| burger$ @kbd{libtool gcc -g -O -o libhello.la foo.lo hello.lo \ |
| -rpath /usr/local/lib -lm} |
| mkdir @value{objdir} |
| ld -Bshareable -o @value{objdir}/libhello.so.0.0 foo.lo hello.lo -lm |
| ar cru @value{objdir}/libhello.a foo.o hello.o |
| ranlib @value{objdir}/libhello.a |
| creating libhello.la |
| burger$ |
| @end example |
| |
| Now that's significantly cooler@dots{} libtool just ran an obscure |
| @code{ld} command to create a shared library, as well as the static |
| library. |
| |
| @cindex @file{@value{objdir}} subdirectory |
| Note how libtool creates extra files in the @file{@value{objdir}} |
| subdirectory, rather than the current directory. This feature is to |
| make it easier to clean up the build directory, and to help ensure that |
| other programs fail horribly if you accidentally forget to use libtool |
| when you should. |
| |
| @node Linking executables |
| @section Linking executables |
| |
| @cindex linking against installed libraries |
| If you choose at this point to @dfn{install} the library (put it in a |
| permanent location) before linking executables against it, then you |
| don't need to use libtool to do the linking. Simply use the appropriate |
| @samp{-L} and @samp{-l} flags to specify the library's location. |
| |
| @cindex buggy system linkers |
| Some system linkers insist on encoding the full directory name of each |
| shared library in the resulting executable. Libtool has to work around |
| this misfeature by special magic to ensure that only permanent directory |
| names are put into installed executables. |
| |
| @cindex security problems with buggy linkers |
| @cindex bugs, subtle ones caused by buggy linkers |
| The importance of this bug must not be overlooked: it won't cause |
| programs to crash in obvious ways. It creates a security hole, |
| and possibly even worse, if you are modifying the library source code |
| after you have installed the package, you will change the behaviour of |
| the installed programs! |
| |
| So, if you want to link programs against the library before you install |
| it, you must use libtool to do the linking. |
| |
| @cindex linking against uninstalled libraries |
| Here's the old way of linking against an uninstalled library: |
| |
| @example |
| burger$ @kbd{gcc -g -O -o hell.old main.o libhello.a -lm} |
| burger$ |
| @end example |
| |
| Libtool's way is almost the same@footnote{However, you should avoid using |
| @samp{-L} or @samp{-l} flags to link against an uninstalled libtool |
| library. Just specify the relative path to the @samp{.la} file, such as |
| @file{../intl/libintl.la}. This is a design decision to eliminate any |
| ambiguity when linking against uninstalled shared libraries.} |
| (@pxref{Link mode}): |
| |
| @example |
| a23$ @kbd{libtool gcc -g -O -o hell main.o libhello.la -lm} |
| gcc -g -O -o hell main.o ./@value{objdir}/libhello.a -lm |
| a23$ |
| @end example |
| |
| That looks too simple to be true. All libtool did was transform |
| @file{libhello.la} to @file{./@value{objdir}/libhello.a}, but remember |
| that @samp{a23} has no shared libraries. |
| |
| On @samp{burger} the situation is different: |
| |
| @example |
| burger$ @kbd{libtool gcc -g -O -o hell main.o libhello.la -lm} |
| gcc -g -O -o @value{objdir}/hell main.o -L./@value{objdir} -R/usr/local/lib -lhello -lm |
| creating hell |
| burger$ |
| @end example |
| |
| @cindex linking with installed libtool libraries |
| |
| Now assume @file{libhello.la} had already been installed, and you want |
| to link a new program with it. You could figure out where it lives by |
| yourself, then run: |
| |
| @example |
| burger$ @kbd{gcc -g -O -o test test.o -L/usr/local/lib -lhello} |
| @end example |
| |
| However, unless @file{/usr/local/lib} is in the standard library search |
| path, you won't be able to run @code{test}. However, if you use libtool |
| to link the already-installed libtool library, it will do The Right |
| Thing (TM) for you: |
| |
| @example |
| burger$ @kbd{libtool gcc -g -O -o test test.o /usr/local/lib/libhello.la} |
| gcc -g -O -o @value{objdir}/test test.o -Wl,--rpath |
| -Wl,/usr/local/lib /usr/local/lib/libhello.a -lm |
| creating test |
| burger$ |
| @end example |
| |
| Note that libtool added the necessary run-time path flag, as well as |
| @samp{-lm}, the library libhello.la depended upon. Nice, huh? |
| |
| Since libtool created a wrapper script, you should use libtool to |
| install it and debug it too. However, since the program does not depend |
| on any uninstalled libtool library, it is probably usable even without |
| the wrapper script. Libtool could probably be made smarter to avoid the |
| creation of the wrapper script in this case, but this is left as an |
| exercise for the reader. |
| |
| |
| @cindex wrapper scripts for programs |
| @cindex program wrapper scripts |
| Notice that the executable, @code{hell}, was actually created in the |
| @file{@value{objdir}} subdirectory. Then, a wrapper script was created |
| in the current directory. |
| |
| On NetBSD 1.2, libtool encodes the installation directory of |
| @file{libhello}, by using the @samp{-R/usr/local/lib} compiler flag. |
| Then, the wrapper script guarantees that the executable finds the |
| correct shared library (the one in @file{./@value{objdir}}) until it is |
| properly installed. |
| |
| Let's compare the two different programs: |
| |
| @example |
| burger$ @kbd{time ./hell.old} |
| Welcome to GNU Hell! |
| ** This is not GNU Hello. There is no built-in mail reader. ** |
| 0.21 real 0.02 user 0.08 sys |
| burger$ @kbd{time ./hell} |
| Welcome to GNU Hell! |
| ** This is not GNU Hello. There is no built-in mail reader. ** |
| 0.63 real 0.09 user 0.59 sys |
| burger$ |
| @end example |
| |
| The wrapper script takes significantly longer to execute, but at least |
| the results are correct, even though the shared library hasn't been |
| installed yet. |
| |
| So, what about all the space savings that shared libraries are supposed |
| to yield? |
| |
| @example |
| burger$ @kbd{ls -l hell.old libhello.a} |
| -rwxr-xr-x 1 gord gord 15481 Nov 14 12:11 hell.old |
| -rw-r--r-- 1 gord gord 4274 Nov 13 18:02 libhello.a |
| burger$ @kbd{ls -l @value{objdir}/hell @value{objdir}/libhello.*} |
| -rwxr-xr-x 1 gord gord 11647 Nov 14 12:10 @value{objdir}/hell |
| -rw-r--r-- 1 gord gord 4274 Nov 13 18:44 @value{objdir}/libhello.a |
| -rwxr-xr-x 1 gord gord 12205 Nov 13 18:44 @value{objdir}/libhello.so.0.0 |
| burger$ |
| @end example |
| |
| Well, that sucks. Maybe I should just scrap this project and take up |
| basket weaving. |
| |
| Actually, it just proves an important point: shared libraries incur |
| overhead because of their (relative) complexity. In this situation, the |
| price of being dynamic is eight kilobytes, and the payoff is about four |
| kilobytes. So, having a shared @file{libhello} won't be an advantage |
| until we link it against at least a few more programs. |
| |
| @node Debugging executables |
| @section Debugging executables |
| |
| If @file{hell} was a complicated program, you would certainly want to |
| test and debug it before installing it on your system. In the above |
| section, you saw how the libtool wrapper script makes it possible to run |
| the program directly, but unfortunately, this mechanism interferes with |
| the debugger: |
| |
| @example |
| burger$ @kbd{gdb hell} |
| GDB is free software and you are welcome to distribute copies of it |
| under certain conditions; type "show copying" to see the conditions. |
| There is no warranty for GDB; type "show warranty" for details. |
| GDB 4.16 (i386-unknown-netbsd), (C) 1996 Free Software Foundation, Inc. |
| |
| "hell": not in executable format: File format not recognized |
| |
| (gdb) @kbd{quit} |
| burger$ |
| @end example |
| |
| Sad. It doesn't work because GDB doesn't know where the executable |
| lives. So, let's try again, by invoking GDB directly on the executable: |
| |
| @example |
| burger$ @kbd{gdb @value{objdir}/hell} |
| trick:/home/src/libtool/demo$ gdb .libs/hell |
| GDB is free software and you are welcome to distribute copies of it |
| under certain conditions; type "show copying" to see the conditions. |
| There is no warranty for GDB; type "show warranty" for details. |
| GDB 4.16 (i386-unknown-netbsd), (C) 1996 Free Software Foundation, Inc. |
| (gdb) @kbd{break main} |
| Breakpoint 1 at 0x8048547: file main.c, line 29. |
| (gdb) @kbd{run} |
| Starting program: /home/src/libtool/demo/.libs/hell |
| /home/src/libtool/demo/.libs/hell: can't load library 'libhello.so.2' |
| |
| Program exited with code 020. |
| (gdb) @kbd{quit} |
| burger$ |
| @end example |
| |
| Argh. Now GDB complains because it cannot find the shared library that |
| @file{hell} is linked against. So, we must use libtool in order to |
| properly set the library path and run the debugger. Fortunately, we can |
| forget all about the @file{@value{objdir}} directory, and just run it on |
| the executable wrapper (@pxref{Execute mode}): |
| |
| @example |
| burger$ @kbd{libtool gdb hell} |
| GDB is free software and you are welcome to distribute copies of it |
| under certain conditions; type "show copying" to see the conditions. |
| There is no warranty for GDB; type "show warranty" for details. |
| GDB 4.16 (i386-unknown-netbsd), (C) 1996 Free Software Foundation, Inc. |
| (gdb) @kbd{break main} |
| Breakpoint 1 at 0x8048547: file main.c, line 29. |
| (gdb) @kbd{run} |
| Starting program: /home/src/libtool/demo/.libs/hell |
| |
| Breakpoint 1, main (argc=1, argv=0xbffffc40) at main.c:29 |
| 29 printf ("Welcome to GNU Hell!\n"); |
| (gdb) @kbd{quit} |
| The program is running. Quit anyway (and kill it)? (y or n) @kbd{y} |
| burger$ |
| @end example |
| |
| @node Installing libraries |
| @section Installing libraries |
| |
| @pindex strip |
| Installing libraries on a non-libtool system is quite |
| straightforward@dots{} just copy them into place:@footnote{Don't |
| accidentally strip the libraries, though, or they will be unusable.} |
| |
| @pindex su |
| @example |
| burger$ @kbd{su} |
| Password: @kbd{********} |
| burger# @kbd{cp libhello.a /usr/local/lib/libhello.a} |
| burger# |
| @end example |
| |
| Oops, don't forget the @code{ranlib} command: |
| |
| @example |
| burger# @kbd{ranlib /usr/local/lib/libhello.a} |
| burger# |
| @end example |
| |
| @pindex install |
| Libtool installation is quite simple, as well. Just use the |
| @code{install} or @code{cp} command that you normally would |
| (@pxref{Install mode}): |
| |
| @example |
| a23# @kbd{libtool cp libhello.la /usr/local/lib/libhello.la} |
| cp libhello.la /usr/local/lib/libhello.la |
| cp @value{objdir}/libhello.a /usr/local/lib/libhello.a |
| ranlib /usr/local/lib/libhello.a |
| a23# |
| @end example |
| |
| Note that the libtool library @file{libhello.la} is also installed, to |
| help libtool with uninstallation (@pxref{Uninstall mode}) and linking |
| (@pxref{Linking executables}) and to help programs with dlopening |
| (@pxref{Dlopened modules}). |
| |
| Here is the shared library example: |
| |
| @example |
| burger# @kbd{libtool install -c libhello.la /usr/local/lib/libhello.la} |
| install -c @value{objdir}/libhello.so.0.0 /usr/local/lib/libhello.so.0.0 |
| install -c libhello.la /usr/local/lib/libhello.la |
| install -c @value{objdir}/libhello.a /usr/local/lib/libhello.a |
| ranlib /usr/local/lib/libhello.a |
| burger# |
| @end example |
| |
| @cindex stripping libraries |
| @cindex libraries, stripping |
| It is safe to specify the @samp{-s} (strip symbols) flag if you use a |
| BSD-compatible install program when installing libraries. |
| Libtool will either ignore the @samp{-s} flag, or will run a program |
| that will strip only debugging and compiler symbols from the library. |
| |
| Once the libraries have been put in place, there may be some additional |
| configuration that you need to do before using them. First, you must |
| make sure that where the library is installed actually agrees with the |
| @samp{-rpath} flag you used to build it. |
| |
| @cindex postinstallation |
| @cindex installation, finishing |
| @cindex libraries, finishing installation |
| Then, running @samp{libtool -n --finish @var{libdir}} can give you |
| further hints on what to do (@pxref{Finish mode}): |
| |
| @example |
| burger# @kbd{libtool -n --finish /usr/local/lib} |
| PATH="$PATH:/sbin" ldconfig -m /usr/local/lib |
| ----------------------------------------------------------------- |
| Libraries have been installed in: |
| /usr/local/lib |
| |
| To link against installed libraries in a given directory, LIBDIR, |
| you must use the `-LLIBDIR' flag during linking. |
| |
| You will also need to do one of the following: |
| - add LIBDIR to the `LD_LIBRARY_PATH' environment variable |
| during execution |
| - add LIBDIR to the `LD_RUN_PATH' environment variable |
| during linking |
| - use the `-RLIBDIR' linker flag |
| |
| See any operating system documentation about shared libraries for |
| more information, such as the ld and ld.so manual pages. |
| ----------------------------------------------------------------- |
| burger# |
| @end example |
| |
| After you have completed these steps, you can go on to begin using the |
| installed libraries. You may also install any executables that depend |
| on libraries you created. |
| |
| @node Installing executables |
| @section Installing executables |
| |
| If you used libtool to link any executables against uninstalled libtool |
| libraries (@pxref{Linking executables}), you need to use libtool to |
| install the executables after the libraries have been installed |
| (@pxref{Installing libraries}). |
| |
| So, for our Ultrix example, we would run: |
| |
| @example |
| a23# libtool install -c hell /usr/local/bin/hell |
| install -c hell /usr/local/bin/hell |
| a23# |
| @end example |
| |
| On shared library systems, libtool just ignores the wrapper script and |
| installs the correct binary: |
| |
| @example |
| burger# libtool install -c hell /usr/local/bin/hell |
| install -c @value{objdir}/hell /usr/local/bin/hell |
| burger# |
| @end example |
| |
| @node Static libraries |
| @section Linking static libraries |
| |
| @cindex static linking |
| @cindex convenience libraries |
| Why return to @code{ar} and @code{ranlib} silliness when you've had a |
| taste of libtool? Well, sometimes it is desirable to create a static |
| archive that can never be shared. The most frequent case is when you |
| have a set of object files that you use to build several different |
| programs. You can create a ``convenience library'' out of those |
| objects, and link programs with the library, instead of listing all |
| object files for every program. This technique is often used to |
| overcome GNU automake's lack of support for linking object files built |
| from sources in other directories, because it supports linking with |
| libraries from other directories. This limitation applies to GNU |
| automake up to release 1.4; newer releases should support sources in |
| other directories. |
| |
| If you just want to link this convenience library into programs, then |
| you could just ignore libtool entirely, and use the old @code{ar} and |
| @code{ranlib} commands (or the corresponding GNU automake |
| @samp{_LIBRARIES} rules). You can even install a convenience library |
| (but you probably don't want to) using libtool: |
| |
| @example |
| burger$ @kbd{libtool ./install-sh -c libhello.a /local/lib/libhello.a} |
| ./install-sh -c libhello.a /local/lib/libhello.a |
| ranlib /local/lib/libhello.a |
| burger$ |
| @end example |
| |
| Using libtool for static library installation protects your library from |
| being accidentally stripped (if the installer used the @samp{-s} flag), |
| as well as automatically running the correct @code{ranlib} command. |
| |
| But libtool libraries are more than just collections of object files: |
| they can also carry library dependency information, which old archives |
| do not. If you want to create a libtool static convenience library, you |
| can omit the @samp{-rpath} flag and use @samp{-static} to indicate that |
| you're only interested in a static library. When you link a program |
| with such a library, libtool will actually link all object files and |
| dependency libraries into the program. |
| |
| If you omit both @samp{-rpath} and @samp{-static}, libtool will create a |
| convenience library that can be used to create other libtool |
| libraries, even shared ones. Just like in the static case, the library |
| behaves as an alias to a set of object files and dependency libraries, |
| but in this case the object files are suitable for inclusion in shared |
| libraries. But be careful not to link a single convenience library, |
| directly or indirectly, into a single program or library, otherwise you |
| may get errors about symbol redefinitions. |
| |
| When GNU automake is used, you should use @code{noinst_LTLIBRARIES} |
| instead of @code{lib_LTLIBRARIES} for convenience libraries, so that |
| the @samp{-rpath} option is not passed when they are linked. |
| |
| As a rule of thumb, link a libtool convenience library into at most one |
| libtool library, and never into a program, and link libtool static |
| convenience libraries only into programs, and only if you need to carry |
| library dependency information to the user of the static convenience |
| library. |
| |
| @cindex standalone binaries |
| Another common situation where static linking is desirable is in |
| creating a standalone binary. Use libtool to do the linking and add the |
| @samp{-all-static} flag. |
| |
| @node Invoking libtool |
| @chapter Invoking @code{libtool} |
| @pindex libtool |
| @cindex libtool command options |
| @cindex options, libtool command |
| @cindex command options, libtool |
| |
| The @code{libtool} program has the following synopsis: |
| |
| @example |
| libtool [@var{option}]@dots{} [@var{mode-arg}]@dots{} |
| @end example |
| |
| @noindent |
| and accepts the following options: |
| |
| @table @samp |
| @item --config |
| Display libtool configuration variables and exit. |
| |
| @item --debug |
| Dump a trace of shell script execution to standard output. This |
| produces a lot of output, so you may wish to pipe it to @code{less} (or |
| @code{more}) or redirect to a file. |
| |
| @item -n |
| @itemx --dry-run |
| Don't create, modify, or delete any files, just show what commands would |
| be executed by libtool. |
| |
| @item --features |
| Display basic configuration options. This provides a way for packages |
| to determine whether shared or static libraries will be built. |
| |
| @item --preserve-dup-deps |
| Do not remove duplicate dependencies in libraries. When building packages |
| with static libraries, the libraries may depend circularly on each other |
| (shared libs can too, but for those it doesn't matter), so there are |
| situations, where -la -lb -la is required, and the second -la may not be |
| stripped or the link will fail. In cases where these duplications are |
| required, this option will preserve them, only stripping the libraries |
| that libtool knows it can safely. |
| |
| @item --finish |
| Same as @samp{--mode=finish}. |
| |
| @item --help |
| Display a help message and exit. If @samp{--mode=@var{mode}} is |
| specified, then detailed help for @var{mode} is |
| displayed. |
| |
| @item --mode=@var{mode} |
| Use @var{mode} as the operation mode. By default, the operation mode is |
| inferred from the @var{mode-args}. |
| |
| If @var{mode} is specified, it must be one of the following: |
| |
| @table @samp |
| @item compile |
| Compile a source file into a libtool object. |
| |
| @item execute |
| Automatically set the library path so that another program can use |
| uninstalled libtool-generated programs or libraries. |
| |
| @item finish |
| Complete the installation of libtool libraries on the system. |
| |
| @item install |
| Install libraries or executables. |
| |
| @item link |
| Create a library or an executable. |
| |
| @item uninstall |
| Delete installed libraries or executables. |
| |
| @item clean |
| Delete uninstalled libraries or executables. |
| @end table |
| |
| @item --version |
| Print libtool version information and exit. |
| @end table |
| |
| The @var{mode-args} are a variable number of arguments, depending on the |
| selected operation mode. In general, each @var{mode-arg} is interpreted |
| by programs libtool invokes, rather than libtool itself. |
| |
| @menu |
| * Compile mode:: Creating library object files. |
| * Link mode:: Generating executables and libraries. |
| * Execute mode:: Debugging libtool-generated programs. |
| * Install mode:: Making libraries and executables public. |
| * Finish mode:: Completing a library installation. |
| * Uninstall mode:: Removing installed executables and libraries. |
| * Clean mode:: Removing uninstalled executables and libraries. |
| @end menu |
| |
| @node Compile mode |
| @section Compile mode |
| @cindex mode, compile |
| @cindex compile mode |
| |
| For @dfn{compile} mode, @var{mode-args} is a compiler command to be used |
| in creating a `standard' object file. These arguments should begin with |
| the name of the C compiler, and contain the @samp{-c} compiler flag so |
| that only an object file is created. |
| |
| Libtool determines the name of the output file by removing the directory |
| component from the source file name, then substituting the source code |
| suffix (e.g. @samp{.c} for C source code) with the library object suffix, |
| @samp{.lo}. |
| |
| If shared libraries are being built, any necessary PIC generation flags |
| are substituted into the compilation command. |
| You can pass compiler and linker specific flags using @samp{-Wc,@var{flag}} |
| and @samp{-Xcompiler @var{flag}} or @samp{-Wl,@var{flag}} and |
| @samp{-Xlinker @var{flag}}, respectively. |
| |
| If the @samp{-static} option is given, then a @samp{.o} file is built, |
| even if libtool was configured with @samp{--disable-static}. |
| |
| Note that the @samp{-o} option is now fully supported. It is emulated |
| on the platforms that don't support it (by locking and moving the |
| objects), so it is really easy to use libtool, just with minor |
| modifications to your Makefiles. Typing for example |
| @example |
| libtool gcc -c foo/x.c -o foo/x.lo |
| @end example |
| will do what you expect. |
| |
| Note, however, that, if the compiler does not support @samp{-c} and |
| @samp{-o}, it is impossible to compile @file{foo/x.c} without |
| overwriting an existing @file{./x.o}. Therefore, if you do have a |
| source file @file{./x.c}, make sure you introduce dependencies in your |
| @file{Makefile} to make sure @file{./x.o} (or @file{./x.lo}) is |
| re-created after any sub-directory's @file{x.lo}: |
| @example |
| x.o x.lo: foo/x.lo bar/x.lo |
| @end example |
| This will also ensure that make won't try to use a temporarily corrupted |
| @file{x.o} to create a program or library. It may cause needless |
| recompilation on platforms that support @samp{-c} and @samp{-o} |
| together, but it's the only way to make it safe for those that don't. |
| |
| @node Link mode |
| @section Link mode |
| @cindex link mode |
| @cindex mode, link |
| |
| @dfn{Link} mode links together object files (including library |
| objects) to form another library or to create an executable program. |
| |
| @var{mode-args} consist of a command using the C compiler to create an |
| output file (with the @samp{-o} flag) from several object files. |
| |
| The following components of @var{mode-args} are treated specially: |
| |
| @table @samp |
| @cindex undefined symbols, allowing |
| @cindex unresolved symbols, allowing |
| @item -all-static |
| If @var{output-file} is a program, then do not link it against any |
| shared libraries at all. If @var{output-file} is a library, then only |
| create a static library. |
| |
| @item -avoid-version |
| Tries to avoid versioning (@pxref{Versioning}) for libraries and modules, |
| i.e. no version information is stored and no symbolic links are created. |
| If the platform requires versioning, this option has no effect. |
| |
| @item -dlopen @var{file} |
| Same as @samp{-dlpreopen @var{file}}, if native dlopening is not |
| supported on the host platform (@pxref{Dlopened modules}) or if |
| the program is linked with @samp{-static} or @samp{-all-static}. |
| Otherwise, no effect. If @var{file} is @code{self} libtool will make |
| sure that the program can @code{dlopen} itself, either by enabling |
| @code{-export-dynamic} or by falling back to @samp{-dlpreopen self}. |
| |
| @item -dlpreopen @var{file} |
| Link @var{file} into the output program, and add its symbols to |
| @var{lt_preloaded_symbols} (@pxref{Dlpreopening}). If @var{file} is |
| @code{self}, the symbols of the program itself will be added to |
| @var{lt_preloaded_symbols}. |
| If @var{file} is @code{force} libtool will make sure that |
| @var{lt_preloaded_symbols} is always @emph{defined}, regardless of whether |
| it's empty or not. |
| |
| @item -export-dynamic |
| Allow symbols from @var{output-file} to be resolved with @code{dlsym} |
| (@pxref{Dlopened modules}). |
| |
| @item -export-symbols @var{symfile} |
| Tells the linker to export only the symbols listed in @var{symfile}. |
| The symbol file should end in @samp{.sym} and must contain the name of one |
| symbol per line. This option has no effect on some platforms. |
| By default all symbols are exported. |
| |
| @item -export-symbols-regex @var{regex} |
| Same as @samp{-export-symbols}, except that only symbols matching |
| the regular expression @var{regex} are exported. |
| By default all symbols are exported. |
| |
| @item -L@var{libdir} |
| Search @var{libdir} for required libraries that have already been |
| installed. |
| |
| @item -l@var{name} |
| @var{output-file} requires the installed library @file{lib@var{name}}. |
| This option is required even when @var{output-file} is not an |
| executable. |
| |
| @item -module |
| Creates a library that can be dlopened (@pxref{Dlopened modules}). |
| This option doesn't work for programs. |
| Module names don't need to be prefixed with 'lib'. |
| In order to prevent name clashes, however, 'libname' and 'name' |
| must not be used at the same time in your package. |
| |
| @item -no-fast-install |
| Disable fast-install mode for the executable @var{output-file}. Useful |
| if the program won't be necessarily installed. |
| |
| @item -no-install |
| Link an executable @var{output-file} that can't be installed and |
| therefore doesn't need a wrapper script. Useful if the program is only |
| used in the build tree, e.g., for testing or generating other files. |
| |
| @item -no-undefined |
| Declare that @var{output-file} does not depend on any other libraries. |
| Some platforms cannot create shared libraries that depend on other |
| libraries (@pxref{Inter-library dependencies}). |
| |
| @item -o @var{output-file} |
| Create @var{output-file} from the specified objects and libraries. |
| |
| @item -release @var{release} |
| Specify that the library was generated by release @var{release} of your |
| package, so that users can easily tell which versions are newer than |
| others. Be warned that no two releases of your package will be binary |
| compatible if you use this flag. If you want binary compatibility, use |
| the @samp{-version-info} flag instead (@pxref{Versioning}). |
| |
| @item -rpath @var{libdir} |
| If @var{output-file} is a library, it will eventually be installed in |
| @var{libdir}. If @var{output-file} is a program, add @var{libdir} to |
| the run-time path of the program. |
| |
| @item -R @var{libdir} |
| If @var{output-file} is a program, add @var{libdir} to its run-time |
| path. If @var{output-file} is a library, add -R@var{libdir} to its |
| @var{dependency_libs}, so that, whenever the library is linked into a |
| program, @var{libdir} will be added to its run-time path. |
| |
| @item -static |
| If @var{output-file} is a program, then do not link it against any |
| uninstalled shared libtool libraries. If @var{output-file} is a |
| library, then only create a static library. |
| |
| @item -version-info @var{current}[:@var{revision}[:@var{age}]] |
| If @var{output-file} is a libtool library, use interface version |
| information @var{current}, @var{revision}, and @var{age} to build it |
| (@pxref{Versioning}). Do @strong{not} use this flag to specify package |
| release information, rather see the @samp{-release} flag. |
| |
| @item -Wl,@var{flag} |
| @itemx -Xlinker @var{flag} |
| Pass a linker specific flag directly to the linker. |
| @end table |
| |
| If the @var{output-file} ends in @samp{.la}, then a libtool library is |
| created, which must be built only from library objects (@samp{.lo} files). |
| The @samp{-rpath} option is required. In the current implementation, |
| libtool libraries may not depend on other uninstalled libtool libraries |
| (@pxref{Inter-library dependencies}). |
| |
| If the @var{output-file} ends in @samp{.a}, then a standard library is |
| created using @code{ar} and possibly @code{ranlib}. |
| |
| @cindex partial linking |
| @cindex linking, partial |
| If @var{output-file} ends in @samp{.o} or @samp{.lo}, then a reloadable object |
| file is created from the input files (generally using @samp{ld -r}). |
| This method is often called @dfn{partial linking}. |
| |
| Otherwise, an executable program is created. |
| |
| @node Execute mode |
| @section Execute mode |
| @cindex execute mode |
| @cindex mode, execute |
| |
| For @dfn{execute} mode, the library path is automatically set, then a |
| program is executed. |
| |
| The first of the @var{mode-args} is treated as a program name, with the |
| rest as arguments to that program. |
| |
| The following components of @var{mode-args} are treated specially: |
| |
| @table @samp |
| @item -dlopen @var{file} |
| Add the directory containing @var{file} to the library path. |
| @end table |
| |
| This mode sets the library path environment variable according to any |
| @samp{-dlopen} flags. |
| |
| If any of the @var{args} are libtool executable wrappers, then they are |
| translated into the name of their corresponding uninstalled binary, and |
| any of their required library directories are added to the library path. |
| |
| @node Install mode |
| @section Install mode |
| @cindex install mode |
| @cindex mode, install |
| |
| In @dfn{install} mode, libtool interprets @var{mode-args} as an |
| installation command beginning with @code{cp}, or a BSD-compatible |
| @code{install} program. |
| |
| The rest of the @var{mode-args} are interpreted as arguments to that |
| command. |
| |
| The command is run, and any necessary unprivileged post-installation |
| commands are also completed. |
| |
| @node Finish mode |
| @section Finish mode |
| @cindex finish mode |
| @cindex mode, finish |
| |
| @dfn{Finish} mode helps system administrators install libtool libraries |
| so that they can be located and linked into user programs. |
| |
| Each @var{mode-arg} is interpreted as the name of a library directory. |
| Running this command may require superuser privileges, so the |
| @samp{--dry-run} option may be useful. |
| |
| @node Uninstall mode |
| @section Uninstall mode |
| @cindex uninstall mode |
| @cindex mode, uninstall |
| |
| @dfn{Uninstall} mode deletes installed libraries, executables and objects. |
| |
| The first @var{mode-arg} is the name of the program to use to delete |
| files (typically @file{/bin/rm}). |
| |
| The remaining @var{mode-args} are either flags for the deletion program |
| (beginning with a `-'), or the names of files to delete. |
| |
| @node Clean mode |
| @section Clean mode |
| @cindex clean mode |
| @cindex mode, clean |
| |
| @dfn{Clean} mode deletes uninstalled libraries, executables, objects |
| and libtool's temporary files associated with them. |
| |
| The first @var{mode-arg} is the name of the program to use to delete |
| files (typically @file{/bin/rm}). |
| |
| The remaining @var{mode-args} are either flags for the deletion program |
| (beginning with a `-'), or the names of files to delete. |
| |
| @node Integrating libtool |
| @chapter Integrating libtool with your package |
| |
| This chapter describes how to integrate libtool with your packages so |
| that your users can install hassle-free shared libraries. |
| |
| @menu |
| * Makefile rules:: Writing @file{Makefile} rules for libtool. |
| * Using Automake:: Automatically supporting libtool. |
| * Configuring:: Configuring libtool for a host system. |
| * Distributing:: What files to distribute with your package. |
| * Static-only libraries:: Sometimes shared libraries are just a pain. |
| @end menu |
| |
| @node Makefile rules |
| @section Writing @file{Makefile} rules for libtool |
| @cindex Makefile |
| @cindex Makefile.am |
| @cindex Makefile.in |
| |
| Libtool is fully integrated with Automake (@pxref{Top,, Introduction, |
| automake, The Automake Manual}), starting with Automake version 1.2. |
| |
| If you want to use libtool in a regular @file{Makefile} (or |
| @file{Makefile.in}), you are on your own. If you're not using Automake |
| 1.2, and you don't know how to incorporate libtool into your package you |
| need to do one of the following: |
| |
| @enumerate 1 |
| @item |
| Download Automake (version 1.2 or later) from your nearest GNU mirror, |
| install it, and start using it. |
| |
| @item |
| Learn how to write @file{Makefile} rules by hand. They're sometimes complex, |
| but if you're clever enough to write rules for compiling your old |
| libraries, then you should be able to figure out new rules for libtool |
| libraries (hint: examine the @file{Makefile.in} in the @file{demo} |
| subdirectory of the libtool distribution@dots{} note especially that it |
| was automatically generated from the @file{Makefile.am} by Automake). |
| @end enumerate |
| |
| @node Using Automake |
| @section Using Automake with libtool |
| |
| @vindex LTLIBRARIES |
| Libtool library support is implemented under the @samp{LTLIBRARIES} |
| primary. |
| |
| Here are some samples from the Automake @file{Makefile.am} in the |
| libtool distribution's @file{demo} subdirectory. |
| |
| First, to link a program against a libtool library, just use the |
| @samp{program_LDADD} variable: |
| |
| @example |
| bin_PROGRAMS = hell hell.debug |
| |
| # Build hell from main.c and libhello.la |
| hell_SOURCES = main.c |
| hell_LDADD = libhello.la |
| |
| # Create an easier-to-debug version of hell. |
| hell_debug_SOURCES = main.c |
| hell_debug_LDADD = libhello.la |
| hell_debug_LDFLAGS = -static |
| @end example |
| |
| The flags @samp{-dlopen} or @samp{-dlpreopen} (@pxref{Link mode}) would |
| fit better in the @var{program_LDADD} variable. Unfortunately, GNU |
| automake, up to release 1.4, doesn't accept these flags in a |
| @var{program_LDADD} variable, so you have the following alternatives: |
| |
| @itemize @bullet |
| @item |
| add them to @var{program_LDFLAGS}, and list the libraries in |
| @var{program_DEPENDENCIES}, then wait for a release of GNU automake that |
| accepts these flags where they belong; |
| |
| @item |
| surround the flags between quotes, but then you must set |
| @var{program_DEPENDENCIES} too: |
| |
| @example |
| program_LDADD = "-dlopen" libfoo.la |
| program_DEPENDENCIES = libfoo.la |
| @end example |
| |
| @item |
| set and @samp{AC_SUBST} variables @var{DLOPEN} and @var{DLPREOPEN} in |
| @file{configure.in} and use @samp{@@DLOPEN@@} and @samp{@@DLPREOPEN@@} |
| as replacements for the explicit flags @samp{-dlopen} and |
| @samp{-dlpreopen} in @samp{program_LDADD}. Automake will discard |
| @samp{AC_SUBST}ed variables from dependencies, so it will behave exactly |
| as we expect it to behave when it accepts these flags in |
| @samp{program_LDADD}. But hey!, this is ugly! |
| @end itemize |
| |
| You may use the @samp{program_LDFLAGS} variable to stuff in any flags |
| you want to pass to libtool while linking @samp{program} (such as |
| @samp{-static} to avoid linking uninstalled shared libtool libraries). |
| |
| Building a libtool library is almost as trivial@dots{} note the use of |
| @samp{libhello_la_LDFLAGS} to pass the @samp{-version-info} |
| (@pxref{Versioning}) option to libtool: |
| |
| @example |
| # Build a libtool library, libhello.la for installation in libdir. |
| lib_LTLIBRARIES = libhello.la |
| libhello_la_SOURCES = hello.c foo.c |
| libhello_la_LDFLAGS = -version-info 3:12:1 |
| @end example |
| |
| The @samp{-rpath} option is passed automatically by Automake (except for |
| libraries listed as @code{noinst_LTLIBRARIES}), so you |
| should not specify it. |
| |
| @xref{A Shared Library, Building a Shared Library, The Automake Manual, |
| automake, The Automake Manual}, for more information. |
| |
| @node Configuring |
| @section Configuring libtool |
| @cindex configuring libtool |
| |
| Libtool requires intimate knowledge of your compiler suite and operating |
| system in order to be able to create shared libraries and link against |
| them properly. When you install the libtool distribution, a |
| system-specific libtool script is installed into your binary directory. |
| |
| However, when you distribute libtool with your own packages |
| (@pxref{Distributing}), you do not always know which compiler suite and |
| operating system are used to compile your package. |
| |
| For this reason, libtool must be @dfn{configured} before it can be |
| used. This idea should be familiar to anybody who has used a GNU |
| @code{configure} script. @code{configure} runs a number of tests for |
| system features, then generates the @file{Makefiles} (and possibly a |
| @file{config.h} header file), after which you can run @code{make} and |
| build the package. |
| |
| Libtool adds its own tests to your @code{configure} script in order to |
| generate a libtool script for the installer's host machine. |
| |
| @menu |
| * AC_PROG_LIBTOOL:: Configuring @code{libtool} in @file{configure.in}. |
| @end menu |
| |
| @node AC_PROG_LIBTOOL |
| @subsection The @code{AC_PROG_LIBTOOL} macro |
| |
| If you are using GNU Autoconf (or Automake), you should add a call to |
| @code{AC_PROG_LIBTOOL} to your @file{configure.in} file. This macro |
| adds many new tests to the @code{configure} script so that the generated |
| libtool script will understand the characteristics of the host: |
| |
| @defmac AC_PROG_LIBTOOL |
| @defmacx AM_PROG_LIBTOOL |
| Add support for the @samp{--enable-shared} and @samp{--disable-shared} |
| @code{configure} flags.@footnote{@code{AC_PROG_LIBTOOL} requires that |
| you define the @file{Makefile} variable @code{top_builddir} in your |
| @file{Makefile.in}. Automake does this automatically, but Autoconf |
| users should set it to the relative path to the top of your build |
| directory (@file{../..}, for example).} @code{AM_PROG_LIBTOOL} was the |
| old name for this macro, and although supported at the moment is |
| deprecated. |
| |
| By default, this macro turns on shared libraries if they are available, |
| and also enables static libraries if they don't conflict with the shared |
| libraries. You can modify these defaults by calling either the |
| @code{AC_DISABLE_SHARED} or @code{AC_DISABLE_STATIC} macros: |
| |
| @example |
| # Turn off shared libraries during beta-testing, since they |
| # make the build process take too long. |
| AC_DISABLE_SHARED |
| AC_PROG_LIBTOOL |
| @end example |
| |
| The user may specify modified forms of the configure flags |
| @samp{--enable-shared} and @samp{--enable-static} to choose whether |
| shared or static libraries are built based on the name of the package. |
| For example, to have shared @samp{bfd} and @samp{gdb} libraries built, |
| but not shared @samp{libg++}, you can run all three @code{configure} |
| scripts as follows: |
| |
| @example |
| trick$ ./configure --enable-shared=bfd,gdb |
| @end example |
| |
| In general, specifying @samp{--enable-shared=@var{pkgs}} is the same as |
| configuring with @samp{--enable-shared} every package named in the |
| comma-separated @var{pkgs} list, and every other package with |
| @samp{--disable-shared}. The @samp{--enable-static=@var{pkgs}} flag |
| behaves similarly, but it uses @samp{--enable-static} and |
| @samp{--disable-static}. The same applies to the |
| @samp{--enable-fast-install=@var{pkgs}} flag, which uses |
| @samp{--enable-fast-install} and @samp{--disable-fast-install}. |
| |
| The package name @samp{default} matches any packages which have not set |
| their name in the @code{PACKAGE} environment variable. |
| |
| This macro also sets the shell variable @var{LIBTOOL_DEPS}, that you can |
| use to automatically update the libtool script if it becomes |
| out-of-date. In order to do that, add to your @file{configure.in}: |
| |
| @example |
| AC_PROG_LIBTOOL |
| AC_SUBST(LIBTOOL_DEPS) |
| @end example |
| |
| and, to @file{Makefile.in} or @file{Makefile.am}: |
| |
| @example |
| LIBTOOL_DEPS = @@LIBTOOL_DEPS@@ |
| libtool: $(LIBTOOL_DEPS) |
| $(SHELL) ./config.status --recheck |
| @end example |
| |
| If you are using GNU automake, you can omit the assignment, as automake |
| will take care of it. You'll obviously have to create some dependency |
| on @file{libtool}. |
| |
| @end defmac |
| |
| @defmac AC_LIBTOOL_DLOPEN |
| Enable checking for dlopen support. This macro should be used if |
| the package makes use of the @samp{-dlopen} and @samp{-dlpreopen} flags, |
| otherwise libtool will assume that the system does not support dlopening. |
| The macro must be called @strong{before} @code{AC_PROG_LIBTOOL}. |
| @end defmac |
| |
| @defmac AC_LIBTOOL_WIN32_DLL |
| This macro should be used if the package has been ported to build clean |
| dlls on win32 platforms. Usually this means that any library data items |
| are exported with @code{__declspec(dllexport)} and imported with |
| @code{__declspec(dllimport)}. If this macro is not used, libtool will |
| assume that the package libraries are not dll clean and will build only |
| static libraries on win32 hosts. |
| |
| This macro must be called @strong{before} @code{AC_PROG_LIBTOOL}, and |
| provision must be made to pass @samp{-no-undefined} to @code{libtool} |
| in link mode from the package @code{Makefile}. Naturally, if you pass |
| @samp{-no-undefined}, you must ensure that all the library symbols |
| @strong{really are} defined at link time! |
| @end defmac |
| |
| @defmac AC_DISABLE_FAST_INSTALL |
| Change the default behaviour for @code{AC_PROG_LIBTOOL} to disable |
| optimization for fast installation. The user may still override this |
| default, depending on platform support, by specifying |
| @samp{--enable-fast-install}. |
| @end defmac |
| |
| @defmac AC_DISABLE_SHARED |
| @defmacx AM_DISABLE_SHARED |
| Change the default behaviour for @code{AC_PROG_LIBTOOL} to disable |
| shared libraries. The user may still override this default by |
| specifying @samp{--enable-shared}. |
| @end defmac |
| |
| @defmac AC_DISABLE_STATIC |
| @defmacx AM_DISABLE_STATIC |
| Change the default behaviour for @code{AC_PROG_LIBTOOL} to disable |
| static libraries. The user may still override this default by |
| specifying @samp{--enable-static}. |
| @end defmac |
| |
| The tests in @code{AC_PROG_LIBTOOL} also recognize the following |
| environment variables: |
| |
| @defvar CC |
| The C compiler that will be used by the generated @code{libtool}. If |
| this is not set, @code{AC_PROG_LIBTOOL} will look for @code{gcc} or |
| @code{cc}. |
| @end defvar |
| |
| @defvar CFLAGS |
| Compiler flags used to generate standard object files. If this is not |
| set, @code{AC_PROG_LIBTOOL} will not use any such flags. It affects |
| only the way @code{AC_PROG_LIBTOOL} runs tests, not the produced |
| @code{libtool}. |
| @end defvar |
| |
| @defvar CPPFLAGS |
| C preprocessor flags. If this is not set, @code{AC_PROG_LIBTOOL} will |
| not use any such flags. It affects only the way @code{AC_PROG_LIBTOOL} |
| runs tests, not the produced @code{libtool}. |
| @end defvar |
| |
| @defvar LD |
| The system linker to use (if the generated @code{libtool} requires one). |
| If this is not set, @code{AC_PROG_LIBTOOL} will try to find out what is |
| the linker used by @var{CC}. |
| @end defvar |
| |
| @defvar LDFLAGS |
| The flags to be used by @code{libtool} when it links a program. If |
| this is not set, @code{AC_PROG_LIBTOOL} will not use any such flags. It |
| affects only the way @code{AC_PROG_LIBTOOL} runs tests, not the produced |
| @code{libtool}. |
| @end defvar |
| |
| @defvar LIBS |
| The libraries to be used by @code{AC_PROG_LIBTOOL} when it links a |
| program. If this is not set, @code{AC_PROG_LIBTOOL} will not use any |
| such flags. It affects only the way @code{AC_PROG_LIBTOOL} runs tests, |
| not the produced @code{libtool}. |
| @end defvar |
| |
| @defvar NM |
| Program to use rather than checking for @code{nm}. |
| @end defvar |
| |
| @defvar RANLIB |
| Program to use rather than checking for @code{ranlib}. |
| @end defvar |
| |
| @defvar LN_S |
| A command that creates a link of a program, a soft-link if possible, a |
| hard-link otherwise. @code{AC_PROG_LIBTOOL} will check for a suitable |
| program if this variable is not set. |
| @end defvar |
| |
| @defvar DLLTOOL |
| Program to use rather than checking for @code{dlltool}. Only meaningful |
| for Cygwin/MS-Windows. |
| @end defvar |
| |
| @defvar OBJDUMP |
| Program to use rather than checking for @code{objdump}. Only meaningful |
| for Cygwin/MS-Windows. |
| @end defvar |
| |
| @defvar AS |
| Program to use rather than checking for @code{as}. Only used on |
| Cygwin/MS-Windows at the moment. |
| @end defvar |
| |
| @pindex aclocal |
| When you invoke the @code{libtoolize} program (@pxref{Invoking |
| libtoolize}), it will tell you where to find a definition of |
| @code{AC_PROG_LIBTOOL}. If you use Automake, the @code{aclocal} program |
| will automatically add @code{AC_PROG_LIBTOOL} support to your |
| @code{configure} script. |
| |
| Nevertheless, it is advisable to include a copy of @file{libtool.m4} in |
| @file{acinclude.m4}, so that, even if @file{aclocal.m4} and |
| @file{configure} are rebuilt for any reason, the appropriate libtool |
| macros will be used. The alternative is to hope the user will have a |
| compatible version of @file{libtool.m4} installed and accessible for |
| @code{aclocal}. This may lead to weird errors when versions don't |
| match. |
| |
| @node Distributing |
| @section Including libtool in your package |
| |
| In order to use libtool, you need to include the following files with |
| your package: |
| |
| @table @file |
| @item config.guess |
| @pindex config.guess |
| Attempt to guess a canonical system name. |
| |
| @item config.sub |
| @pindex config.sub |
| Canonical system name validation subroutine script. |
| |
| @item ltmain.sh |
| @pindex ltmain.sh |
| A generic script implementing basic libtool functionality. |
| @end table |
| |
| Note that the libtool script itself should @emph{not} be included with |
| your package. @xref{Configuring}. |
| |
| You should use the @code{libtoolize} program, rather than manually |
| copying these files into your package. |
| |
| @menu |
| * Invoking libtoolize:: @code{libtoolize} command line options. |
| * Autoconf .o macros:: Autoconf macros that set object file names. |
| @end menu |
| |
| @node Invoking libtoolize |
| @subsection Invoking @code{libtoolize} |
| @pindex libtoolize |
| @cindex libtoolize command options |
| @cindex command options, libtoolize |
| @cindex options, libtoolize command |
| |
| The @code{libtoolize} program provides a standard way to add libtool |
| support to your package. In the future, it may implement better usage |
| checking, or other features to make libtool even easier to use. |
| |
| The @code{libtoolize} program has the following synopsis: |
| |
| @example |
| libtoolize [@var{option}]@dots{} |
| @end example |
| |
| @noindent |
| and accepts the following options: |
| |
| @table @samp |
| @item --automake |
| Work silently, and assume that Automake libtool support is used. |
| |
| @samp{libtoolize --automake} is used by Automake to add libtool files to |
| your package, when @code{AC_PROG_LIBTOOL} appears in your |
| @file{configure.in}. |
| |
| @item --copy |
| @itemx -c |
| Copy files from the libtool data directory rather than creating |
| symlinks. |
| |
| @item --debug |
| Dump a trace of shell script execution to standard output. This |
| produces a lot of output, so you may wish to pipe it to @code{less} (or |
| @code{more}) or redirect to a file. |
| |
| @item --dry-run |
| @itemx -n |
| Don't run any commands that modify the file system, just print them |
| out. |
| |
| @item --force |
| @itemx -f |
| Replace existing libtool files. By default, @code{libtoolize} won't |
| overwrite existing files. |
| |
| @item --help |
| Display a help message and exit. |
| |
| @item --ltdl |
| Install libltdl in a subdirectory of your package. |
| |
| @item --ltdl-tar |
| Add the file libltdl.tar.gz to your package. |
| |
| @item --version |
| Print @code{libtoolize} version information and exit. |
| @end table |
| |
| @findex AC_CONFIG_AUX_DIR |
| If @code{libtoolize} detects an explicit call to |
| @code{AC_CONFIG_AUX_DIR} (@pxref{Input, , The Autoconf Manual, |
| autoconf, The Autoconf Manual}) in your @file{configure.in}, it |
| will put the files in the specified directory. |
| |
| @code{libtoolize} displays hints for adding libtool support to your |
| package, as well. |
| |
| @node Autoconf .o macros |
| @subsection Autoconf @samp{.o} macros |
| |
| The Autoconf package comes with a few macros that run tests, then set a |
| variable corresponding to the name of an object file. Sometimes it is |
| necessary to use corresponding names for libtool objects. |
| |
| Here are the names of variables that list libtool objects: |
| |
| @defvar LTALLOCA |
| @findex AC_FUNC_ALLOCA |
| Substituted by @code{AC_FUNC_ALLOCA} (@pxref{Particular Functions, Particular |
| Function Checks, The Autoconf Manual, autoconf, The Autoconf |
| Manual}). Is either empty, or contains @samp{alloca.lo}. |
| @end defvar |
| |
| @defvar LTLIBOBJS |
| @findex AC_REPLACE_FUNCS |
| Substituted by @code{AC_REPLACE_FUNCS} (@pxref{Generic Functions, Generic |
| Function Checks, The Autoconf Manual, autoconf, The Autoconf |
| Manual}), and a few other functions. |
| @end defvar |
| |
| Unfortunately, the stable release of Autoconf (2.13, at the time of |
| this writing) does not have any way for libtool to provide support for |
| these variables. So, if you depend on them, use the following code |
| immediately before the call to @code{AC_OUTPUT} in your |
| @file{configure.in}: |
| |
| @example |
| LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'` |
| AC_SUBST(LTLIBOBJS) |
| LTALLOCA=`echo "$ALLOCA" | sed 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'` |
| AC_SUBST(LTALLOCA) |
| AC_OUTPUT(@dots{}) |
| @end example |
| |
| @node Static-only libraries |
| @section Static-only libraries |
| @cindex debugging libraries |
| @cindex developing libraries |
| @cindex double-compilation, avoiding |
| @cindex avoiding shared libraries |
| @cindex eliding shared libraries |
| @cindex using shared libraries, not |
| @cindex shared libraries, not using |
| @cindex time, saving |
| @cindex saving time |
| |
| When you are developing a package, it is often worthwhile to configure |
| your package with the @samp{--disable-shared} flag, or to override the |
| defaults for @code{AC_PROG_LIBTOOL} by using the |
| @code{AC_DISABLE_SHARED} Autoconf macro (@pxref{AC_PROG_LIBTOOL, , The |
| @code{AC_PROG_LIBTOOL} macro}). This prevents libtool from building |
| shared libraries, which has several advantages: |
| |
| @itemize @bullet |
| @item |
| compilation is twice as fast, which can speed up your development cycle, |
| |
| @item |
| debugging is easier because you don't need to deal with any complexities |
| added by shared libraries, and |
| |
| @item |
| you can see how libtool behaves on static-only platforms. |
| @end itemize |
| |
| You may want to put a small note in your package @file{README} to let |
| other developers know that @samp{--disable-shared} can save them time. |
| The following example note is taken from the GIMP@footnote{GNU Image |
| Manipulation Program, for those who haven't taken the plunge. See |
| @url{http://www.gimp.org/}.} distribution @file{README}: |
| |
| @example |
| The GIMP uses GNU Libtool in order to build shared libraries on a |
| variety of systems. While this is very nice for making usable |
| binaries, it can be a pain when trying to debug a program. For that |
| reason, compilation of shared libraries can be turned off by |
| specifying the @samp{--disable-shared} option to @file{configure}. |
| @end example |
| |
| @node Versioning |
| @chapter Library interface versions |
| @cindex dynamic dependencies |
| @cindex dependency versioning |
| @cindex shared library versions |
| |
| The most difficult issue introduced by shared libraries is that of |
| creating and resolving runtime dependencies. Dependencies on programs |
| and libraries are often described in terms of a single name, such as |
| @code{sed}. So, one may say ``libtool depends on sed,'' and that is |
| good enough for most purposes. |
| |
| However, when an interface changes regularly, we need to be more |
| specific: ``Gnus 5.1 requires Emacs 19.28 or above.'' Here, the |
| description of an interface consists of a name, and a ``version |
| number.'' |
| |
| Even that sort of description is not accurate enough for some purposes. |
| What if Emacs 20 changes enough to break Gnus 5.1? |
| |
| The same problem exists in shared libraries: we require a formal version |
| system to describe the sorts of dependencies that programs have on |
| shared libraries, so that the dynamic linker can guarantee that programs |
| are linked only against libraries that provide the interface they |
| require. |
| |
| @menu |
| * Interfaces:: What are library interfaces? |
| * Libtool versioning:: Libtool's versioning system. |
| * Updating version info:: Changing version information before releases. |
| * Release numbers:: Breaking binary compatibility for aesthetics. |
| @end menu |
| |
| @node Interfaces |
| @section What are library interfaces? |
| @cindex library interfaces |
| |
| Interfaces for libraries may be any of the following (and more): |
| |
| @itemize @bullet |
| @item |
| global variables: both names and types |
| |
| @item |
| global functions: argument types and number, return types, and function names |
| |
| @item |
| standard input, standard output, standard error, and file formats |
| |
| @item |
| sockets, pipes, and other inter-process communication protocol formats |
| @end itemize |
| |
| Note that static functions do not count as interfaces, because they are |
| not directly available to the user of the library. |
| |
| @node Libtool versioning |
| @section Libtool's versioning system |
| @cindex libtool library versions |
| @cindex formal versioning |
| @cindex versioning, formal |
| |
| Libtool has its own formal versioning system. It is not as flexible as |
| some, but it is definitely the simplest of the more powerful versioning |
| systems. |
| |
| Think of a library as exporting several sets of interfaces, arbitrarily |
| represented by integers. When a program is linked against a library, it |
| may use any subset of those interfaces. |
| |
| Libtool's description of the interfaces that a program uses is simple: |
| it encodes the least and the greatest interface numbers in the resulting |
| binary (@var{first-interface}, @var{last-interface}). |
| |
| The dynamic linker is guaranteed that if a library supports @emph{every} |
| interface number between @var{first-interface} and @var{last-interface}, |
| then the program can be relinked against that library. |
| |
| Note that this can cause problems because libtool's compatibility |
| requirements are actually stricter than is necessary. |
| |
| Say @file{libhello} supports interfaces 5, 16, 17, 18, and 19, and that |
| libtool is used to link @file{test} against @file{libhello}. |
| |
| Libtool encodes the numbers 5 and 19 in @file{test}, and the dynamic |
| linker will only link @file{test} against libraries that support |
| @emph{every} interface between 5 and 19. So, the dynamic linker refuses |
| to link @file{test} against @file{libhello}! |
| |
| In order to eliminate this problem, libtool only allows libraries to |
| declare consecutive interface numbers. So, @file{libhello} can declare at |
| most that it supports interfaces 16 through 19. Then, the dynamic |
| linker will link @file{test} against @file{libhello}. |
| |
| So, libtool library versions are described by three integers: |
| |
| @table @var |
| @item current |
| The most recent interface number that this library implements. |
| |
| @item revision |
| The implementation number of the @var{current} interface. |
| |
| @item age |
| The difference between the newest and oldest interfaces that this |
| library implements. In other words, the library implements all the |
| interface numbers in the range from number @code{@var{current} - |
| @var{age}} to @code{@var{current}}. |
| @end table |
| |
| If two libraries have identical @var{current} and @var{age} numbers, |
| then the dynamic linker chooses the library with the greater |
| @var{revision} number. |
| |
| @node Updating version info |
| @section Updating library version information |
| |
| If you want to use libtool's versioning system, then you must specify |
| the version information to libtool using the @samp{-version-info} flag |
| during link mode (@pxref{Link mode}). |
| |
| This flag accepts an argument of the form |
| @samp{@var{current}[:@var{revision}[:@var{age}]]}. So, passing |
| @samp{-version-info 3:12:1} sets @var{current} to 3, @var{revision} to |
| 12, and @var{age} to 1. |
| |
| If either @var{revision} or @var{age} are omitted, they default to 0. |
| Also note that @var{age} must be less than or equal to the @var{current} |
| interface number. |
| |
| Here are a set of rules to help you update your library version |
| information: |
| |
| @enumerate 1 |
| @item |
| Start with version information of @samp{0:0:0} for each libtool library. |
| |
| @item |
| Update the version information only immediately before a public release |
| of your software. More frequent updates are unnecessary, and only |
| guarantee that the current interface number gets larger faster. |
| |
| @item |
| If the library source code has changed at all since the last update, |
| then increment @var{revision} (@samp{@var{c}:@var{r}:@var{a}} becomes |
| @samp{@var{c}:@math{r+1}:@var{a}}). |
| |
| @item |
| If any interfaces have been added, removed, or changed since the last |
| update, increment @var{current}, and set @var{revision} to 0. |
| |
| @item |
| If any interfaces have been added since the last public release, then |
| increment @var{age}. |
| |
| @item |
| If any interfaces have been removed since the last public release, then |
| set @var{age} to 0. |
| @end enumerate |
| |
| @strong{@emph{Never}} try to set the interface numbers so that they |
| correspond to the release number of your package. This is an abuse that |
| only fosters misunderstanding of the purpose of library versions. |
| Instead, use the @samp{-release} flag (@pxref{Release numbers}), but be |
| warned that every release of your package will not be binary compatible |
| with any other release. |
| |
| @node Release numbers |
| @section Managing release information |
| |
| Often, people want to encode the name of the package release into the |
| shared library so that it is obvious to the user which package their |
| programs are linked against. This convention is used especially on |
| GNU/Linux: |
| |
| @example |
| trick$ @kbd{ls /usr/lib/libbfd*} |
| /usr/lib/libbfd.a /usr/lib/libbfd.so.2.7.0.2 |
| /usr/lib/libbfd.so |
| trick$ |
| @end example |
| |
| On @samp{trick}, @file{/usr/lib/libbfd.so} is a symbolic link to |
| @file{libbfd.so.2.7.0.2}, which was distributed as a part of |
| @samp{binutils-2.7.0.2}. |
| |
| Unfortunately, this convention conflicts directly with libtool's idea of |
| library interface versions, because the library interface rarely changes |
| at the same time that the release number does, and the library suffix is |
| never the same across all platforms. |
| |
| So, in order to accommodate both views, you can use the @samp{-release} |
| flag in order to set release information for libraries which you do not |
| want to use @samp{-version-info}. For the @file{libbfd} example, the |
| next release which uses libtool should be built with @samp{-release |
| 2.9.0}, which will produce the following files on GNU/Linux: |
| |
| @example |
| trick$ @kbd{ls /usr/lib/libbfd*} |
| /usr/lib/libbfd-2.9.0.so /usr/lib/libbfd.a |
| /usr/lib/libbfd.so |
| trick$ |
| @end example |
| |
| In this case, @file{/usr/lib/libbfd.so} is a symbolic link to |
| @file{libbfd-2.9.0.so}. This makes it obvious that the user is dealing |
| with @samp{binutils-2.9.0}, without compromising libtool's idea of |
| interface versions. |
| |
| Note that this option causes a modification of the library name, so do |
| not use it unless you want to break binary compatibility with any past |
| library releases. In general, you should only use @samp{-release} for |
| package-internal libraries or for ones whose interfaces change very |
| frequently. |
| |
| @node Library tips |
| @chapter Tips for interface design |
| @cindex library interfaces, design |
| @cindex design of library interfaces |
| |
| Writing a good library interface takes a lot of practice and thorough |
| understanding of the problem that the library is intended to solve. |
| |
| If you design a good interface, it won't have to change often, you won't |
| have to keep updating documentation, and users won't have to keep |
| relearning how to use the library. |
| |
| Here is a brief list of tips for library interface design, which may |
| help you in your exploits: |
| |
| @table @asis |
| @item Plan ahead |
| Try to make every interface truly minimal, so that you won't need to |
| delete entry points very often. |
| |
| @item Avoid interface changes |
| @cindex renaming interface functions |
| Some people love redesigning and changing entry points just for the heck |
| of it (note: @emph{renaming} a function is considered changing an entry |
| point). Don't be one of those people. If you must redesign an |
| interface, then try to leave compatibility functions behind so that |
| users don't need to rewrite their existing code. |
| |
| @item Use opaque data types |
| @cindex opaque data types |
| The fewer data type definitions a library user has access to, the |
| better. If possible, design your functions to accept a generic pointer |
| (which you can cast to an internal data type), and provide access |
| functions rather than allowing the library user to directly manipulate |
| the data. |
| That way, you have the freedom to change the data structures without |
| changing the interface. |
| |
| This is essentially the same thing as using abstract data types and |
| inheritance in an object-oriented system. |
| |
| @item Use header files |
| @cindex header files |
| If you are careful to document each of your library's global functions |
| and variables in header files, and include them in your library source |
| files, then the compiler will let you know if you make any interface |
| changes by accident (@pxref{C header files}). |
| |
| @item Use the @code{static} keyword (or equivalent) whenever possible |
| @cindex global functions |
| The fewer global functions your library has, the more flexibility you'll |
| have in changing them. Static functions and variables may change forms |
| as often as you like@dots{} your users cannot access them, so they |
| aren't interface changes. |
| @end table |
| |
| @menu |
| * C header files:: How to write portable include files. |
| @end menu |
| |
| @node C header files |
| @section Writing C header files |
| @cindex portable C headers |
| @cindex C header files, portable |
| @cindex include files, portable |
| |
| Writing portable C header files can be difficult, since they may be read |
| by different types of compilers: |
| |
| @table @asis |
| @item C++ compilers |
| C++ compilers require that functions be declared with full prototypes, |
| since C++ is more strongly typed than C. C functions and variables also |
| need to be declared with the @code{extern "C"} directive, so that the |
| names aren't mangled. @xref{C++ libraries}, for other issues relevant |
| to using C++ with libtool. |
| |
| @item ANSI C compilers |
| ANSI C compilers are not as strict as C++ compilers, but functions |
| should be prototyped to avoid unnecessary warnings when the header file |
| is @code{#include}d. |
| |
| @item non-ANSI C compilers |
| Non-ANSI compilers will report errors if functions are prototyped. |
| @end table |
| |
| These complications mean that your library interface headers must use |
| some C preprocessor magic in order to be usable by each of the above |
| compilers. |
| |
| @file{foo.h} in the @file{demo} subdirectory of the libtool distribution |
| serves as an example for how to write a header file that can be |
| safely installed in a system directory. |
| |
| Here are the relevant portions of that file: |
| |
| @example |
| /* BEGIN_C_DECLS should be used at the beginning of your declarations, |
| so that C++ compilers don't mangle their names. Use END_C_DECLS at |
| the end of C declarations. */ |
| #undef BEGIN_C_DECLS |
| #undef END_C_DECLS |
| #ifdef __cplusplus |
| # define BEGIN_C_DECLS extern "C" @{ |
| # define END_C_DECLS @} |
| #else |
| # define BEGIN_C_DECLS /* empty */ |
| # define END_C_DECLS /* empty */ |
| #endif |
| |
| /* PARAMS is a macro used to wrap function prototypes, so that |
| compilers that don't understand ANSI C prototypes still work, |
| and ANSI C compilers can issue warnings about type mismatches. */ |
| #undef PARAMS |
| #if defined (__STDC__) || defined (_AIX) \ |
| || (defined (__mips) && defined (_SYSTYPE_SVR4)) \ |
| || defined(WIN32) || defined(__cplusplus) |
| # define PARAMS(protos) protos |
| #else |
| # define PARAMS(protos) () |
| #endif |
| @end example |
| |
| These macros are used in @file{foo.h} as follows: |
| |
| @example |
| #ifndef FOO_H |
| #define FOO_H 1 |
| |
| /* The above macro definitions. */ |
| #include "@dots{}" |
| |
| BEGIN_C_DECLS |
| |
| int foo PARAMS((void)); |
| int hello PARAMS((void)); |
| |
| END_C_DECLS |
| |
| #endif /* !FOO_H */ |
| @end example |
| |
| Note that the @file{#ifndef FOO_H} prevents the body of @file{foo.h} |
| from being read more than once in a given compilation. |
| |
| Also the only thing that must go outside the |
| @code{BEGIN_C_DECLS}/@code{END_C_DECLS} pair are @code{#include} lines. |
| Strictly speaking it is only C symbol names that need to be protected, |
| but your header files will be more maintainable if you have a single |
| pair of of these macros around the majority of the header contents. |
| |
| You should use these definitions of @code{PARAMS}, @code{BEGIN_C_DECLS}, |
| and @code{END_C_DECLS} into your own headers. Then, you may use them to |
| create header files that are valid for C++, ANSI, and non-ANSI |
| compilers@footnote{We used to recommend @code{__P}, |
| @code{__BEGIN_DECLS} and @code{__END_DECLS}. This was bad advice since |
| symbols (even preprocessor macro names) that begin with an underscore |
| are reserved for the use of the compiler.}. |
| |
| Do not be naive about writing portable code. Following the tips given |
| above will help you miss the most obvious problems, but there are |
| definitely other subtle portability issues. You may need to cope with |
| some of the following issues: |
| |
| @itemize @bullet |
| @item |
| Pre-ANSI compilers do not always support the @code{void *} generic |
| pointer type, and so need to use @code{char *} in its place. |
| |
| @item |
| The @code{const}, @code{inline} and @code{signed} keywords are not |
| supported by some compilers, especially pre-ANSI compilers. |
| |
| @item |
| The @code{long double} type is not supported by many compilers. |
| @end itemize |
| |
| @node Inter-library dependencies |
| @chapter Inter-library dependencies |
| @cindex dependencies between libraries |
| @cindex inter-library dependencies |
| |
| By definition, every shared library system provides a way for |
| executables to depend on libraries, so that symbol resolution is |
| deferred until runtime. |
| |
| An @dfn{inter-library dependency} is one in which a library depends on |
| other libraries. For example, if the libtool library @file{libhello} |
| uses the @code{cos} function, then it has an inter-library dependency |
| on @file{libm}, the math library that implements @code{cos}. |
| |
| Some shared library systems provide this feature in an |
| internally-consistent way: these systems allow chains of dependencies of |
| potentially infinite length. |
| |
| However, most shared library systems are restricted in that they only |
| allow a single level of dependencies. In these systems, programs may |
| depend on shared libraries, but shared libraries may not depend on other |
| shared libraries. |
| |
| In any event, libtool provides a simple mechanism for you to declare |
| inter-library dependencies: for every library @file{lib@var{name}} that |
| your own library depends on, simply add a corresponding |
| @code{-l@var{name}} option to the link line when you create your |
| library. To make an example of our |
| @file{libhello} that depends on @file{libm}: |
| |
| @example |
| burger$ @kbd{libtool gcc -g -O -o libhello.la foo.lo hello.lo \ |
| -rpath /usr/local/lib -lm} |
| burger$ |
| @end example |
| |
| When you link a program against @file{libhello}, you don't need to |
| specify the same @samp{-l} options again: libtool will do that for you, |
| in order to guarantee that all the required libraries are found. This |
| restriction is only necessary to preserve compatibility with static |
| library systems and simple dynamic library systems. |
| |
| Some platforms, such as AIX, do not even allow you this |
| flexibility. In order to build a shared library, it must be entirely |
| self-contained (that is, have references only to symbols that are found |
| in the @samp{.lo} files or the specified @samp{-l} libraries), and you |
| need to specify the @var{-no-undefined} flag. By default, libtool |
| builds only static libraries on these kinds of platforms. |
| |
| The simple-minded inter-library dependency tracking code of libtool |
| releases prior to 1.2 was disabled because it was not clear when it was |
| possible to link one library with another, and complex failures would |
| occur. A more complex implementation of this concept was re-introduced |
| before release 1.3, but it has not been ported to all platforms that |
| libtool supports. The default, conservative behavior is to avoid |
| linking one library with another, introducing their inter-dependencies |
| only when a program is linked with them. |
| |
| @node Dlopened modules |
| @chapter Dlopened modules |
| @findex dlopen |
| @findex dlsym |
| @findex dlclose |
| @findex shl_load |
| @cindex dynamic linking, applications |
| @cindex dlopening modules |
| @cindex modules, dynamic |
| @cindex application-level dynamic linking |
| |
| It can sometimes be confusing to discuss @dfn{dynamic linking}, because |
| the term is used to refer to two different concepts: |
| |
| @enumerate 1 |
| @item |
| Compiling and linking a program against a shared library, which is |
| resolved automatically at run time by the dynamic linker. In this |
| process, dynamic linking is transparent to the application. |
| |
| @item |
| The application calling functions such as @code{dlopen},@footnote{HP-UX, |
| to be different, uses a function named @code{shl_load}.} which load |
| arbitrary, user-specified modules at runtime. This type of dynamic |
| linking is explicitly controlled by the application. |
| @end enumerate |
| |
| To mitigate confusion, this manual refers to the second type of dynamic |
| linking as @dfn{dlopening} a module. |
| |
| The main benefit to dlopening object modules is the ability to access |
| compiled object code to extend your program, rather than using an |
| interpreted language. In fact, dlopen calls are frequently used in |
| language interpreters to provide an efficient way to extend the |
| language. |
| |
| As of version @value{VERSION}, libtool provides support for dlopened |
| modules. However, you should indicate that your package is willing to |
| use such support, by using the macro @samp{AC_LIBTOOL_DLOPEN} in |
| @file{configure.in}. If this macro is not used (or it is used |
| @emph{after} @samp{AC_PROG_LIBTOOL}), libtool will assume no dlopening |
| mechanism is available, and will try to simulate it. |
| |
| This chapter discusses how you as a dlopen application developer might |
| use libtool to generate dlopen-accessible modules. |
| |
| @menu |
| * Building modules:: Creating dlopenable objects and libraries. |
| * Dlpreopening:: Dlopening that works on static platforms. |
| * Finding the dlname:: Choosing the right file to @code{dlopen}. |
| * Dlopen issues:: Unresolved problems that need your attention. |
| @end menu |
| |
| @node Building modules |
| @section Building modules to dlopen |
| |
| On some operating systems, a program symbol must be specially declared |
| in order to be dynamically resolved with the @code{dlsym} (or |
| equivalent) function. |
| |
| Libtool provides the @samp{-export-dynamic} and @samp{-module} |
| link flags (@pxref{Link mode}), which do this declaration. |
| You need to use these flags if you are linking an application program that |
| dlopens other modules or a libtool library that will also be dlopened. |
| |
| For example, if we wanted to build a shared library, @file{libhello}, |
| that would later be dlopened by an application, we would add |
| @samp{-module} to the other link flags: |
| |
| @example |
| burger$ @kbd{libtool gcc -module -o libhello.la foo.lo \ |
| hello.lo -rpath /usr/local/lib -lm} |
| burger$ |
| @end example |
| |
| If symbols from your @emph{executable} are needed to satisfy unresolved |
| references in a library you want to dlopen you will have to use the flag |
| @samp{-export-dynamic}. |
| You should use @samp{-export-dynamic} while linking the executable that calls |
| dlopen: |
| |
| @example |
| burger$ @kbd{libtool gcc -export-dynamic -o hell-dlopener main.o} |
| burger$ |
| @end example |
| |
| @node Dlpreopening |
| @section Dlpreopening |
| |
| Libtool provides special support for dlopening libtool object and |
| libtool library files, so that their symbols can be resolved @emph{even |
| on platforms without any @code{dlopen} and @code{dlsym} |
| functions}. |
| |
| Consider the following alternative ways of loading code into your |
| program, in order of increasing ``laziness'': |
| |
| @enumerate 1 |
| @item |
| Linking against object files that become part of the program executable, |
| whether or not they are referenced. If an object file cannot be found, |
| then the linker refuses to create the executable. |
| |
| @item |
| Declaring a static library to the linker, so that it is searched at link |
| time in order to satisfy any undefined references in the above object |
| files. If the static library cannot be found, then the linker refuses |
| to link the executable. |
| |
| @item |
| Declaring a shared library to the runtime linker, so that it is searched |
| at runtime in order to satisfy any undefined references in the above |
| files. If the shared library cannot be found, then the dynamic linker |
| aborts the program before it runs. |
| |
| @item |
| Dlopening a module, so that the application can resolve its own, |
| dynamically-computed references. If there is an error opening the |
| module, or the module is not found, then the application can recover |
| without crashing. |
| @end enumerate |
| |
| Libtool emulates @samp{-dlopen} on static platforms by linking objects |
| into the program at compile time, and creating data structures that |
| represent the program's symbol table. |
| |
| In order to use this feature, you must declare the objects you want your |
| application to dlopen by using the @samp{-dlopen} or @samp{-dlpreopen} |
| flags when you link your program (@pxref{Link mode}). |
| |
| @deftypefn {Structure} {struct} lt_dlsymlist @{ @w{const char *@var{name};} @w{lt_ptr @var{address};} @} |
| The @var{name} attribute is a null-terminated character string of the |
| symbol name, such as @code{"fprintf"}. The @var{address} attribute is a |
| generic pointer to the appropriate object, such as @code{&fprintf}. |
| @end deftypefn |
| |
| @deftypevar {const lt_dlsymlist *} lt_preloaded_symbols |
| An array of @var{lt_symbol} structures, representing all the preloaded |
| symbols linked into the program. For each @samp{-dlpreloaded} file |
| there is an element with the @var{name} of the file and a @var{address} |
| of @code{0}, followed by all symbols exported from this file. |
| For the executable itself the special name @@PROGRAM@@ is used. |
| The last element has a @var{name} and @var{address} of @code{0}. |
| @end deftypevar |
| |
| Some compilers may allow identifiers which are not valid in ANSI C, such |
| as dollar signs. Libtool only recognizes valid ANSI C symbols (an |
| initial ASCII letter or underscore, followed by zero or more ASCII |
| letters, digits, and underscores), so non-ANSI symbols will not appear |
| in @var{lt_preloaded_symbols}. |
| |
| @node Finding the dlname |
| @section Finding the correct name to dlopen |
| @cindex names of dynamic modules |
| @cindex dynamic modules, names |
| |
| After a library has been linked with @samp{-module}, it can be dlopened. |
| Unfortunately, because of the variation in library names, |
| your package needs to determine the correct file to dlopen. |
| |
| The most straightforward and flexible implementation is to determine the |
| name at runtime, by finding the installed @samp{.la} file, and searching |
| it for the following lines: |
| |
| @example |
| # The name that we can @code{dlopen}. |
| dlname='@var{dlname}' |
| @end example |
| |
| If @var{dlname} is empty, then the library cannot be dlopened. |
| Otherwise, it gives the dlname of the library. So, if the library was |
| installed as @file{/usr/local/lib/libhello.la}, and the @var{dlname} was |
| @file{libhello.so.3}, then @file{/usr/local/lib/libhello.so.3} should be |
| dlopened. |
| |
| If your program uses this approach, then it should search the |
| directories listed in the @code{LD_LIBRARY_PATH}@footnote{@code{LIBPATH} |
| on AIX, and @code{SHLIB_PATH} on HP-UX.} environment variable, as well as |
| the directory where libraries will eventually be installed. Searching |
| this variable (or equivalent) will guarantee that your program can find |
| its dlopened modules, even before installation, provided you have linked |
| them using libtool. |
| |
| @node Dlopen issues |
| @section Unresolved dlopen issues |
| @cindex pitfalls with dlopen |
| @cindex dlopening, pitfalls |
| @cindex trouble with dlopen |
| |
| The following problems are not solved by using libtool's dlopen support: |
| |
| @itemize @bullet |
| @item |
| Dlopen functions are generally only available on shared library |
| platforms. If you want your package to be portable to static platforms, |
| you have to use either libltdl (@pxref{Using libltdl}) or develop your |
| own alternatives to dlopening dynamic code. |
| Most reasonable solutions involve writing wrapper functions for the |
| @code{dlopen} family, which do package-specific tricks when dlopening |
| is unsupported or not available on a given platform. |
| |
| @item |
| There are major differences in implementations of the @code{dlopen} |
| family of functions. Some platforms do not even use the same function |
| names (notably HP-UX, with its @code{shl_load} family). |
| |
| @item |
| The application developer must write a custom search function in order |
| to discover the correct module filename to supply to @code{dlopen}. |
| @end itemize |
| |
| @node Using libltdl |
| @chapter Using libltdl |
| @findex libltdl |
| @findex dlopen |
| @findex dlsym |
| @findex dlclose |
| @findex dlerror |
| @findex shl_load |
| @cindex dynamic linking, applications |
| @cindex dlopening modules |
| @cindex modules, dynamic |
| @cindex application-level dynamic linking |
| |
| Libtool provides a small library, called @file{libltdl}, that aims at |
| hiding the various difficulties of dlopening libraries from programmers. |
| It consists of a header-file and a small C source file that can be |
| distributed with applications that need dlopening functionality. On |
| some platforms, whose dynamic linkers are too limited for a simple |
| implementation of @file{libltdl} services, it requires GNU DLD, or it |
| will only emulate dynamic linking with libtool's dlpreopening mechanism. |
| |
| @noindent |
| libltdl supports currently the following dynamic linking mechanisms: |
| |
| @itemize @bullet |
| @item |
| @code{dlopen} (Solaris, Linux and various BSD flavors) |
| @item |
| @code{shl_load} (HP-UX) |
| @item |
| @code{LoadLibrary} (Win16 and Win32) |
| @item |
| @code{load_add_on} (BeOS) |
| @item |
| GNU DLD (emulates dynamic linking for static libraries) |
| @item |
| libtool's dlpreopen (see @pxref{Dlpreopening}) |
| @end itemize |
| |
| @noindent |
| libltdl is licensed under the terms of the GNU Library General Public License, |
| with the following exception: |
| |
| @quotation |
| As a special exception to the GNU Lesser General Public License, |
| if you distribute this file as part of a program or library that |
| is built using GNU libtool, you may include it under the same |
| distribution terms that you use for the rest of that program. |
| @end quotation |
| |
| @menu |
| * Libltdl interface:: How to use libltdl in your programs. |
| * Modules for libltdl:: Creating modules that can be @code{dlopen}ed. |
| * Thread Saftey in libltdl:: Registering callbacks for multi-thread safety. |
| * User defined module data:: Associating data with loaded modules. |
| * Module loaders for libltdl:: Creating user defined module loaders. |
| * Distributing libltdl:: How to distribute libltdl with your package. |
| @end menu |
| |
| @node Libltdl interface |
| @section How to use libltdl in your programs |
| |
| @noindent |
| The libltdl API is similar to the dlopen interface of Solaris and Linux, |
| which is very simple but powerful. |
| |
| @noindent |
| To use libltdl in your program you have to include the header file @file{ltdl.h}: |
| |
| @example |
| #include <ltdl.h> |
| @end example |
| |
| @noindent |
| The last release of libltdl used some symbols that violated the |
| @sc{posix} namespace conventions. These symbols are now deprecated, |
| and have been replaced by those described here. If you have code that |
| relies on the old deprecated symbol names, defining |
| @samp{LT_NON_POSIX_NAMESPACE} before you include @file{ltdl.h} provides |
| conversion macros. Whichever set of symbols you use, the new api is |
| not binary compatible with the last, so you will need to recompile |
| your application in order to use this version of libltdl. |
| |
| @noindent |
| Note that libltdl is not threadsafe, i.e. a multithreaded application |
| has to use a mutex for libltdl. It was reported that GNU/Linux's glibc |
| 2.0's @code{dlopen} with @samp{RTLD_LAZY} (which libltdl uses by |
| default) is not thread-safe, but this problem is supposed to be fixed in |
| glibc 2.1. On the other hand, @samp{RTLD_NOW} was reported to introduce |
| problems in multi-threaded applications on FreeBSD. Working around |
| these problems is left as an exercise for the reader; contributions are |
| certainly welcome. |
| |
| @noindent |
| The following types are defined in @file{ltdl.h}: |
| |
| @deftp {Type} lt_ptr |
| @code{lt_ptr} is a generic pointer. |
| @end deftp |
| |
| @deftp {Type} lt_dlhandle |
| @code{lt_dlhandle} is a module "handle". |
| Every lt_dlopened module has a handle associated with it. |
| @end deftp |
| |
| @deftp {Type} lt_dlsymlist |
| @code{lt_dlsymlist} is a symbol list for dlpreopened modules. |
| This structure is described in @pxref{Dlpreopening}. |
| @end deftp |
| |
| @page |
| @noindent |
| libltdl provides the following functions: |
| |
| @deftypefun int lt_dlinit (void) |
| Initialize libltdl. |
| This function must be called before using libltdl |
| and may be called several times. |
| Return 0 on success, otherwise the number of errors. |
| @end deftypefun |
| |
| @deftypefun int lt_dlexit (void) |
| Shut down libltdl and close all modules. |
| This function will only then shut down libltdl when it was called as |
| many times as @code{lt_dlinit} has been successfully called. |
| Return 0 on success, otherwise the number of errors. |
| @end deftypefun |
| |
| @deftypefun lt_dlhandle lt_dlopen (const char *@var{filename}) |
| Open the module with the file name @var{filename} and return a |
| handle for it. @code{lt_dlopen} is able to open libtool dynamic |
| modules, preloaded static modules, the program itself and |
| native dynamic libraries. |
| |
| Unresolved symbols in the module are resolved using its dependency |
| libraries (not implemented yet) and previously dlopened modules. If the |
| executable using this module was linked with the @code{-export-dynamic} |
| flag, then the global symbols in the executable will also be used to |
| resolve references in the module. |
| |
| If @var{filename} is @code{NULL} and the program was linked with |
| @code{-export-dynamic} or @code{-dlopen self}, @code{lt_dlopen} will |
| return a handle for the program itself, which can be used to access its |
| symbols. |
| |
| If libltdl cannot find the library and the file name @var{filename} does |
| not have a directory component it will additionally search in the |
| following search paths for the module (in the order as follows): |
| |
| @enumerate 1 |
| @item user-defined search path: |
| This search path can be changed by the program using the |
| functions @code{lt_dlsetsearchpath}, @code{lt_dladdsearchdir} and |
| @code{lt_dlinsertsearchdir}. |
| |
| @item libltdl's search path: |
| This search path is the value of the environment variable |
| @var{LTDL_LIBRARY_PATH}. |
| |
| @item system library search path: |
| The system dependent library search path |
| (e.g. on Linux it is @var{LD_LIBRARY_PATH}). |
| @end enumerate |
| |
| Each search path must be a colon-separated list of absolute directories, |
| for example, @code{"/usr/lib/mypkg:/lib/foo"}. |
| |
| If the same module is loaded several times, the same handle is returned. |
| If @code{lt_dlopen} fails for any reason, it returns @code{NULL}. |
| @end deftypefun |
| |
| @deftypefun lt_dlhandle lt_dlopenext (const char *@var{filename}) |
| The same as @code{lt_dlopen}, except that it tries to append |
| different file name extensions to the file name. |
| If the file with the file name @var{filename} cannot be found |
| libltdl tries to append the following extensions: |
| |
| @enumerate 1 |
| @item the libtool archive extension @samp{.la} |
| @item the extension used for native dynamic libraries on the host platform, |
| e.g., @samp{.so}, @samp{.sl}, etc. |
| @end enumerate |
| |
| This lookup strategy was designed to allow programs that don't |
| have knowledge about native dynamic libraries naming conventions |
| to be able to @code{dlopen} such libraries as well as libtool modules |
| transparently. |
| @end deftypefun |
| |
| @deftypefun int lt_dlclose (lt_dlhandle @var{handle}) |
| Decrement the reference count on the module @var{handle}. |
| If it drops to zero and no other module depends on this module, |
| then the module is unloaded. |
| Return 0 on success. |
| @end deftypefun |
| |
| @deftypefun lt_ptr lt_dlsym (lt_dlhandle @var{handle}, const char *@var{name}) |
| Return the address in the module @var{handle}, where the symbol given |
| by the null-terminated string @var{name} is loaded. |
| If the symbol cannot be found, @code{NULL} is returned. |
| @end deftypefun |
| |
| @deftypefun {const char *} lt_dlerror (void) |
| Return a human readable string describing the most |
| recent error that occurred from any of libltdl's functions. |
| Return @code{NULL} if no errors have occurred since initialization |
| or since it was last called. |
| @end deftypefun |
| |
| @deftypefun int lt_dlpreload (const lt_dlsymlist *@var{preloaded}) |
| Register the list of preloaded modules @var{preloaded}. |
| If @var{preloaded} is @code{NULL}, then all previously registered |
| symbol lists, except the list set by @code{lt_dlpreload_default}, |
| are deleted. Return 0 on success. |
| @end deftypefun |
| |
| @deftypefun int lt_dlpreload_default (const lt_dlsymlist *@var{preloaded}) |
| Set the default list of preloaded modules to @var{preloaded}, which |
| won't be deleted by @code{lt_dlpreload}. Note that this function does |
| @emph{not} require libltdl to be initialized using @code{lt_dlinit} and |
| can be used in the program to register the default preloaded modules. |
| Instead of calling this function directly, most programs will use the |
| macro @code{LTDL_SET_PRELOADED_SYMBOLS}. |
| |
| Return 0 on success. |
| @end deftypefun |
| |
| @defmac LTDL_SET_PRELOADED_SYMBOLS |
| Set the default list of preloaded symbols. |
| Should be used in your program to initialize libltdl's |
| list of preloaded modules. |
| |
| @example |
| #include <ltdl.h> |
| |
| int main() @{ |
| /* ... */ |
| LTDL_SET_PRELOADED_SYMBOLS(); |
| /* ... */ |
| @} |
| @end example |
| @end defmac |
| |
| @deftypefun int lt_dladdsearchdir (const char *@var{search_dir}) |
| Append the search directory @var{search_dir} to the current user-defined |
| library search path. Return 0 on success. |
| @end deftypefun |
| |
| @deftypefun int lt_dlinsertsearchdir (@w{const char *@var{before}}, @w{const char *@var{search_dir}}) |
| Insert the search directory @var{search_dir} into the user-defined library |
| search path, immediately before the element starting at address |
| @var{before}. If @var{before} is @samp{NULL}, then @var{search_dir} is |
| appending as if @code{lt_dladdsearchdir} had been called. Return 0 on success. |
| @end deftypefun |
| |
| @deftypefun int lt_dlsetsearchpath (const char *@var{search_path}) |
| Replace the current user-defined library search path with |
| @var{search_path}, which must be a colon-separated list of absolute |
| directories. Return 0 on success. |
| @end deftypefun |
| |
| @deftypefun {const char *}lt_dlgetsearchpath (void) |
| Return the current user-defined library search path. |
| @end deftypefun |
| |
| @deftypefun int lt_dlforeachfile (@w{const char *@var{search_path}}, @w{int (*@var{func}) (const char *@var{filename}, lt_ptr @var{data})}, @w{lt_ptr @var{data}}) |
| In some applications you may not want to load individual modules with |
| known names, but rather find all of the modules in a set of |
| directories and load them all during initialisation. With this function |
| you can have libltdl scan the colon delimited directory list in |
| @var{search_path} for candidates, and pass them, along with @var{data} |
| to your own callback function, @var{func}. If @var{seach_path} is |
| @samp{NULL}, then search all of the standard locations that |
| @code{lt_dlopen} would examine. This function will continue to make |
| calls to @var{func} for each file that it discovers in @var{search_path} |
| until one of these calls returns non-zero, or until the files are |
| exhausted. @samp{lt_dlforeachfile} returns value returned by the last |
| call made to @var{func}. |
| |
| For example you could define @var{func} to build an ordered |
| @dfn{argv}-like vector of files using @var{data} to hold the address of |
| the start of the vector. |
| @end deftypefun |
| |
| @deftypefun int lt_dlmakeresident (lt_dlhandle @var{handle}) |
| Mark a module so that it cannot be @samp{lt_dlclose}d. This can be |
| useful if a module implements some core functionality in your project, |
| which would cause your code to crash if removed. Return 0 on success. |
| |
| If you use @samp{lt_dlopen (NULL)} to get a @var{handle} for the running |
| binary, that handle will always be marked as resident, and consequently |
| cannot be successfully @samp{lt_dlclose}d. |
| @end deftypefun |
| |
| @deftypefun int lt_dlisresident (lt_dlhandle @var{handle}) |
| Check whether a particular module has been marked as resident, returning 1 |
| if it has or 0 otherwise. If there is an error while executing this |
| function, return -1 and set an error message for retrieval with |
| @code{lt_dlerror}. |
| @end deftypefun |
| |
| @deftypevar {lt_ptr (*) (size_t @var{size})} lt_dlmalloc |
| @deftypevarx {void (*) (lt_ptr @var{ptr})} lt_dlfree |
| These variables are set to @code{malloc} and @code{free}, by default, |
| but you can set them to any other functions that provides equivalent |
| functionality. However, you must not modify their values after calling |
| any libltdl function other than @code{lt_dlpreopen_default} or the macro |
| @code{LTDL_SET_PRELOADED_SYMBOLS}. |
| @end deftypevar |
| |
| @node Modules for libltdl |
| @section Creating modules that can be @code{dlopen}ed |
| |
| Libtool modules are like normal libtool libraries with a few exceptions: |
| |
| You have to link the module with libtool's @samp{-module} switch, |
| and you should link any program that is intended to dlopen the module with |
| @samp{-dlopen modulename.la} so that libtool can dlpreopen the module |
| on platforms which don't support dlopening. If the module depends on any |
| other libraries, make sure you specify them either when you link the module |
| or when you link programs that dlopen it. |
| If you want to disable @pxref{Versioning} for a specific module |
| you should link it with the @samp{-avoid-version} switch. |
| Note that libtool modules don't need to have a "lib" prefix. |
| However, automake 1.4 or higher is required to build such modules. |
| |
| Usually a set of modules provide the same interface, i.e, exports the same |
| symbols, so that a program can dlopen them without having to know more |
| about their internals. |
| In order to avoid symbol conflicts all exported symbols must be prefixed |
| with "modulename_LTX_" (@samp{modulename} is the name of the module). |
| Internal symbols must be named in such a way that they won't conflict |
| with other modules, for example, by prefixing them with "_modulename_". |
| Although some platforms support having the same symbols defined more than |
| once it is generally not portable and it makes it impossible to dlpreopen |
| such modules. libltdl will automatically cut the prefix off to get |
| the real name of the symbol. Additionally, it supports modules which |
| don't use a prefix so that you can also dlopen non-libtool modules. |
| |
| @file{foo1.c} gives an example of a portable libtool module. |
| Exported symbols are prefixed with "foo1_LTX_", internal symbols |
| with "_foo1_". Aliases are defined at the beginning so that the code |
| is more readable. |
| |
| @example |
| /* aliases for the exported symbols */ |
| #define foo foo1_LTX_foo |
| #define bar foo1_LTX_bar |
| |
| /* a global variable definition */ |
| int bar = 1; |
| |
| /* a private function */ |
| int _foo1_helper() @{ |
| return bar; |
| @} |
| |
| /* an exported function */ |
| int foo() @{ |
| return _foo1_helper(); |
| @} |
| @end example |
| |
| @noindent |
| The @file{Makefile.am} contains the necessary rules to build the |
| module @file{foo1.la}: |
| |
| @example |
| ... |
| lib_LTLIBRARIES = foo1.la |
| |
| foo1_la_SOURCES = foo1.c |
| foo1_la_LDFLAGS = -module |
| ... |
| @end example |
| |
| |
| @node Thread Saftey in libltdl |
| @section Using libtldl in a multi threaded environment |
| |
| Using the @code{lt_dlmutex_register()} function, and by providing some |
| appropriate callback function definitions, libltdl can be used in a |
| multi-threaded environment. |
| |
| @deftypefn {Type} void lt_dlmutex_lock (void) |
| This is the type of a function pointer holding the address of a function |
| which will be called at the start of parts of the libltdl implementation |
| code which require a mutex lock. |
| |
| Because libltdl is inherantly recursive, it is important that the |
| locking mechanism employed by these callback functions are reentrant, or |
| else strange problems will occur. |
| @end deftypefn |
| |
| @deftypefn {Type} void lt_dlmutex_unlock (void) |
| The type of a matching unlock function. |
| @end deftypefn |
| |
| @deftypefn {Type} void lt_dlmutex_seterror @w{(const char *@var{error});} |
| Many of the functions in the libltdl @sc{api} have a special return |
| value to indicate to the client that an error has occured. Normally (in |
| single threaded applications) a string describing that error can be |
| retrieved from internal storage with @code{lt_dlerror()}. |
| |
| A function of this type must be registered with the library in order for |
| it to work in a multi-threaded context. The function should store any |
| error message passed in thread local storage. |
| @end deftypefn |
| |
| @deftypefn {Type} {const char *} lt_dlmutex_geterror (void) |
| The type of a matching callback function to retrieve the last stored |
| error message from thread local storage. |
| |
| When regeistered correctly this function will be used by |
| @code{lt_dlerror())} from all threads to retrieve error messages for the |
| client. |
| @end deftypefn |
| |
| @deftypefn {Function} int lt_dlmutex_register (@w{lt_dlmutex_lock *@var{lock}}, @w{lt_dlmutex_unlock *@var{unlock}}, @w{lt_dlmutex_set_error *@var{seterror}}, @w{lt_dlmutex_geterror *@var{geterror})} |
| Use this function to register one of each of function ttypes described |
| above in preparation for multi-threaded use of libltdl. All arguments |
| must be valid non-@code{NULL} function addresses, or else all |
| @code{NULL} to return to single threaded operation. |
| @end deftypefn |
| |
| |
| @node User defined module data |
| @section Data associated with loaded modules |
| |
| Some of the internal information about each loaded module that is |
| maintained by libltdl is available to the user, in the form of this |
| structure: |
| |
| @deftypefn {Type} {struct} lt_dlinfo @{ @w{char *@var{filename};} @w{char *@var{name};} @w{int @var{ref_count};} @} |
| @code{lt_dlinfo} is used to store information about a module. |
| The @var{filename} attribute is a null-terminated character string of |
| the real module file name. If the module is a libtool module then |
| @var{name} is its module name (e.g. @code{"libfoo"} for |
| @code{"dir/libfoo.la"}), otherwise it is set to @code{NULL}. The |
| @var{ref_count} attribute is a reference counter that describes how |
| often the same module is currently loaded. |
| @end deftypefn |
| |
| The following function will return a pointer to libltdl's internal copy |
| of this structure for the given @var{handle}: |
| |
| @deftypefun {const lt_dlinfo *} lt_dlgetinfo (@w{lt_dlhandle @var{handle}}) |
| Return a pointer to a struct that contains some information about |
| the module @var{handle}. The contents of the struct must not be modified. |
| Return @code{NULL} on failure. |
| @end deftypefun |
| |
| Furthermore, in order to save you from having to keep a list of the |
| handles of all the modules you have loaded, these functions allow you to |
| iterate over libltdl's list of loaded modules: |
| |
| @deftypefun int lt_dlforeach (@w{int (*@var{func}) (lt_dlhandle @var{handle}, lt_ptr @var{data})}, @w{lt_ptr @var{data}}) |
| For each loaded module call the function @var{func}. The argument |
| @var{handle} is the handle of one of the loaded modules, @var{data} is |
| the @var{data} argument passed to @code{lt_dlforeach}. |
| As soon as @var{func} returns a non-zero value for one of the handles, |
| @code{lt_dlforeach} will stop calling @var{func} and immediately return 1. |
| Otherwise 0 is returned. |
| @end deftypefun |
| |
| @deftypefun lt_dlhandle lt_dlhandle_next (@w{lt_dlhandle place}) |
| Iterate over the loaded module handles, returning the first handle in the |
| list if @var{place} is @code{NULL}, and the next one on subsequent calls. |
| If @var{place} is the last element in the list of loaded modules, this |
| function returns @code{NULL}. |
| @end deftypefun |
| |
| Of course, you would still need to maintain your own list of loaded |
| module handles to parallel the list maintained by libltdl if there are |
| any other data that you need to associate with each handle for the |
| purposes of your application. However, if you use the following |
| @sc{api} calls to associate your application data with individual module |
| handles as they are loaded there is actually no need to do that. You |
| must first obtain a unique caller id from libltdl which you subsequently |
| use to retrieve the data you stored earlier. This allows for different |
| libraries that each wish to store their own data against loaded modules |
| to do so without interfering with one another's data. |
| |
| @deftp {Type} lt_dlcaller_id |
| The opaque type used to hold individual data set keys. |
| @end deftp |
| |
| @deftypefun lt_dlcaller_id lt_dlcaller_register (void) |
| Use this to obtain a unique key to store and retrieve individual sets of |
| per module data. |
| @end deftypefun |
| |
| @deftypefun lt_ptr lt_dlcaller_set_data (@w{lt_dlcaller_id @var{key}}, @w{lt_dlhandle @var{handle}}, @w{lt_ptr @var{data}}) |
| Set @var{data} as the set of data uniquely associated with @var{key} and |
| @var{handle} for later retrieval. This function returns the @var{data} |
| previously associated with @var{key} and @var{handle} if any. A result of |
| 0, may indicate that a diagnostic for the last error (if any) is available |
| from @code{lt_dlerror()}. |
| |
| For example, to correctly remove some associated data: |
| |
| @example |
| lt_ptr stale = lt_dlcaller_set_data (key, handle, 0); |
| if (stale == NULL) |
| @{ |
| char *error_msg = lt_dlerror (); |
| |
| if (error_msg != NULL) |
| @{ |
| my_error_handler (error_msg); |
| return STATUS_FAILED; |
| @} |
| @} |
| else |
| @{ |
| free (stale); |
| @} |
| @end example |
| @end deftypefun |
| |
| @deftypefun lt_ptr lt_dlcaller_get_data (@w{lt_dlcaller_id @var{key}}, @w{lt_dlhandle @var{handle}}) |
| Return the address of the data associated with @var{key} and |
| @var{handle}, or else @code{NULL} if there is none. |
| @end deftypefun |
| |
| The preceding functions can be combined with @code{lt_dlforeach} to |
| implement search and apply operations without the need for your |
| application to track the modules that have been loaded and unloaded: |
| |
| @example |
| int |
| my_dlcaller_callback (lt_dlhandle handle, lt_ptr key_ptr) |
| @{ |
| struct my_module_data *my_data; |
| |
| my_data = lt_dlcaller_get_data (handle, (lt_dlcaller_id) *key_ptr); |
| |
| return process (my_data); |
| @} |
| |
| int |
| my_dlcaller_foreach (lt_dlcaller_id key) |
| @{ |
| lt_dlforeach (my_dlcaller_callback, (lt_ptr) &key); |
| @} |
| @end example |
| |
| |
| @node Module loaders for libltdl |
| @section How to create and register new module loaders |
| |
| Sometimes libltdl's many ways of gaining access to modules are not |
| sufficient for the purposes of a project. You can write your own |
| loader, and register it with libltdl so that @code{lt_dlopen} will be |
| able to use it. |
| |
| Writing a loader involves writing at least three functions which can be |
| called by @code{lt_dlopen}, @code{lt_dlsym} and @code{lt_dlclose}. |
| Optionally, you can provide a finalisation function to perform any |
| cleanup operations when @code{lt_dlexit} executes, and a symbol prefix |
| string which will be prepended to any symbols passed to @code{lt_dlsym}. |
| These functions must match the function pointer types below, after |
| which they can be allocated to an instance of @code{lt_user_dlloader} |
| and registered. |
| |
| Registering the loader requires that you choose a name for it, so that it |
| can be recognised by @code{lt_dlloader_find} and removed with |
| @code{lt_dlloader_remove}. The name you choose must be unique, and not |
| already in use by libltdl's builtin loaders: |
| |
| @table @asis |
| @item "dlopen" |
| The system dynamic library loader, if one exists. |
| @item "dld" |
| The @sc{gnu} dld loader, if @file{libdld} was installed when libltdl was |
| built. |
| @item "dlpreload" |
| The loader for @code{lt_dlopen}ing of preloaded static modules. |
| @end table |
| |
| The prefix "dl" is reserved for loaders supplied with future versions of |
| libltdl, so you should not use that for your own loader names. |
| |
| @noindent |
| The following types are defined in @file{ltdl.h}: |
| |
| @deftp {Type} lt_module |
| @code{lt_module} is a dlloader dependent module. |
| The dynamic module loader extensions communicate using these low |
| level types. |
| @end deftp |
| |
| @deftp {Type} lt_dlloader |
| @code{lt_dlloader} is a handle for module loader types. |
| @end deftp |
| |
| @deftp {Type} lt_user_data |
| @code{lt_user_data} is used for specifying loader instance data. |
| @end deftp |
| |
| @deftypefn {Type} {struct} lt_user_dlloader @{@w{const char *@var{sym_prefix};} @w{lt_module_open *@var{module_open};} @w{lt_module_close *@var{module_close};} @w{lt_find_sym *@var{find_sym};} @w{lt_dlloader_exit *@var{dlloader_exit};} @} |
| If you want to define a new way to open dynamic modules, and have the |
| @code{lt_dlopen} @sc{api} use it, you need to instantiate one of these |
| structures and pass it to @code{lt_dlloader_add}. You can pass whatever |
| you like in the @var{dlloader_data} field, and it will be passed back as |
| the value of the first parameter to each of the functions specified in |
| the function pointer fields. |
| @end deftypefn |
| |
| @deftypefn {Type} lt_module lt_module_open (@w{const char *@var{filename}}) |
| The type of the loader function for an @code{lt_dlloader} module |
| loader. The value set in the dlloader_data field of the @code{struct |
| lt_user_dlloader} structure will be passed into this function in the |
| @var{loader_data} parameter. Implementation of such a function should |
| attempt to load the named module, and return an @code{lt_module} |
| suitable for passing in to the associated @code{lt_module_close} and |
| @code{lt_sym_find} function pointers. If the function fails it should |
| return @code{NULL}, and set the error message with @code{lt_dlseterror}. |
| @end deftypefn |
| |
| @deftypefn {Type} int lt_module_close (@w{lt_user_data @var{loader_data},} @w{lt_module @var{module}}) |
| The type of the unloader function for a user defined module loader. |
| Implementatation of such a function should attempt to release |
| any resources tied up by the @var{module} module, and then unload it |
| from memory. If the function fails for some reason, set the error |
| message with @code{lt_dlseterror} and return non-zero. |
| @end deftypefn |
| |
| @deftypefn {Type} lt_ptr lt_find_sym (@w{lt_module @var{module},} @w{const char *@var{symbol}}) |
| The type of the symbol lookup function for a user defined module loader. |
| Implementation of such a function should return the address of the named |
| @var{symbol} in the module @var{module}, or else set the error message |
| with @code{lt_dlseterror} and return @code{NULL} if lookup fails. |
| @end deftypefn |
| |
| @deftypefn {Type} int lt_dlloader_exit (@w{lt_user_data @var{loader_data}}) |
| The type of the finalisation function for a user defined module loader. |
| Implementation of such a function should free any resources associated |
| with the loader, including any user specified data in the |
| @code{dlloader_data} field of the @code{lt_user_dlloader}. If non-@code{NULL}, |
| the function will be called by @code{lt_dlexit}, and |
| @code{lt_dlloader_remove}. |
| @end deftypefn |
| |
| For example: |
| |
| @example |
| int |
| register_myloader (void) |
| @{ |
| lt_user_dlloader dlloader; |
| |
| /* User modules are responsible for their own initialisation. */ |
| if (myloader_init () != 0) |
| return MYLOADER_INIT_ERROR; |
| |
| dlloader.sym_prefix = NULL; |
| dlloader.module_open = myloader_open; |
| dlloader.module_close = myloader_close; |
| dlloader.find_sym = myloader_find_sym. |
| dlloader.dlloader_exit = myloader_exit; |
| dlloader.dlloader_data = (lt_user_data)myloader_function; |
| |
| /* Add my loader as the default module loader. */ |
| if (lt_dlloader_add (lt_dlloader_next (NULL), &dlloader, "myloader") != 0) |
| return ERROR; |
| |
| return OK; |
| @} |
| @end example |
| |
| Note that if there is any initialisation required for the loader, |
| it must be performed manually before the loader is registered -- |
| libltdl doesn't handle user loader initialisation. |
| |
| Finalisation @emph{is} handled by libltdl however, and it is important |
| to ensure the @code{dlloader_exit} callback releases any resources claimed |
| during the initialisation phase. |
| |
| @page |
| @noindent |
| libltdl provides the following functions for writing your own module |
| loaders: |
| |
| @deftypefun int lt_dlloader_add (@w{lt_dlloader *@var{place},} @w{lt_user_dlloader *@var{dlloader},} @w{const char *@var{loader_name}}) |
| Add a new module loader to the list of all loaders, either as the |
| last loader (if @var{place} is @code{NULL}), else immediately before the |
| loader passed as @var{place}. @var{loader_name} will be returned by |
| @code{lt_dlloader_name} if it is subsequently passed a newly |
| registered loader. These @var{loader_name}s must be unique, or |
| @code{lt_dlloader_remove} and @code{lt_dlloader_find} cannot |
| work. Returns 0 for success. |
| |
| @example |
| @{ |
| /* Make myloader be the last one. */ |
| if (lt_dlloader_add (NULL, myloader) != 0) |
| perror (lt_dlerror ()); |
| @} |
| @end example |
| @end deftypefun |
| |
| @deftypefun int lt_dlloader_remove (@w{const char *@var{loader_name}}) |
| Remove the loader identified by the unique name, @var{loader_name}. |
| Before this can succeed, all modules opened by the named loader must |
| have been closed. Returns 0 for success, otherwise an error message can |
| be obtained from @code{lt_dlerror}. |
| |
| @example |
| @{ |
| /* Remove myloader. */ |
| if (lt_dlloader_remove ("myloader") != 0) |
| perror (lt_dlerror ()); |
| @} |
| @end example |
| @end deftypefun |
| |
| @deftypefun {lt_dlloader *}lt_dlloader_next (@w{lt_dlloader *@var{place}}) |
| Iterate over the module loaders, returning the first loader if @var{place} is |
| @code{NULL}, and the next one on subsequent calls. The handle is for use with |
| @code{lt_dlloader_add}. |
| |
| @example |
| @{ |
| /* Make myloader be the first one. */ |
| if (lt_dlloader_add (lt_dlloader_next (NULL), myloader) != 0) |
| return ERROR; |
| @} |
| @end example |
| @end deftypefun |
| |
| @deftypefun {lt_dlloader *}lt_dlloader_find (@w{const char *@var{loader_name}}) |
| Return the first loader with a matching @var{loader_name} identifier, or else |
| @code{NULL}, if the identifier is not found. |
| |
| The identifiers which may be used by libltdl itself, if the host |
| architecture supports them are @dfn{dlopen}@footnote{This is used for |
| the host dependent module loading @sc{api} -- @code{shl_load} and |
| @code{LoadLibrary} for example}, @dfn{dld} and @dfn{dlpreload}. |
| |
| @example |
| @{ |
| /* Add a user loader as the next module loader to be tried if |
| the standard dlopen loader were to fail when lt_dlopening. */ |
| if (lt_dlloader_add (lt_dlloader_find ("dlopen"), myloader) != 0) |
| return ERROR; |
| @} |
| @end example |
| @end deftypefun |
| |
| @deftypefun {const char *}lt_dlloader_name (@w{lt_dlloader *@var{place}}) |
| Return the identifying name of @var{PLACE}, as obtained from |
| @code{lt_dlloader_next} or @code{lt_dlloader_find}. If this function fails, |
| it will return @code{NULL} and set an error for retrieval with |
| @code{lt_dlerror}. |
| @end deftypefun |
| |
| @deftypefun {lt_user_data *}lt_dlloader_data (@w{lt_dlloader *@var{place}}) |
| Return the address of the @code{dlloader_data} of @var{PLACE}, as |
| obtained from @code{lt_dlloader_next} or @code{lt_dlloader_find}. If |
| this function fails, it will return @code{NULL} and set an error for |
| retrieval with @code{lt_dlerror}. |
| @end deftypefun |
| |
| @subsection Error handling within user module loaders |
| |
| @deftypefun int lt_dladderror (@w{const char *@var{diagnostic}}) |
| This function allows you to integrate your own error messages into |
| @code{lt_dlerror}. Pass in a suitable diagnostic message for return by |
| @code{lt_dlerror}, and an error identifier for use with |
| @code{lt_dlseterror} is returned. |
| |
| If the allocation of an identifier fails, this function returns -1. |
| |
| @example |
| int myerror = lt_dladderror ("Doh!"); |
| if (myerror < 0) |
| perror (lt_dlerror ()); |
| @end example |
| @end deftypefun |
| |
| @deftypefun int lt_dlseterror (@w{int @var{errorcode}}) |
| When writing your own module loaders, you should use this function to |
| raise errors so that they are propogated through the @code{lt_dlerror} |
| interface. All of the standard errors used by libltdl are declared in |
| @file{ltdl.h}, or you can add more of your own with |
| @code{lt_dladderror}. This function returns 0 on success. |
| |
| @example |
| if (lt_dlseterror (LTDL_ERROR_NO_MEMORY) != 0) |
| perror (lt_dlerror ()); |
| @end example |
| @end deftypefun |
| |
| @node Distributing libltdl |
| @section How to distribute libltdl with your package |
| |
| Even though libltdl is installed together with libtool, you may wish to |
| include libltdl in the distribution of your package, for the convenience |
| of users of your package that don't have libtool or libltdl installed. |
| In this case, you must decide whether to manually add the @code{ltdl} |
| objects to your package, or else which flavor of libltdl you want to use: |
| a convenience library or an installable libtool library. |
| |
| The most simplistic way to add @code{libltdl} to your package is to copy |
| the source files, @file{ltdl.c} and @file{ltdl.h}, to a source directory |
| withing your package and to build and link them along with the rest of |
| your sources. To help you do this, the m4 macros for autoconf are |
| available in @file{ltdl.m4}. You must ensure that they are available in |
| @file{aclocal.m4} before you run autoconf -- by appending the contents |
| of @file{ltdl.m4} to @file{acinclude.m4}, if you are using automake, or |
| to @file{aclocal.m4} if you are not. Having made the macros available, |
| you must add a call to the @samp{AC_LIB_LTDL} macro to your package's |
| @file{configure.in} to perform the configure time checks required to |
| build @file{ltdl.o} correctly. This method has problems if you then try |
| to link the package binaries with an installed libltdl, or a library |
| which depends on libltdl: you may have problems with duplicate symbol |
| definitions. |
| |
| One advantage of the convenience library is that it is not installed, so |
| the fact that you use libltdl will not be apparent to the user, and it |
| will not overwrite a pre-installed version of libltdl a user might have. |
| On the other hand, if you want to upgrade libltdl for any reason |
| (e.g. a bugfix) you'll have to recompile your package instead of just |
| replacing an installed version of libltdl. |
| However, if your programs or libraries are linked with other libraries |
| that use such a pre-installed version of libltdl, you may get linker |
| errors or run-time crashes. Another problem is that you cannot link the |
| convenience library into more than one libtool library, then link a |
| single program with these libraries, because you may get duplicate |
| symbols. In general you can safely use the convenience library in programs |
| which don't depend on other libraries that might use libltdl too. |
| In order to enable this flavor of libltdl, you should add the |
| line @samp{AC_LIBLTDL_CONVENIENCE} to your @file{configure.in}, |
| @emph{before} @samp{AC_PROG_LIBTOOL}. |
| |
| In order to select the installable version of libltdl, you should add a |
| call of the macro @samp{AC_LIBLTDL_INSTALLABLE} to your |
| @file{configure.in} @emph{before} @samp{AC_PROG_LIBTOOL}. This macro |
| will check whether libltdl is already installed and, if not, request the |
| libltdl embedded in your package to be built and installed. Note, |
| however, that no version checking is performed. The user may override |
| the test and determine that the libltdl embedded must be installed, |
| regardless of the existence of another version, using the configure |
| switch @samp{--enable-ltdl-install}. |
| |
| In order to embed libltdl into your package, just add @samp{--ltdl} to |
| the @code{libtoolize} command line. It will copy the libltdl sources |
| to a subdirectory @samp{libltdl} in your package. |
| Both macros accept an optional argument to specify the location |
| of the @samp{libltdl} directory. By the default both macros assume that it |
| is @samp{$@{top_srcdir@}/libltdl}. |
| |
| Whatever macro you use, it is up to you to ensure that your |
| @file{configure.in} will configure libltdl, using |
| @samp{AC_CONFIG_SUBDIRS}, and that your @file{Makefile}s will start |
| sub-makes within libltdl's directory, using automake's @var{SUBDIRS}, |
| for example. Both macros define the shell variables @var{LIBLTDL}, to |
| the link flag that you should use to link with libltdl, and |
| @var{LTDLINCL}, to the preprocessor flag that you should use to compile |
| with programs that include @file{ltdl.h}. It is up to you to use |
| @samp{AC_SUBST} to ensure that this variable will be available in |
| @file{Makefile}s, or add them to variables that are @samp{AC_SUBST}ed by |
| default, such as @var{LIBS} and @var{CPPFLAGS}. |
| |
| If you're using the convenience libltdl, @var{LIBLTDL} will be the |
| pathname for the convenience version of libltdl and @var{LTDLINCL} will be |
| @samp{-I} followed by the directory that contains libltdl, both starting |
| with @samp{$@{top_builddir@}/} or @samp{$@{top_srcdir@}/}, respectively. |
| |
| If you request an installed version of libltdl and one is |
| found@footnote{Even if libltdl is installed, |
| @samp{AC_LIBLTDL_INSTALLABLE} may fail to detect it, if libltdl depends |
| on symbols provided by libraries other than the C library. In this |
| case, it will needlessly build and install libltdl.}, @var{LIBLTDL} will |
| be set to @samp{-lltdl} and @var{LTDLINCL} will be empty (which is just a |
| blind assumption that @file{ltdl.h} is somewhere in the include path if |
| libltdl is in the library path). If an installable version of libltdl |
| must be built, its pathname, starting with @samp{$@{top_builddir@}/}, |
| will be stored in @var{LIBLTDL}, and @var{LTDLINCL} will be set just like |
| in the case of convenience library. |
| |
| So, when you want to link a program with libltdl, be it a convenience, |
| installed or installable library, just compile with @samp{$(LTDLINCL)} |
| and link it with @samp{$(LIBLTDL)}, using libtool. |
| |
| You should probably also add @samp{AC_LIBTOOL_DLOPEN} to your |
| @file{configure.in} @emph{before} @samp{AC_PROG_LIBTOOL}, otherwise |
| libtool will assume no dlopening mechanism is supported, and revert to |
| dlpreopening, which is probably not what you want. |
| |
| Avoid using the @code{-static} or @code{-all-static} switches when |
| linking programs with libltdl. This will not work on all platforms, |
| because the dlopening functions may not be available for static linking. |
| |
| The following example shows you how to embed the convenience libltdl in |
| your package. In order to use the installable variant just replace |
| @samp{AC_LIBLTDL_CONVENIENCE} with @samp{AC_LIBLTDL_INSTALLABLE}. We |
| assume that libltdl was embedded using @samp{libtoolize --ltdl}. |
| |
| configure.in: |
| @example |
| ... |
| dnl Enable building of the convenience library |
| dnl and set LIBLTDL accordingly |
| AC_LIBLTDL_CONVENIENCE |
| dnl Substitute LTDLINCL and LIBLTDL in the Makefiles |
| AC_SUBST(LTDLINCL) |
| AC_SUBST(LIBLTDL) |
| dnl Check for dlopen support |
| AC_LIBTOOL_DLOPEN |
| dnl Configure libtool |
| AC_PROG_LIBTOOL |
| dnl Configure libltdl |
| AC_CONFIG_SUBDIRS(libltdl) |
| ... |
| @end example |
| |
| Makefile.am: |
| @example |
| ... |
| SUBDIRS = libltdl |
| |
| INCLUDES = $(LTDLINCL) |
| |
| myprog_LDFLAGS = -export-dynamic |
| # The quotes around -dlopen below fool automake <= 1.4 into accepting it |
| myprog_LDADD = $(LIBLTDL) "-dlopen" self "-dlopen" foo1.la |
| myprog_DEPENDENCIES = $(LIBLTDL) foo1.la |
| ... |
| @end example |
| |
| @node Other languages |
| @chapter Using libtool with other languages |
| @cindex C, not using |
| @cindex languages, non-C |
| @cindex C++, using |
| |
| Libtool was first implemented in order to add support for writing shared |
| libraries in the C language. However, over time, libtool is being |
| integrated with other languages, so that programmers are free to reap |
| the benefits of shared libraries in their favorite programming language. |
| |
| This chapter describes how libtool interacts with other languages, |
| and what special considerations you need to make if you do not use C. |
| |
| @menu |
| * C++ libraries:: |
| @end menu |
| |
| @node C++ libraries |
| @section Writing libraries for C++ |
| @c FIXME: in the TOC, the ++ is too large (seems to be math mode) |
| @cindex trouble with C++ |
| @cindex pitfalls using C++ |
| @cindex C++, pitfalls |
| |
| Creating libraries of C++ code should be a fairly straightforward |
| process, because its object files differ from C ones in only three ways: |
| |
| @enumerate 1 |
| @item |
| Because of name mangling, C++ libraries are only usable by the C++ |
| compiler that created them. This decision was made by the designers of |
| C++ in order to protect users from conflicting implementations of |
| features such as constructors, exception handling, and RTTI. |
| |
| @item |
| On some systems, the C++ compiler must take special actions for the |
| dynamic linker to run dynamic (i.e., run-time) initializers. This means |
| that we should not call @file{ld} directly to link such libraries, and |
| we should use the C++ compiler instead. |
| |
| @item |
| C++ compilers will link some Standard C++ library in by default, but |
| libtool does not know which are these libraries, so it cannot even run |
| the inter-library dependence analyzer to check how to link it in. |
| Therefore, running @file{ld} to link a C++ program or library is deemed |
| to fail. |
| @end enumerate |
| |
| Because of these three issues, Libtool has been designed to always use |
| the C++ compiler to compile and link C++ programs and libraries. In |
| some instances the @code{main()} function of a program must also be |
| compiled with the C++ compiler for static C++ objects to be properly |
| initialized. |
| |
| |
| @node Troubleshooting |
| @chapter Troubleshooting |
| @cindex troubleshooting |
| @cindex problems, solving |
| @cindex solving problems |
| @cindex problems, blaming somebody else for |
| |
| Libtool is under constant development, changing to remain up-to-date |
| with modern operating systems. If libtool doesn't work the way you |
| think it should on your platform, you should read this chapter to help |
| determine what the problem is, and how to resolve it. |
| |
| @menu |
| * Libtool test suite:: Libtool's self-tests. |
| * Reporting bugs:: How to report problems with libtool. |
| @end menu |
| |
| @node Libtool test suite |
| @section The libtool test suite |
| @cindex test suite |
| |
| Libtool comes with its own set of programs that test its capabilities, |
| and report obvious bugs in the libtool program. These tests, too, are |
| constantly evolving, based on past problems with libtool, and known |
| deficiencies in other operating systems. |
| |
| As described in the @file{INSTALL} file, you may run @kbd{make check} |
| after you have built libtool (possibly before you install it) in order |
| to make sure that it meets basic functional requirements. |
| |
| @menu |
| * Test descriptions:: The contents of the test suite. |
| * When tests fail:: What to do when a test fails. |
| @end menu |
| |
| @node Test descriptions |
| @subsection Description of test suite |
| |
| Here is a list of the current programs in the test suite, and what they |
| test for: |
| |
| @table @file |
| |
| @item cdemo-conf.test |
| @itemx cdemo-exec.test |
| @itemx cdemo-make.test |
| @itemx cdemo-static.test |
| @itemx cdemo-shared.test |
| @pindex cdemo-conf.test |
| @pindex cdemo-exec.test |
| @pindex cdemo-make.test |
| @pindex cdemo-static.test |
| @pindex cdemo-shared.test |
| These programs check to see that the @file{cdemo} subdirectory of the |
| libtool distribution can be configured and built correctly. |
| |
| The @file{cdemo} subdirectory contains a demonstration of libtool |
| convenience libraries, a mechanism that allows build-time static |
| libraries to be created, in a way that their components can be later |
| linked into programs or other libraries, even shared ones. |
| |
| The tests @file{cdemo-make.test} and @file{cdemo-exec.test} are executed |
| three times, under three different libtool configurations: |
| @file{cdemo-conf.test} configures @file{cdemo/libtool} to build both |
| static and shared libraries (the default for platforms that support |
| both), @file{cdemo-static.test} builds only static libraries |
| (@samp{--disable-shared}), and @file{cdemo-shared.test} builds only |
| shared libraries (@samp{--disable-static}). |
| |
| @item demo-conf.test |
| @itemx demo-exec.test |
| @itemx demo-inst.test |
| @itemx demo-make.test |
| @itemx demo-unst.test |
| @itemx demo-static.test |
| @itemx demo-shared.test |
| @itemx demo-nofast.test |
| @itemx demo-pic.test |
| @itemx demo-nopic.test |
| @pindex demo-conf.test |
| @pindex demo-exec.test |
| @pindex demo-inst.test |
| @pindex demo-make.test |
| @pindex demo-unst.test |
| @pindex demo-static.test |
| @pindex demo-shared.test |
| @pindex demo-nofast.test |
| @pindex demo-pic.test |
| @pindex demo-nopic.test |
| These programs check to see that the @file{demo} subdirectory of the |
| libtool distribution can be configured, built, installed, and |
| uninstalled correctly. |
| |
| The @file{demo} subdirectory contains a demonstration of a trivial |
| package that uses libtool. The tests @file{demo-make.test}, |
| @file{demo-exec.test}, @file{demo-inst.test} and |
| @file{demo-unst.test} are executed four times, under four different |
| libtool configurations: @file{demo-conf.test} configures |
| @file{demo/libtool} to build both static and shared libraries, |
| @file{demo-static.test} builds only static libraries |
| (@samp{--disable-shared}), and @file{demo-shared.test} builds only |
| shared libraries (@samp{--disable-static}). |
| @file{demo-nofast.test} configures @file{demo/libtool} to |
| disable the fast-install mode (@samp{--enable-fast-install=no}). |
| @file{demo-pic.test} configures @file{demo/libtool} to |
| prefer building PIC code (@samp{--with-pic}), @file{demo-nopic.test} |
| to prefer non-PIC code (@samp{--without-pic}). |
| |
| @item deplibs.test |
| @pindex deplibs.test |
| Many systems cannot link static libraries into shared libraries. |
| libtool uses a @code{deplibs_check_method} to prevent such cases. |
| This tests checks whether libtool's @code{deplibs_check_method} |
| works properly. |
| |
| @item hardcode.test |
| @pindex hardcode.test |
| On all systems with shared libraries, the location of the library can be |
| encoded in executables that are linked against it @pxref{Linking |
| executables}. This test checks the conditions under which your system |
| linker hardcodes the library location, and guarantees that they |
| correspond to libtool's own notion of how your linker behaves. |
| |
| @item build-relink.test |
| @pindex build-relink.test |
| Checks whether variable @var{shlibpath_overrides_runpath} is properly |
| set. If the test fails and @var{VERBOSE} is set, it will indicate what |
| the variable should have been set to. |
| |
| @item noinst-link.test |
| @pindex noinst-link.test |
| Checks whether libtool will not try to link with a previously installed |
| version of a library when it should be linking with a just-built one. |
| |
| @item depdemo-conf.test |
| @itemx depdemo-exec.test |
| @itemx depdemo-inst.test |
| @itemx depdemo-make.test |
| @itemx depdemo-unst.test |
| @itemx depdemo-static.test |
| @itemx depdemo-shared.test |
| @itemx depdemo-nofast.test |
| @pindex depdemo-conf.test |
| @pindex depdemo-exec.test |
| @pindex depdemo-inst.test |
| @pindex depdemo-make.test |
| @pindex depdemo-unst.test |
| @pindex depdemo-static.test |
| @pindex depdemo-shared.test |
| @pindex depdemo-nofast.test |
| These programs check to see that the @file{depdemo} subdirectory of the |
| libtool distribution can be configured, built, installed, and |
| uninstalled correctly. |
| |
| The @file{depdemo} subdirectory contains a demonstration of inter-library |
| dependencies with libtool. The test programs link some interdependent |
| libraries. |
| |
| The tests @file{depdemo-make.test}, @file{depdemo-exec.test}, |
| @file{depdemo-inst.test} and @file{depdemo-unst.test} are executed |
| four times, under four different libtool configurations: |
| @file{depdemo-conf.test} configures @file{depdemo/libtool} to build both |
| static and shared libraries, @file{depdemo-static.test} builds only static |
| libraries (@samp{--disable-shared}), and @file{depdemo-shared.test} builds |
| only shared libraries (@samp{--disable-static}). |
| @file{depdemo-nofast.test} configures @file{depdemo/libtool} to |
| disable the fast-install mode (@samp{--enable-fast-install=no}. |
| |
| @item mdemo-conf.test |
| @itemx mdemo-exec.test |
| @itemx mdemo-inst.test |
| @itemx mdemo-make.test |
| @itemx mdemo-unst.test |
| @itemx mdemo-static.test |
| @itemx mdemo-shared.test |
| @pindex mdemo-conf.test |
| @pindex mdemo-exec.test |
| @pindex mdemo-inst.test |
| @pindex mdemo-make.test |
| @pindex mdemo-unst.test |
| @pindex mdemo-static.test |
| @pindex mdemo-shared.test |
| These programs check to see that the @file{mdemo} subdirectory of the |
| libtool distribution can be configured, built, installed, and |
| uninstalled correctly. |
| |
| The @file{mdemo} subdirectory contains a demonstration of a package that |
| uses libtool and the system independent dlopen wrapper @file{libltdl} to |
| load modules. The library @file{libltdl} provides a dlopen wrapper for |
| various platforms (Linux, Solaris, HP/UX etc.) including support for |
| dlpreopened modules (@pxref{Dlpreopening}). |
| |
| The tests @file{mdemo-make.test}, @file{mdemo-exec.test}, |
| @file{mdemo-inst.test} and @file{mdemo-unst.test} are executed |
| three times, under three different libtool configurations: |
| @file{mdemo-conf.test} configures @file{mdemo/libtool} to build both |
| static and shared libraries, @file{mdemo-static.test} builds only static |
| libraries (@samp{--disable-shared}), and @file{mdemo-shared.test} builds |
| only shared libraries (@samp{--disable-static}). |
| |
| @item dryrun.test |
| @pindex dryrun.test |
| This test checks whether libtool's @code{--dry-run} mode works properly. |
| |
| @item assign.test |
| @pindex assign.test |
| Checks whether we don't put break or continue on the same |
| line as an assignment in the libtool script. |
| |
| @item link.test |
| @pindex link.test |
| This test guarantees that linking directly against a non-libtool static |
| library works properly. |
| |
| @item link-2.test |
| @pindex link-2.test |
| This test makes sure that files ending in @samp{.lo} are never linked |
| directly into a program file. |
| |
| @item nomode.test |
| @pindex nomode.test |
| Check whether we can actually get help for libtool. |
| |
| @item quote.test |
| @pindex quote.test |
| This program checks libtool's metacharacter quoting. |
| |
| @item sh.test |
| @pindex sh.test |
| Checks whether a `test' command was forgotten in libtool. |
| |
| @item suffix.test |
| @pindex suffix.test |
| When other programming languages are used with libtool (@pxref{Other |
| languages}), the source files may end in suffixes other than @samp{.c}. |
| This test validates that libtool can handle suffixes for all the file |
| types that it supports, and that it fails when the suffix is invalid. |
| |
| @end table |
| |
| @node When tests fail |
| @subsection When tests fail |
| @cindex failed tests |
| @cindex tests, failed |
| |
| Each of the above tests are designed to produce no output when they are |
| run via @kbd{make check}. The exit status of each program tells the |
| @file{Makefile} whether or not the test succeeded. |
| |
| If a test fails, it means that there is either a programming error in |
| libtool, or in the test program itself. |
| |
| To investigate a particular test, you may run it directly, as you would |
| a normal program. When the test is invoked in this way, it produces |
| output which may be useful in determining what the problem is. |
| |
| Another way to have the test programs produce output is to set the |
| @var{VERBOSE} environment variable to @samp{yes} before running them. |
| For example, @kbd{env VERBOSE=yes make check} runs all the tests, and |
| has each of them display debugging information. |
| |
| @node Reporting bugs |
| @section Reporting bugs |
| @cindex bug reports |
| @cindex reporting bugs |
| @cindex problem reports |
| |
| If you think you have discovered a bug in libtool, you should think |
| twice: the libtool maintainer is notorious for passing the buck (or |
| maybe that should be ``passing the bug''). Libtool was invented to fix |
| known deficiencies in shared library implementations, so, in a way, most |
| of the bugs in libtool are actually bugs in other operating systems. |
| However, the libtool maintainer would definitely be happy to add support |
| for somebody else's buggy operating system. [I wish there was a good |
| way to do winking smiley-faces in Texinfo.] |
| |
| Genuine bugs in libtool include problems with shell script portability, |
| documentation errors, and failures in the test suite (@pxref{Libtool |
| test suite}). |
| |
| First, check the documentation and help screens to make sure that the |
| behaviour you think is a problem is not already mentioned as a feature. |
| |
| Then, you should read the Emacs guide to reporting bugs (@pxref{Bugs, , |
| Reporting Bugs, emacs, The Emacs Manual}). Some of the details |
| listed there are specific to Emacs, but the principle behind them is a |
| general one. |
| |
| Finally, send a bug report to @value{BUGADDR} with any appropriate |
| @emph{facts}, such as test suite output (@pxref{When tests fail}), all |
| the details needed to reproduce the bug, and a brief description of why |
| you think the behaviour is a bug. Be sure to include the word |
| ``libtool'' in the subject line, as well as the version number you are |
| using (which can be found by typing @kbd{libtool --version}). |
| |
| @node Maintaining |
| @chapter Maintenance notes for libtool |
| |
| This chapter contains information that the libtool maintainer finds |
| important. It will be of no use to you unless you are considering |
| porting libtool to new systems, or writing your own libtool. |
| |
| @menu |
| * New ports:: How to port libtool to new systems. |
| * Tested platforms:: When libtool was last tested. |
| * Platform quirks:: Information about different library systems. |
| * libtool script contents:: Configuration information that libtool uses. |
| * Cheap tricks:: Making libtool maintainership easier. |
| @end menu |
| |
| @node New ports |
| @section Porting libtool to new systems |
| |
| Before you embark on porting libtool to an unsupported system, it is |
| worthwhile to send e-mail to @value{MAILLIST}, to make sure that you are |
| not duplicating existing work. |
| |
| If you find that any porting documentation is missing, please complain! |
| Complaints with patches and improvements to the documentation, or to |
| libtool itself, are more than welcome. |
| |
| @menu |
| * Information sources:: Where to find relevant documentation |
| * Porting inter-library dependencies:: Implementation details explained |
| @end menu |
| |
| @node Information sources |
| @subsection Information sources |
| |
| Once it is clear that a new port is necessary, you'll generally need the |
| following information: |
| |
| @table @asis |
| @item canonical system name |
| You need the output of @code{config.guess} for this system, so that you |
| can make changes to the libtool configuration process without affecting |
| other systems. |
| |
| @item man pages for @code{ld} and @code{cc} |
| These generally describe what flags are used to generate PIC, to create |
| shared libraries, and to link against only static libraries. You may |
| need to follow some cross references to find the information that is |
| required. |
| |
| @item man pages for @code{ld.so}, @code{rtld}, or equivalent |
| These are a valuable resource for understanding how shared libraries are |
| loaded on the system. |
| |
| @item man page for @code{ldconfig}, or equivalent |
| This page usually describes how to install shared libraries. |
| |
| @item output from @kbd{ls -l /lib /usr/lib} |
| This shows the naming convention for shared libraries on the system, |
| including which names should be symbolic links. |
| |
| @item any additional documentation |
| Some systems have special documentation on how to build and install |
| shared libraries. |
| @end table |
| |
| If you know how to program the Bourne shell, then you can complete the |
| port yourself; otherwise, you'll have to find somebody with the relevant |
| skills who will do the work. People on the libtool mailing list are |
| usually willing to volunteer to help you with new ports, so you can send |
| the information to them. |
| |
| To do the port yourself, you'll definitely need to modify the |
| @code{libtool.m4} macros in order to make platform-specific changes to |
| the configuration process. You should search that file for the |
| @code{PORTME} keyword, which will give you some hints on what you'll |
| need to change. In general, all that is involved is modifying the |
| appropriate configuration variables (@pxref{libtool script contents}). |
| |
| Your best bet is to find an already-supported system that is similar to |
| yours, and make your changes based on that. In some cases, however, |
| your system will differ significantly from every other supported system, |
| and it may be necessary to add new configuration variables, and modify |
| the @code{ltmain.in} script accordingly. Be sure to write to the |
| mailing list before you make changes to @code{ltmain.in}, since they may |
| have advice on the most effective way of accomplishing what you want. |
| |
| @node Porting inter-library dependencies |
| @subsection Porting inter-library dependencies support |
| @cindex inter-library dependency |
| @vindex deplibs_check_method |
| |
| Since version 1.2c, libtool has re-introduced the ability to do |
| inter-library dependency on some platforms, thanks to a patch by Toshio |
| Kuratomi @email{badger@@prtr-13.ucsc.edu}. Here's a shortened version |
| of the message that contained his patch: |
| |
| The basic architecture is this: in @file{libtool.m4}, the person who |
| writes libtool makes sure @samp{$deplibs} is included in |
| @samp{$archive_cmds} somewhere and also sets the variable |
| @samp{$deplibs_check_method}, and maybe @samp{$file_magic_cmd} when |
| @samp{deplibs_check_method} is file_magic. |
| |
| @samp{deplibs_check_method} can be one of five things: |
| @table @samp |
| @item file_magic [@var{regex}] |
| @vindex file_magic |
| @vindex file_magic_cmd |
| @vindex file_magic_test_file |
| looks in the library link path for libraries that have the right |
| libname. Then it runs @samp{$file_magic_cmd} on the library and checks |
| for a match against @var{regex} using @code{egrep}. When |
| @var{file_magic_test_file} is set by @file{libtool.m4}, it is used as an |
| argument to @samp{$file_magic_cmd} in order to verify whether the |
| regular expression matches its output, and warn the user otherwise. |
| |
| @item test_compile |
| @vindex test_compile |
| just checks whether it is possible to link a program out of a list of |
| libraries, and checks which of those are listed in the output of |
| @code{ldd}. It is currently unused, and will probably be dropped in the |
| future. |
| |
| @item pass_all |
| @vindex pass_all |
| will pass everything without any checking. This may work on platforms |
| in which code is position-independent by default and inter-library |
| dependencies are properly supported by the dynamic linker, for example, |
| on DEC OSF/1 3 and 4. |
| |
| @item none |
| @vindex none |
| It causes deplibs to be reassigned deplibs="". That way |
| @samp{archive_cmds} can contain deplibs on all platforms, but not have |
| deplibs used unless needed. |
| |
| @item unknown |
| @vindex unknown |
| is the default for all systems unless overridden in @file{libtool.m4}. |
| It is the same as @samp{none}, but it documents that we really don't |
| know what the correct value should be, and we welcome patches that |
| improve it. |
| @end table |
| |
| Then in @file{ltmain.in} we have the real workhorse: a little |
| initialization and postprocessing (to setup/release variables for use |
| with eval echo libname_spec etc.) and a case statement that decides |
| which method is being used. This is the real code... I wish I could |
| condense it a little more, but I don't think I can without function |
| calls. I've mostly optimized it (moved things out of loops, etc) but |
| there is probably some fat left. I thought I should stop while I was |
| ahead, work on whatever bugs you discover, etc before thinking about |
| more than obvious optimizations. |
| |
| @node Tested platforms |
| @section Tested platforms |
| |
| This table describes when libtool was last known to be tested on |
| platforms where it claims to support shared libraries: |
| |
| @example |
| @include PLATFORMS |
| @end example |
| |
| Note: The vendor-distributed HP-UX @code{sed}(1) programs are horribly |
| broken, and cannot handle libtool's requirements, so users may report |
| unusual problems. There is no workaround except to install a working |
| @code{sed} (such as GNU @code{sed}) on these systems. |
| |
| Note: The vendor-distributed NCR MP-RAS @code{cc} programs emits |
| copyright on standard error that confuse tests on size of |
| @file{conftest.err}. The workaround is to specify @code{CC} |
| when run @code{configure} with @kbd{CC='cc -Hnocopyr'}. |
| |
| @node Platform quirks |
| @section Platform quirks |
| |
| This section is dedicated to the sanity of the libtool maintainers. It |
| describes the programs that libtool uses, how they vary from system to |
| system, and how to test for them. |
| |
| Because libtool is a shell script, it can be difficult to understand |
| just by reading it from top to bottom. This section helps show why |
| libtool does things a certain way. Combined with the scripts |
| themselves, you should have a better sense of how to improve libtool, or |
| write your own. |
| |
| @menu |
| * References:: Finding more information. |
| * Compilers:: Creating object files from source files. |
| * Reloadable objects:: Binding object files together. |
| * Multiple dependencies:: Removing duplicate dependant libraries. |
| * Archivers:: Programs that create static archives. |
| @end menu |
| |
| @node References |
| @subsection References |
| |
| The following is a list of valuable documentation references: |
| |
| @itemize @bullet |
| @item |
| SGI's IRIX Manual Pages, which can be found at |
| @url{http://techpubs.sgi.com/cgi-bin/infosrch.cgi?cmd=browse&db=man}. |
| |
| @item |
| Sun's free service area |
| (@url{http://www.sun.com/service/online/free.html}) and documentation |
| server (@url{http://docs.sun.com/}). |
| |
| @item |
| Compaq's Tru64 UNIX online documentation is at |
| (@url{http://tru64unix.compaq.com/faqs/publications/pub_page/doc_list.html}) |
| with C++ documentation at |
| (@url{http://tru64unix.compaq.com/cplus/docs/index.htm}). |
| |
| @item |
| Hewlett-Packard has online documentation at |
| (@url{http://docs.hp.com/index.html}). |
| |
| @item |
| IBM has online documentation at |
| (@url{http://www.rs6000.ibm.com/resource/aix_resource/Pubs/}). |
| @end itemize |
| |
| @node Compilers |
| @subsection Compilers |
| |
| The only compiler characteristics that affect libtool are the flags |
| needed (if any) to generate PIC objects. In general, if a C compiler |
| supports certain PIC flags, then any derivative compilers support the |
| same flags. Until there are some noteworthy exceptions to this rule, |
| this section will document only C compilers. |
| |
| The following C compilers have standard command line options, regardless |
| of the platform: |
| |
| @table @code |
| @item gcc |
| |
| This is the GNU C compiler, which is also the system compiler for many |
| free operating systems (FreeBSD, GNU/Hurd, GNU/Linux, Lites, NetBSD, and |
| OpenBSD, to name a few). |
| |
| The @samp{-fpic} or @samp{-fPIC} flags can be used to generate |
| position-independent code. @samp{-fPIC} is guaranteed to generate |
| working code, but the code is slower on m68k, m88k, and Sparc chips. |
| However, using @samp{-fpic} on those chips imposes arbitrary size limits |
| on the shared libraries. |
| @end table |
| |
| The rest of this subsection lists compilers by the operating system that |
| they are bundled with: |
| |
| @c FIXME these should all be better-documented |
| |
| @table @code |
| @item aix3* |
| @itemx aix4* |
| Most AIX compilers have no PIC flags, since AIX (with the exception of |
| AIX for IA-64) runs on PowerPC and RS/6000 chips. @footnote{All code compiled |
| for the PowerPC and RS/6000 chips (@code{powerpc-*-*}, @code{powerpcle-*-*}, |
| and @code{rs6000-*-*}) is position-independent, regardless of the operating |
| system or compiler suite. So, ``regular objects'' can be used to build |
| shared libraries on these systems and no special PIC compiler flags are |
| required.} |
| |
| @item hpux10* |
| Use @samp{+Z} to generate PIC. |
| |
| @item osf3* |
| Digital/UNIX 3.x does not have PIC flags, at least not on the PowerPC |
| platform. |
| |
| @item solaris2* |
| Use @samp{-KPIC} to generate PIC. |
| |
| @item sunos4* |
| Use @samp{-PIC} to generate PIC. |
| @end table |
| |
| @node Reloadable objects |
| @subsection Reloadable objects |
| |
| On all known systems, a reloadable object can be created by running |
| @kbd{ld -r -o @var{output}.o @var{input1}.o @var{input2}.o}. This |
| reloadable object may be treated as exactly equivalent to other |
| objects. |
| |
| @node Multiple dependencies |
| @subsection Multiple dependencies |
| |
| On most modern platforms the order that dependent libraries are listed |
| has no effect on object generation. In theory, there are platforms |
| which require libraries which provide missing symbols to other libraries |
| to listed after those libraries whose symbols they provide. |
| |
| Particularly, if a pair of static archives each resolve some of the |
| other's symbols, it might be necessary to list one of those archives |
| both before and after the other one. Libtool does not currently cope |
| with this situation well, since dupicate libraries are removed from |
| the link line by default. Libtool provides the command line option |
| @samp{--preserve-dup-deps} to preserve all duplicate dependencies |
| in cases where it is necessary. |
| |
| @node Archivers |
| @subsection Archivers |
| |
| On all known systems, building a static library can be accomplished by |
| running @kbd{ar cru lib@var{name}.a @var{obj1}.o @var{obj2}.o @dots{}}, |
| where the @samp{.a} file is the output library, and each @samp{.o} file is an |
| object file. |
| |
| On all known systems, if there is a program named @code{ranlib}, then it |
| must be used to ``bless'' the created library before linking against it, |
| with the @kbd{ranlib lib@var{name}.a} command. Some systems, like Irix, |
| use the @code{ar ts} command, instead. |
| |
| @node libtool script contents |
| @section @code{libtool} script contents |
| @cindex implementation of libtool |
| @cindex libtool implementation |
| |
| Since version 1.4, the @code{libtool} script is generated by |
| @code{configure} (@pxref{Configuring}). In earlier versions, |
| @code{configure} achieved this by calling a helper script called |
| @file{ltconfig}. From libtool version 0.7 to 1.0, this script |
| simply set shell variables, then sourced the libtool backend, |
| @code{ltmain.sh}. @code{ltconfig} from libtool version 1.1 through 1.3 |
| inlined the contents of @code{ltmain.sh} into the generated |
| @code{libtool}, which improved performance on many systems. The tests |
| that @file{ltconfig} used to perform are now kept in @file{libtool.m4} |
| where thay can be written using Autoconf. This has the runtime |
| performance benefits of inlined @code{ltmain.sh}, @emph{and} improves |
| the build time a little while considerably easing the amount of raw |
| shell code that used to need maintaining. |
| |
| The convention used for naming variables which hold shell commands for |
| delayed evaluation, is to use the suffix @code{_cmd} where a single |
| line of valid shell script is needed, and the suffix @code{_cmds} where |
| multiple lines of shell script @strong{may} be delayed for later |
| evaluation. By convention, @code{_cmds} variables delimit the |
| evaluation units with the @code{~} character where necessary. |
| |
| Here is a listing of each of the configuration variables, and how they |
| are used within @code{ltmain.sh} (@pxref{Configuring}): |
| |
| @defvar AR |
| The name of the system library archiver. |
| @end defvar |
| |
| @defvar CC |
| The name of the C compiler used to configure libtool. |
| @end defvar |
| |
| @defvar LD |
| The name of the linker that libtool should use internally for reloadable |
| linking and possibly shared libraries. |
| @end defvar |
| |
| @defvar NM |
| The name of a BSD-compatible @code{nm} program, which produces listings |
| of global symbols in one the following formats: |
| |
| @example |
| @var{address} C @var{global-variable-name} |
| @var{address} D @var{global-variable-name} |
| @var{address} T @var{global-function-name} |
| @end example |
| @end defvar |
| |
| @defvar RANLIB |
| Set to the name of the ranlib program, if any. |
| @end defvar |
| |
| @defvar allow_undefined_flag |
| The flag that is used by @samp{archive_cmds} in order to declare that |
| there will be unresolved symbols in the resulting shared library. |
| Empty, if no such flag is required. Set to @samp{unsupported} if there |
| is no way to generate a shared library with references to symbols that |
| aren't defined in that library. |
| @end defvar |
| |
| @defvar always_export_symbols |
| Whether libtool should automatically generate a list of exported symbols |
| using @var{export_symbols_cmds} before linking an archive. |
| Set to @samp{yes} or @samp{no}. Default is @samp{no}. |
| @end defvar |
| |
| @defvar archive_cmds |
| @defvarx archive_expsym_cmds |
| @defvarx old_archive_cmds |
| Commands used to create shared libraries, shared libraries with |
| @samp{-export-symbols} and static libraries, respectively. |
| @end defvar |
| |
| @defvar old_archive_from_new_cmds |
| If the shared library depends on a static library, |
| @samp{old_archive_from_new_cmds} contains the commands used to create that |
| static library. If this variable is not empty, @samp{old_archive_cmds} is |
| not used. |
| @end defvar |
| |
| @defvar old_archive_from_expsyms_cmds |
| If a static library must be created from the export symbol list in order to |
| correctly link with a shared library, @samp{old_archive_from_expsyms_cmds} |
| contains the commands needed to create that static library. When these |
| commands are executed, the variable @var{soname} contains the name of the |
| shared library in question, and the @var{$objdir/$newlib} contains the |
| path of the static library these commands should build. After executing |
| these commands, libtool will proceed to link against @var{$objdir/$newlib} |
| instead of @var{soname}. |
| @end defvar |
| |
| @defvar build_libtool_libs |
| Whether libtool should build shared libraries on this system. Set to |
| @samp{yes} or @samp{no}. |
| @end defvar |
| |
| @defvar build_old_libs |
| Whether libtool should build static libraries on this system. Set to |
| @samp{yes} or @samp{no}. |
| @end defvar |
| |
| @defvar compiler_c_o |
| Whether the compiler supports the @code{-c} and @code{-o} options |
| simultaneously. Set to @samp{yes} or @samp{no}. |
| @end defvar |
| |
| @defvar compiler_o_lo |
| Whether the compiler supports compiling directly to a ".lo" file, |
| i.e whether object files do not have to have the suffix ".o". |
| Set to @samp{yes} or @samp{no}. |
| @end defvar |
| |
| @defvar dlopen_support |
| Whether @code{dlopen} is supported on the platform. |
| Set to @samp{yes} or @samp{no}. |
| @end defvar |
| |
| @defvar dlopen_self |
| Whether it is possible to @code{dlopen} the executable itself. |
| Set to @samp{yes} or @samp{no}. |
| @end defvar |
| |
| @defvar dlopen_self_static |
| Whether it is possible to @code{dlopen} the executable itself, when it |
| is linked statically (@samp{-all-static}). Set to @samp{yes} or |
| @samp{no}. |
| @end defvar |
| |
| @defvar echo |
| An @code{echo} program which does not interpret backslashes as an |
| escape character. |
| @end defvar |
| |
| @defvar exclude_expsyms |
| List of symbols that should not be listed in the preloaded symbols. |
| @end defvar |
| |
| @defvar export_dynamic_flag_spec |
| Compiler link flag that allows a dlopened shared library to reference |
| symbols that are defined in the program. |
| @end defvar |
| |
| @defvar export_symbols_cmds |
| Commands to extract exported symbols from @var{libobjs} to the |
| file @var{export_symbols}. |
| @end defvar |
| |
| @defvar extract_expsyms_cmds |
| Commands to extract the exported symbols list from a shared library. |
| These commands are executed if there is no file @var{$objdir/$soname-def}, |
| and should write the names of the exported symbols to that file, for |
| the use of @samp{old_archive_from_expsyms_cmds}. |
| @end defvar |
| |
| @defvar fast_install |
| Determines whether libtool will privilege the installer or the |
| developer. The assumption is that installers will seldom run programs |
| in the build tree, and the developer will seldom install. This is only |
| meaningful on platforms in which @var{shlibpath_overrides_runpath} is |
| not @samp{yes}, so @var{fast_install} will be set to @samp{needless} in |
| this case. If @var{fast_install} set to @samp{yes}, libtool will create |
| programs that search for installed libraries, and, if a program is run |
| in the build tree, a new copy will be linked on-demand to use the |
| yet-to-be-installed libraries. If set to @samp{no}, libtool will create |
| programs that use the yet-to-be-installed libraries, and will link |
| a new copy of the program at install time. The default value is |
| @samp{yes} or @samp{needless}, depending on platform and configuration |
| flags, and it can be turned from @samp{yes} to @samp{no} with the |
| configure flag @samp{--disable-fast-install}. |
| @end defvar |
| |
| @defvar finish_cmds |
| Commands to tell the dynamic linker how to find shared libraries in a |
| specific directory. |
| @end defvar |
| |
| @defvar finish_eval |
| Same as @var{finish_cmds}, except the commands are not displayed. |
| @end defvar |
| |
| @defvar fix_srcfile_path |
| Expression to fix the shell variable $srcfile for the compiler. |
| @end defvar |
| |
| @defvar global_symbol_pipe |
| A pipeline that takes the output of @var{NM}, and produces a listing of |
| raw symbols followed by their C names. For example: |
| |
| @example |
| $ @kbd{eval "$NM progname | $global_symbol_pipe"} |
| D @var{symbol1} @var{C-symbol1} |
| T @var{symbol2} @var{C-symbol2} |
| C @var{symbol3} @var{C-symbol3} |
| @dots{} |
| $ |
| @end example |
| |
| The first column contains the symbol type (used to tell data from code |
| on some platforms), but its meaning is system dependent. |
| @end defvar |
| |
| @defvar global_symbol_to_cdecl |
| A pipeline that translates the output of @var{global_symbol_pipe} into |
| proper C declarations. On platforms whose linkers differentiate code |
| from data, such as HP/UX, data symbols will be declared as such, and |
| code symbols will be declared as functions. On platforms that don't |
| care, everything is assumed to be data. |
| @end defvar |
| |
| @defvar hardcode_action |
| Either @samp{immediate} or @samp{relink}, depending on whether shared |
| library paths can be hardcoded into executables before they are installed, |
| or if they need to be relinked. |
| @end defvar |
| |
| @defvar hardcode_direct |
| Set to @samp{yes} or @samp{no}, depending on whether the linker |
| hardcodes directories if a library is directly specified on the command |
| line (such as @samp{@var{dir}/lib@var{name}.a}) when |
| @var{hardcode_libdir_flag_spec} is specified. |
| @end defvar |
| |
| @defvar hardcode_into_libs |
| Whether the platform supports hardcoding of run-paths into libraries. |
| If enabled, linking of programs will be much simpler but libraries will |
| need to be relinked during installation. Set to @samp{yes} or @samp{no}. |
| @end defvar |
| |
| @defvar hardcode_libdir_flag_spec |
| Flag to hardcode a @var{libdir} variable into a binary, so that the |
| dynamic linker searches @var{libdir} for shared libraries at runtime. |
| If it is empty, libtool will try to use some other hardcoding mechanism. |
| @end defvar |
| |
| @defvar hardcode_libdir_separator |
| If the compiler only accepts a single @var{hardcode_libdir_flag}, then |
| this variable contains the string that should separate multiple |
| arguments to that flag. |
| @end defvar |
| |
| @defvar hardcode_minus_L |
| Set to @samp{yes} or @samp{no}, depending on whether the linker |
| hardcodes directories specified by @samp{-L} flags into the resulting |
| executable when @var{hardcode_libdir_flag_spec} is specified. |
| @end defvar |
| |
| @defvar hardcode_shlibpath_var |
| Set to @samp{yes} or @samp{no}, depending on whether the linker |
| hardcodes directories by writing the contents of @samp{$shlibpath_var} |
| into the resulting executable when @var{hardcode_libdir_flag_spec} is |
| specified. Set to @samp{unsupported} if directories specified by |
| @samp{$shlibpath_var} are searched at run time, but not at link time. |
| @end defvar |
| |
| @defvar host |
| @defvarx host_alias |
| For information purposes, set to the specified and canonical names of |
| the system that libtool was configured for. |
| @end defvar |
| |
| @defvar include_expsyms |
| List of symbols that must always be exported when using @var{export_symbols}. |
| @end defvar |
| |
| @defvar libext |
| The standard old archive suffix (normally "a"). |
| @end defvar |
| |
| @defvar libname_spec |
| The format of a library name prefix. On all Unix systems, static |
| libraries are called @samp{lib@var{name}.a}, but on some systems (such |
| as OS/2 or MS-DOS), the library is just called @samp{@var{name}.a}. |
| @end defvar |
| |
| @defvar library_names_spec |
| A list of shared library names. The first is the name of the file, |
| the rest are symbolic links to the file. The name in the list is |
| the file name that the linker finds when given @samp{-l@var{name}}. |
| @end defvar |
| |
| @defvar link_all_deplibs |
| Whether libtool must link a program against all its dependency libraries. |
| Set to @samp{yes} or @samp{no}. Default is @samp{unknown}, which is |
| a synonym for @samp{yes}. |
| @end defvar |
| |
| @defvar link_static_flag |
| Linker flag (passed through the C compiler) used to prevent dynamic |
| linking. |
| @end defvar |
| |
| @defvar need_lib_prefix |
| Whether libtool should automatically prefix module names with 'lib'. |
| Set to @samp{yes} or @samp{no}. By default, it is @samp{unknown}, which |
| means the same as @samp{yes}, but documents that we are not really sure |
| about it. |
| @samp{yes} means that it is possible both to @code{dlopen} and to |
| link against a library without 'lib' prefix, |
| i.e. it requires @var{hardcode_direct} to be @samp{yes}. |
| @end defvar |
| |
| @defvar need_version |
| Whether versioning is required for libraries, i.e. whether the |
| dynamic linker requires a version suffix for all libraries. |
| Set to @samp{yes} or @samp{no}. By default, it is @samp{unknown}, which |
| means the same as @samp{yes}, but documents that we are not really sure |
| about it. |
| @end defvar |
| |
| @defvar need_locks |
| Whether files must be locked to prevent conflicts when compiling |
| simultaneously. Set to @samp{yes} or @samp{no}. |
| @end defvar |
| |
| @defvar no_builtin_flag |
| Compiler flag to disable builtin functions that conflict with declaring |
| external global symbols as @code{char}. |
| @end defvar |
| |
| @defvar no_undefined_flag |
| The flag that is used by @samp{archive_cmds} in order to declare that |
| there will be no unresolved symbols in the resulting shared library. |
| Empty, if no such flag is required. |
| @end defvar |
| |
| @defvar objdir |
| The name of the directory that contains temporary libtool files. |
| @end defvar |
| |
| @defvar objext |
| The standard object file suffix (normally "o"). |
| @end defvar |
| |
| @defvar pic_flag |
| Any additional compiler flags for building library object files. |
| @end defvar |
| |
| @defvar postinstall_cmds |
| @defvarx old_postinstall_cmds |
| Commands run after installing a shared or static library, respectively. |
| @end defvar |
| |
| @defvar postuninstall_cmds |
| @defvarx old_postuninstall_cmds |
| Commands run after uninstalling a shared or static library, respectively. |
| @end defvar |
| |
| @defvar reload_cmds |
| @defvarx reload_flag |
| Commands to create a reloadable object. |
| @end defvar |
| |
| @defvar runpath_var |
| The environment variable that tells the linker which directories to |
| hardcode in the resulting executable. |
| @end defvar |
| |
| @defvar shlibpath_overrides_runpath |
| Indicates whether it is possible to override the hard-coded library |
| search path of a program with an environment variable. If this is set |
| to no, libtool may have to create two copies of a program in the build |
| tree, one to be installed and one to be run in the build tree only. |
| When each of these copies is created depends on the value of |
| @code{fast_install}. The default value is @samp{unknown}, which is |
| equivalent to @samp{no}. |
| @end defvar |
| |
| @defvar shlibpath_var |
| The environment variable that tells the dynamic linker where to find |
| shared libraries. |
| @end defvar |
| |
| @defvar soname_spec |
| The name coded into shared libraries, if different from the real name of |
| the file. |
| @end defvar |
| |
| @defvar striplib |
| @defvarx old_striplib |
| Command to strip a shared (@code{striplib}) or static (@code{old_striplib}) |
| library, respectively. If these variables are empty, the strip flag |
| in the install mode will be ignored for libraries (@pxref{Install mode}). |
| @end defvar |
| |
| @defvar sys_lib_dlsearch_path_spec |
| Expression to get the run-time system library search path. Directories |
| that appear in this list are never hard-coded into executables. |
| @end defvar |
| |
| @defvar sys_lib_search_path_spec |
| Expression to get the compile-time system library search path. This |
| variable is used by libtool when it has to test whether a certain |
| library is shared or static. The directories listed in |
| @var{shlibpath_var} are automatically appended to this list, every time |
| libtool runs (i.e., not at configuration time), because some linkers use |
| this variable to extend the library search path. Linker switches such |
| as @code{-L} also augment the search path. |
| @end defvar |
| |
| @defvar thread_safe_flag_spec |
| Linker flag (passed through the C compiler) used to generate thread-safe |
| libraries. |
| @end defvar |
| |
| @defvar version_type |
| The library version numbering type. One of @samp{libtool}, |
| @samp{freebsd-aout}, @samp{freebsd-elf}, @samp{irix}, @samp{linux}, |
| @samp{osf}, @samp{sunos}, @samp{windows}, or @samp{none}. |
| @end defvar |
| |
| @defvar whole_archive_flag_spec |
| Compiler flag to generate shared objects from convenience archives. |
| @end defvar |
| |
| @defvar wl |
| The C compiler flag that allows libtool to pass a flag directly to the |
| linker. Used as: @code{$@{wl@}@var{some-flag}}. |
| @end defvar |
| |
| Variables ending in @samp{_cmds} or @samp{_eval} contain a |
| @samp{~}-separated list of commands that are @code{eval}ed one after |
| another. If any of the commands return a nonzero exit status, libtool |
| generally exits with an error message. |
| |
| Variables ending in @samp{_spec} are @code{eval}ed before being used by |
| libtool. |
| |
| @node Cheap tricks |
| @section Cheap tricks |
| |
| Here are a few tricks that you can use in order to make maintainership |
| easier: |
| |
| @itemize @bullet |
| @item |
| When people report bugs, ask them to use the @samp{--config}, |
| @samp{--debug}, or @samp{--features} flags, if you think they will help |
| you. These flags are there to help you get information directly, rather |
| than having to trust second-hand observation. |
| |
| @item |
| Rather than reconfiguring libtool every time I make a change to |
| @code{ltmain.in}, I keep a permanent @code{libtool} script in my |
| @var{PATH}, which sources @code{ltmain.in} directly. |
| |
| The following steps describe how to create such a script, where |
| @code{/home/src/libtool} is the directory containing the libtool source |
| tree, @code{/home/src/libtool/libtool} is a libtool script that has been |
| configured for your platform, and @code{~/bin} is a directory in your |
| @var{PATH}: |
| |
| @example |
| trick$ cd ~/bin |
| trick$ sed '/^# ltmain\.sh/q' /home/src/libtool/libtool > libtool |
| trick$ echo '. /home/src/libtool/ltmain.in' >> libtool |
| trick$ chmod +x libtool |
| trick$ libtool --version |
| ltmain.sh (GNU @@PACKAGE@@) @@VERSION@@@@TIMESTAMP@@ |
| trick$ |
| @end example |
| @end itemize |
| |
| The output of the final @samp{libtool --version} command shows that the |
| @code{ltmain.in} script is being used directly. Now, modify |
| @code{~/bin/libtool} or @code{/home/src/libtool/ltmain.in} directly in |
| order to test new changes without having to rerun @code{configure}. |
| |
| @include fdl.texi |
| |
| @page |
| @node Index |
| @unnumbered Index |
| |
| @printindex cp |
| |
| @c summarycontents |
| @contents |
| @bye |