\input texinfo @c -*-texinfo-*-
@c %**start of header
@setfilename ld.so.info
@settitle ld.so : Dynamic-Link Library support
@c %**end of header

@ifinfo
This file documents the dynamic-link support libraries and utilities for the
Linux OS, version 1.8.1.

Copyright 1996 Michael Deutschmann

This document is subject to the GNU General Public License as published by 
the Free Software foundation, version 2 or later (your choice).

Note: The software described in this document is under a different copyright
and license.

@end ifinfo

@titlepage 
@title ld.so
@subtitle Dynamic Link library support for the Linux OS.
@author David Engel
@author Eric Youngdale
@author Peter Macdonald 
@author Hongjiu Lu 
@author Mitch D'Souza
@author Michael Deutschmann (this documentation)

@page
Copyright @copyright{} 1996 Michael Deutschmann

This document is subject to the GNU General Public License as published by 
the Free Software foundation, version 2 or later (your choice).

Note: The software described in this document is under a different copyright
and license.
@end titlepage

@ifinfo
@node Top
@top

The @code{ld.so} module provides dynamic linked library support in Linux.
This file documents @code{ld.so} and its companion software.

@menu
* intro::	Introduction

* ld.so::	The dynamic linker core program
* ldd::		A utility to print out dependencies
* ldconfig::	A utility to maintain the cache and symlinks
* libdl::	Manual dynamic linking library
@end menu

@end ifinfo

@node intro
@unnumbered Introduction

The @code{ld.so} suite contains special files and utilities needed for linux
to handle @dfn{dynamic libraries}.

Ordinary static libraries (@file{lib*.a} files) are included into executables
that use their functions. A file that only uses static libraries needs less
intelligence to load, but takes up more space. If many executables use the
same library, there can be much wastage of storage space, since multiple
copies of the library functions are scattered across the executables.
However, static libraries are easier to make.

Dynamic libraries (@file{lib*.so*} files) are not copied into executables ---
the executable is written in such a way that it will automatically load the
libraries. In linux, the executable will first load the special library 
@code{ld.so} or @code{ld-linux.so}, which contains the intelligence
to load further dynamic libraries. Since multiple files end up getting
executable data from the same file, dynamic libraries are also known as
shared libraries.

Linux executables come in two flavors, @sc{elf} and a.out.

a.out is the original executable format used by Linux. It has somewhat less 
overhead than @sc{elf}. However creating shared libraries for a.out is
@emph{very} involved, and each a.out shared library must be explicitly 
registered.
 
@sc{elf} is a more recent format, which supports a much simpler method of
creating libraries. @sc{elf} libraries may also be linked manually
(@pxref{libdl}).

Since many library authors prefer @sc{elf} and no longer release shared a.out 
libraries, a.out is moribund on Linux. This version of the @code{ld.so} can
be compiled to support only @sc{elf}, or to support both formats. (The last
release of ld.so to support a.out alone was 1.8.0.)

@node ld.so
@chapter @code{ld.so}: Dynamic linker core

@code{ld.so} works behind the scenes to handle dynamic libraries in Linux.
Users will almost never have to deal with it directly, but in special cases
one can send instructions to it through environment variables. Also, if
something is wrong with your libraries (usually an incorrect version) ld.so
will give error messages.

Actually @code{ld.so} is the a.out linker. The new @sc{elf} executables are
handled by a related program @code{ld-linux.so}.

@menu
* files::	Configuration files used by the suite
* environment::	Environment settings that tweak @code{ld.so}
* errors::	Complaints @code{ld.so} might make
@end menu

@node files
@section Configuration Files

@table @file
@item /etc/ld.so.cache
A file created by @code{ldconfig} and used to speed linking. It's structure
is private to the suite.

