]> git.ipfire.org Git - thirdparty/libtool.git/commitdiff
* docs/libtool.texi: Added pointers to documentation
authorRobert Boehne <rboehne@ricardo-us.com>
Fri, 27 Oct 2000 20:01:43 +0000 (20:01 +0000)
committerGary V. Vaughan <gary@gnu.org>
Fri, 27 Oct 2000 20:01:43 +0000 (20:01 +0000)
of Hewlett-Packard, Compaq Tru64 and IBM AIX systems.

ChangeLog
doc/libtool.texi

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