| \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 |