@item /etc/ld.so.conf
A simple list of directories to scan for libraries, in addition to
@file{/usr/lib} and @file{/lib}, which are hardwired. It may contain
comments started with a @samp{#}.

@item /etc/ld.so.preload
A list of libraries to preload. This allows preloading libraries for
setuid/setgid executables securely. It may contain comments. 
@end table

@node environment
@section Environment Variables

@table @code
@item LD_AOUT_LIBRARY_PATH
@itemx LD_LIBRARY_PATH
These variables supply a library path for finding dynamic libraries, in the
standard colon seperated format. These variables are ignored when executing 
setuid/setgid programs, because otherwise they would be a security hazard. 
@code{ld.so} will use @code{LD_AOUT_LIBRARY_PATH} and @code{ld-linux.so} will 
use @code{LD_LIBRARY_PATH}.

@item LD_AOUT_PRELOAD
@itemx LD_PRELOAD
These variables allow an extra library not specified in the executable to be
loaded. Generally this is only useful if you want to override a function. 
These are also ignored when running setuid/setgid executables. @code{ld.so} 
will use @code{LD_AOUT_PRELOAD} and @code{ld-linux.so} will use 
@code{LD_PRELOAD}.

@item LD_NOWARN
If non-empty, errors about incompatible minor revisions are suppressed.

@item LD_KEEPDIR
If non-empty, allow executables to specify absolute library names. This
option is deprecated.
@c FIXME:
@c The following are things I noticed in the ld-linux.so source.
@c I don't really understand 'em. Could someone help me?
@c
@c @item LD_BIND_NOW
@c This option is used by the @code{ld-linux.so} only. I don't know 
@c what it does. (I suspect, looking at the code, that it specifies
@c "RTLD_NOW" rather than "RTLD_LAZY" mode for the shared libraries.)
@c 
@c @item LD_TRACE_LOADED_OBJECTS
@c @itemx LD_WARN
@c These seem to have something to do with the communication between the
@c @code{ld-linux.so} and @code{ldd}. I don't know more.
@end table

@node errors
@section Errors

@table @samp
@item Can't find library @var{library}
The executable required a dynamically linked library that ld.so cannot find.
Your symbolic links may be not set right, or you may have not installed a 
library needed by the program.

@item Can't load library @var{library}
The library is corrupt. 

@item Incompatible library @var{library}
@itemx   Require major version @var{x} and found @var{y}
Your version of the library is incompatible with the executable. Recompiling
the executable, or upgrading the library will fix the problem.

@item using incompatible library @var{library}
@itemx   Desire minor version >= @var{x} and found @var{y}.
Your version of the library is older than that expected by the executable,
but not so old that the library interface has radically changed, so the
linker will attempt to run anyway. There is a chance that it will work, but 
you should upgrade the library or recompile the software. The environment 
variable @code{LD_NOWARN} can be used to supress this message.

@item too many directories in library path
The linker only supports up to 32 library directories. You have too many.

@item dynamic linker error in @var{blah}
The linker is having trouble handling a binary - it is probably corrupt.

@item can't map cache file @var{cache-file}
@itemx cache file @var{cache-file} @var{blah}
The linker cache file (generally @file{/etc/ld.so.cache}) is corrupt or
non-existent. These errors can be ignored, and can be prevented by 
regenerating the cache file with @code{ldconfig}.
@end table

@node ldd
@chapter @code{ldd}: Dependency scanner

@code{ldd} is a utility that prints out the dynamic libraries that an
executable is linked to. 

Actually @code{ldd} works by signalling ld.so to print the dependencies. 
For a.out executables this is done by starting the executable with 
@code{argc} equal to 0. The linker detects this and prints the dependencies. 
(This can cause problems with @emph{very} old binaries, which would run as 
normal only with an inappropriate @code{argc}.)

For @sc{elf} executables, special environment variables are used to tell the
linker to print the dependencies.

@code{ldd} has a few options:

@table @samp
@item -v
Print the version number of @code{ldd} itself

@item -V
Print the version number of the dynamic linker

@item -d
Report missing functions. This is only supported for @sc{elf} executables.

@item -r
Report missing objects. This is also only available for @sc{elf}
executables.
@end table

@node ldconfig
@chapter @code{ldconfig}: Setup program 

This utility is used by the system administrator to automatically set up
symbolic links needed by the libraries, and also to set up the cache file.

@code{ldconfig} is run after new dynamic libraries are installed, and if the 
cache file or links are damaged. It is also run when upgrading the
@code{ld.so} suite itself.

The @file{/lib} and @file{/usr/lib} directories, and any listed in the file 
@file{/etc/ld.so.conf} are scanned by default unless @samp{-n} is used.
Additional directories may be specified on the command line.

It has the following options:

@table @samp
@item -D
Enter debug mode. Implies @samp{-N} and @samp{-X}.

@item -v
Verbose. Print out links created and directories scanned.

@item -n 
Check directories specified on the commandline @emph{only}.

@item -N
Do not regenerate the cache.

@item -X
Do not rebuild symbolic links.

@item -l
Set up symbolic links for only libraries presented on the command line.

@item -p
Print out the library pathnames in the cache file (@file{/etc/ld.so.cache})
@end table

@node libdl
@chapter User dynamic linking library

The @code{ld.so} package includes a small library of functions
(@code{libdl}) to allow manual dynamic linking. Normally programs are linked 
so that dynamic functions and objects are automagically available. These 
functions allow one to manually load and access a symbol from a library. 
They are only available for @sc{elf} executables.

@menu
* using libdl::	General points
* functions::	How to use the functions
* example::	A sample program
@end menu

@node using libdl
@section Overview

To access this library, add the flag @samp{-ldl} to your compile command when
linking the executable. You also must include the header file
@code{dlfcn.h}. You may also need the flag @samp{-rdynamic}, which enables
resolving references in the loaded libraries against your executable.

Generally, you will first use @code{dlopen} to open a library. Then you use
@code{dlsym} one or more times to access symbols. Finally you use
@code{dlclose} to close the library.

These facilities are most useful for language interpreters that provide
access to external libraries. Without @code{libdl}, it would be neccessary
to link the interpreter executable with any and all external libraries
needed by the programs it runs. With @code{libdl}, the interpreter only 
needs to be linked with the libraries it uses itself, and can dynamically 
load in additional ones if programs need it.

@node functions
@section Functions

@deftypefun void *dlopen ( const char @var{filename}, int @var{flags} )

This function opens the dynamic library specified by @var{filename}
and returns an abstract handle, which can be used in subsequent calls to 
@code{dlsym}. The function will respect the @code{LD_ELF_LIBRARY_PATH} and
@code{LD_LIBRARY_PATH} environment variables.

@end deftypefun

The following flags can be used with @code{dlopen}:

@deftypevr Macro int RTLD_LAZY
Resolve symbols in the library as they are needed.
@end deftypevr

@deftypevr Macro int RTLD_NOW
Resolve all symbols in the library before returning, and fail if not all can
be resolved. This is mutually exclusive with @code{RTLD_LAZY}.
@end deftypevr

@deftypevr Macro int RTLD_GLOBAL
Make symbols in this library available for resolving symbols in other
libraries loaded with @code{dlopen}.
@end deftypevr

@deftypefun int dlclose ( void *@var{handle} )

This function releases a library handle.

Note that if a library opened twice, the handle will be the same. However,
a reference count is used, so you should still close the library as many 
times as you open it.

@end deftypefun

@deftypefun void *dlsym (void *@var{handle},char *@var{symbol-name})

This function looks up the name @var{symbol-name} in the library and returns
it in the void pointer.

If there is an error, a null pointer will be returned. However, it is
possible for a valid name in the library to have a null value, so
@code{dlerror} should be used to check if there was an error.

@end deftypefun

@deftypefun {libdl function} {const char} *dlerror( void )

This function is used to read the error state. It returns a human-readable
string describing the last error, or null, meaning no error.

The function resets the error value each time it is called, so the result
should be copied into a variable. If the function is called more than once
after an error, the second and subsequent calls will return null.

@end deftypefun

@node example
@section Example program

Here is an example program that prints the cosine of two by manually linking
to the math library:
 
@example
@c The following was snarfed verbatim from the dlopen.3 man file.
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) @{
    void *handle;
    double (*cosine)(double);
    char *error;

    handle = dlopen ("/lib/libm.so", RTLD_LAZY);
    if (!handle) @{
        fputs (dlerror(), stderr);
        exit(1);
    @}

    cosine = dlsym(handle, "cos");
    if ((error = dlerror()) != NULL)  @{
        fputs(error, stderr);
        exit(1);
    @}

    printf ("%f\\n", (*cosine)(2.0));
    dlclose(handle);
@}
@end example

@contents

@bye