Man Linux: Main Page and Category List

NAME

       prelink - prelink ELF shared libraries and binaries to speed up startup
       time

SYNOPSIS

       prelink [OPTION...] [FILES]

DESCRIPTION

       prelink is a  program  that  modifies  ELF  shared  libraries  and  ELF
       dynamically  linked binaries in such a way that the time needed for the
       dynamic  linker  to  perform  relocations  at   startup   significantly
       decreases.   Due  to fewer relocations, the run-time memory consumption
       decreases as well (especially the number of  unshareable  pages).   The
       prelinking  information  is  only  used  at startup time if none of the
       dependent libraries have changed since prelinking;  otherwise  programs
       are relocated normally.

       prelink  first  collects  ELF  binaries to be prelinked and all the ELF
       shared libraries they depend on.  Then  it  assigns  a  unique  virtual
       address  space  slot  to each library and relinks the shared library to
       that base address.  When the dynamic linker attempts  to  load  such  a
       library, unless that virtual address space slot is already occupied, it
       maps the library into the given slot.  After  this  is  done,  prelink,
       with the help of dynamic linker, resolves all relocations in the binary
       or library against its dependent libraries and stores  the  relocations
       into  the ELF object.  It also stores a list of all dependent libraries
       together  with  their  checksums  into  the  binary  or  library.   For
       binaries,  it  also  computes  a  list  of  conflicts (relocations that
       resolve differently in the binary’s symbol search  scope  than  in  the
       smaller  search  scope in which the dependent library was resolved) and
       stores it into a special ELF section.

       At runtime, the dynamic  linker  first  checks  whether  all  dependent
       libraries  were successfully mapped into their designated address space
       slots, and whether they have not changed since the prelinking was done.
       If  all checks are successful, the dynamic linker just replays the list
       of conflicts (which is usually significantly shorter than total  number
       of relocations) instead of relocating each library.

OPTIONS

       -v --verbose
              Verbose  mode.   Print  the  virtual  address  slots assigned to
              libraries  and  what  binary  or  library  is  currently   being
              prelinked.

       -n --dry-run
              Don’t    actually    prelink    anything;   just   collect   the
              binaries/libraries, assign them addresses,  and  with  -v  print
              what would be prelinked.

       -a --all
              Prelink  all binaries and dependent libraries found in directory
              hierarchies  specified  in  /etc/prelink.conf.   Normally,  only
              binaries  specified  on  the  command  line  and their dependent
              libraries are prelinked.

       -m --conserve-memory
              When assigning addresses to libraries, allow overlap of  address
              space  slots  provided  that  the  two libraries are not present
              together in any of the binaries or libraries. This results in  a
              smaller  virtual address space range used for libraries.  On the
              other  hand,  if  prelink  sees  a  binary  during   incremental
              prelinking  which  puts  together  two  libraries which were not
              present together in any other binary and  were  given  the  same
              virtual   address   space  slots,  then  the  binary  cannot  be
              prelinked.  Without this option,  each  library  is  assigned  a
              unique virtual address space slot.

       -R --random
              When  assigning  addresses  to  libraries,  start  with a random
              address within the architecture-dependent virtual address  space
              range.   This  can  make  some  buffer overflow attacks slightly
              harder to exploit, because libraries are not present on the same
              addresses   across   different  machines.   Normally,  assigning
              virtual addresses starts at  the  bottom  of  the  architecture-
              dependent range.

       -r --reloc-only=ADDRESS
              Instead of prelinking, just relink given shared libraries to the
              specified base address.

       -N --no-update-cache
              Don’t save the cache file after prelinking.  Normally, the  list
              of  libraries  (and  with  -m  binaries also) is stored into the
              /etc/prelink.cache file together with their given address  space
              slots  and  dependencies,  so  the  cache  can  be  used  during
              incremental prelinking (prelinking without -a option).

       -c --config-file=CONFIG
              Specify  an   alternate   config   file   instead   of   default
              /etc/prelink.conf.

       -C --cache-file=CACHE
              Specify   an   alternate   cache   file   instead   of   default
              /etc/prelink.cache.

       -f --force
              Force re-prelinking even for  already  prelinked  objects  whose
              dependencies  are  unchanged.   This  option  causes new virtual
              address space slots to be assigned to all libraries.   Normally,
              only  binaries  or libraries which are either not prelinked yet,
              or whose dependencies have changed, are prelinked.

       -q --quick
              Run prelink in quick mode.  This  mode  checks  just  mtime  and
              ctime  timestamps  of libraries and binaries stored in the cache
              file.  If they are unchanged from the last prelink  run,  it  is
              assumed  that  the  library  in question did not change, without
              parsing or verifying its ELF headers.

       -p --print-cache
              Print   the   contents   of    the    cache    file    (normally
              /etc/prelink.cache) and exit.

       --dynamic-linker=LDSO
              Specify an alternate dynamic linker instead of the default.

       --ld-library-path=PATH
              Specify  a  special  LD_LIBRARY_PATH  to  be  used  when prelink
              queries the dynamic linker about symbol resolution details.

       --libs-only
              Only prelink ELF shared libraries, don’t prelink any binaries.

       -h --dereference
              When  processing  command  line  directory   arguments,   follow
              symbolic links when walking directory hierarchies.

       -l --one-file-system
              When   processing   command   line  directory  arguments,  limit
              directory tree walk to a single file system.

       -T --timestamp-output
              Prefix output with timestamps.

       -u --undo
              Revert binaries and libraries to their original  content  before
              they  were  prelinked.   Without the -a option, this causes only
              the binaries and libraries specified on the command line  to  be
              reverted   to   their   original   state  (and  e.g.  not  their
              dependencies). If used together with the -a option, all binaries
              and  libraries  from  command  line, all their dependencies, all
              binaries found in directories specified on command line  and  in
              the config file, and all their dependencies are undone.

       -y --verify
              Verifies a prelinked binary or library.  This option can be used
              only on a single binary or library. It first applies  an  --undo
              operation  on  the  file, then prelinks just that file again and
              compares this with the original file. If both are identical,  it
              prints  the  file  after --undo operation on standard output and
              exits with zero status. Otherwise it exits  with  error  status.
              Thus  if  --verify  operation  returns  zero exit status and its
              standard output is equal to the content of the binary or library
              before  prelinking,  you  can  be  sure that nobody modified the
              binaries or libraries after prelinking.  Similarly with  message
              digests and checksums (unless you trigger the improbable case of
              modified file and  original  file  having  the  same  digest  or
              checksum).

       -y --md5
              This is similar to --verify option, except instead of outputting
              the content of  the  binary  or  library  before  prelinking  to
              standard output, MD5 digest is printed.  See md5sum(1).

       -y --sha
              This is similar to --verify option, except instead of outputting
              the content of  the  binary  or  library  before  prelinking  to
              standard output, SHA1 digest is printed.  See sha1sum(1).

       --exec-shield --no-exec-shield
              On  IA-32,  if the kernel supports Exec-Shield, prelink attempts
              to lay libraries out similarly to how  the  kernel  places  them
              (i.e.  if  possible  below the binary, most widely used into the
              ASCII armor zone).   These  switches  allow  overriding  prelink
              detection of whether Exec-Shield is supported or not.

       -b --black-list=PATH
              This  option  allows  blacklisting  certain  paths, libraries or
              binaries.  Prelink will not touch them during prelinking.

       -o --undo-output=FILE
              When  performing  an  --undo  operation,  don’t  overwrite   the
              prelinked binary or library with its original content (before it
              was prelinked), but save that into the specified file.

       -V --version
              Print version and exit.

       -? --help
              Print short help and exit.

