rpath is a term in programming which refers to a run-time search path hard-coded in an executable file or library, used during dynamic linking to find the libraries the executable or library requires.
Specifically it encodes a path to shared libraries into the header of an executable (or another shared library). This RPATH header value (so named in the Executable and Linkable Format header standards) may either override or supplement the system default dynamic linking search paths.
The rpath of an executable or shared library is an optional entry in the
.dynamic section of the ELF executable or shared libraries, with the type
DT_RPATH, called the
It can be stored there at link time by the linker and can be modified (or, possibly also created) later using tools like
The different dynamic linkers for ELF implement the use of the
DT_RPATH attribute in different ways.
- The (colon-separated) paths in the
DT_RPATHdynamic section attribute of the binary if present and
DT_RUNPATHattribute does not exist.
- The (colon-separated) paths in the environment variable
LD_LIBRARY_PATH, unless the executable is a
setuid/setgidbinary, in which case it is ignored.
LD_LIBRARY_PATHcan be overridden by calling the dynamic linker with the option
/lib/ld-linux.so.2 --library-path $HOME/mylibs myprogram).
- The (colon-separated) paths in the
DT_RUNPATHdynamic section attribute of the binary if present.
- Lookup based on the
ldconfigcache file (often located at
/etc/ld.so.cache) which contains a compiled list of candidate libraries previously found in the augmented library path (set by
/etc/ld.so.conf). If, however, the binary was linked with the
-z nodefliblinker option, libraries in the default library paths are skipped.
- In the trusted default path
/lib, and then
/usr/lib. If the binary was linked with the
-z nodefliblinker option, this step is skipped.
- The option
--inhibit-rpath LISTof the dynamic linker instructs it to ignore
DT_RUNPATHattributes of the object names in LIST.
- Libraries specified by the environment variable
LD_PRELOADand then those listed in
/etc/ld.so.preloadare loaded before the search begins. A preload can thus be used to replace some (or all) of the requested library's normal functionalities, or it can simply be used to supply a library that would otherwise not be found.
- Static libraries are searched and linked into the ELF file at link time and are not linked at run time.
The role of GNU ld
The GNU Linker (GNU ld) implements a feature which it calls "new-dtags": 
If the new-dtags feature is enabled in the linker (at run time using
ld, besides setting the
DT_RPATH attribute, also sets the
DT_RUNPATH attribute to the same string. At run time, if the dynamic linker finds a
DT_RUNPATH attribute, it ignores the value of the
DT_RPATH attribute, with the effect that
LD_LIBRARY_PATH is checked next and the paths in the
DT_RUNPATH attribute are only searched after it.
This means that in such configurations, the paths in
LD_LIBRARY_PATH are searched before those given at link time using
--enable-new-dtags was active.
Instead of specifying the
-rpath to the linker, the environment variable
LD_RUN_PATH can be set to the same effect.
The dynamic linker of Solaris, specifically
/lib/ld.so of SunOS 5.8 and similar systems looks for libraries in the directories specified in the LD_LIBRARY_PATH variable before looking at the
- "Linux / Unix Command: ld.so". About.com. Retrieved 12 October 2011.
- "Shared Libraries: distribution and build-system issues". Official website of the Haskell Compiler. Retrieved 12 October 2011.
- Autobook section containing brief discussion of rpath
- chrpath - a tool to change the
DT_RPATHattribute of an executable and convert it to an
- FreeBSD devel/chrpath Port - Tool to modify DT_RPATH in existing ELF binaries
- patchELF - a small utility to modify the dynamic linker and
DT_RUNPATHattribute of ELF executables.