$ORIGIN represents the directory in which an object originated. This feature keys off of an auxiliary vector provided by the kernel to the runtime linker on process start-up. 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, invocation 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
|