ARGUMENTS

       Command-line arguments should be either directory hierarchies (in which
       case  -l  and  -h  options apply), or particular ELF binaries or shared
       libraries.  Specifying a shared library explicitly on the command  line
       causes  it  to  be  prelinked  even  if no binary is linked against it.
       Otherwise, binaries are collected together and only the libraries  they
       depend on are prelinked with them.

EXAMPLES

              # /usr/sbin/prelink -avmR
       prelinks    all    binaries   found   in   directories   specified   in
       /etc/prelink.conf  and  all  their   dependent   libraries,   assigning
       libraries  unique  virtual address space slots only if they ever appear
       together, and starts assigning libraries at a random address.
              # /usr/sbin/prelink -vm ~/bin/progx
       prelinks ~/bin/progx program and all its  dependent  libraries  (unless
       they were prelinked already e.g. during prelink -a invocation).
              # /usr/sbin/prelink -au
       reverts all binaries and libraries to their original content.
              # /usr/sbin/prelink -y /bin/prelinked_prog > /tmp/original_prog;
              echo $?  verifies whether /bin/prelinked_prog is unchanged.

FILES

       /etc/prelink.cache  Binary  file  containing  a   list   of   prelinked
                           libraries   and/or  binaries  together  with  their
                           assigned   virtual   address   space   slots    and
                           dependencies.   You can run /usr/sbin/prelink -p to
                           see what is stored in there.
       /etc/prelink.conf   Configuration file containing a list  of  directory
                           hierarchies  that  contain  ELF shared libraries or
                           binaries   which   should   be   prelinked.    This
                           configuration  file  is  used  in  -a  mode to find
                           binaries which should be  prelinked  and  also,  no
                           matter  whether  -a is given or not, to limit which
                           dependent shared libraries should be prelinked.  If
                           prelink finds a dependent library of some binary or
                           other library which is not present in  any  of  the
                           directories  specified  either in /etc/prelink.conf
                           or  on  the  command  line,  then  it   cannot   be
                           prelinked.   Each line of the config file should be
                           either a comment starting with #,  or  a  directory
                           name,  or  a  blacklist  specification.   Directory
                           names can be prefixed by the -l switch, meaning the
                           tree walk of the given directory is only limited to
                           one file system; or the -h switch, meaning the tree
                           walk of the given directory follows symbolic links.
                           A blacklist specification should be prefixed by  -b
                           and   optionally  also  -l  or  -h  if  needed.   A
                           blacklist entry can be either an absolute directory
                           name  (in  that  case  all  files in that directory
                           hierarchy  are  ignored  by  the   prelinker);   an
                           absolute  filename (then that particular library or
                           binary is skipped); or a glob pattern without  a  /
                           character  in it (then all files matching that glob
                           in any directory are ignored).

SEE ALSO

       ldd(1), ld.so(8).

BUGS

       prelink Some architectures, including  IA-64  and  HPPA,  are  not  yet
       supported.

AUTHORS

       Jakub Jelinek <jakub@redhat.com>.

                                 01 March 2007                      prelink(8)