Linker and Libraries Guide

Introducing $ORIGIN

$ORIGIN represents the directory in which an object originated. This feature keys off of a new auxiliary vector provided by the kernel to the runtime linker on process startup. Using this technology, we can now redefine our unbundled application to locate its dependencies in terms of $ORIGIN:


% dump -Lv abc
 
  [1]   NEEDED  libA.so.1
  [2]   RPATH   $ORIGIN/../lib

and the dependency libA.so.1 can also be defined in terms of $ORIGIN:


% dump -Lv libA.so.1
 
  [1]   NEEDED  libB.so.1
  [2]   RPATH   $ORIGIN

Therefore, if this product is now installed under /usr/local/ABC, and the user's PATH is augmented with /usr/local/ABC/bin of the application abc will result in a pathname lookup for its dependencies as follows:


% ldd -s abc
     find library=libA.so.1; required by abc
      search path=$ORIGIN/../lib  (RPATH from file abc)
      trying path=/usr/local/ABC/lib/libA.so.1
        libA.so.1 =>     /usr/local/ABC/lib/libA.so.1
 
     find library=libB.so.1; required by /usr/local/ABC/lib/libA.so.1
      search path=$ORIGIN  (RPATH from file /usr/local/ABC/lib/libA.so.1)
      trying path=/usr/local/ABC/lib/libB.so.1
        libB.so.1 =>     /usr/local/ABC/lib/libB.so.1