RPath is a very interesting topic which can instruct the binary to find the right location of libraries and dependencies.
GNU ld.so has some rules in regarding how to use the rpath to find the right dependencies (basically it has attribute or environment which direct the runtime to look for directories for things within).
You may find some explaination from this wikipedia link: http://en.wikipedia.org/wiki/Rpath
GNU ld.so
The dynamic linker of the GNU C Library and its derivative Embedded GLIBC implement a rather complicated algorithm for searching for shared libraries. The basic search order is:[1]
- The (colon-separated) paths in the
DT_RPATHdynamic section attribute of the binary if present andDT_RUNPATHattribute does not exist. - The (colon-separated) paths in the environment variable
LD_LIBRARY_PATH, unless the executable is asetuid/setgidbinary, in which case it is ignored.LD_LIBRARY_PATHcan be overridden by calling the dynamic linker with the option--library-path(e.g./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.
Notes:
- The option
--inhibit-rpath LISTof the dynamic linker instructs it to ignoreDT_RPATHandDT_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.
[edit]The role of GNU ld
The GNU Linker (GNU ld) implements a feature which it calls "new-dtags": [2]
If the new-dtags feature is enabled in the linker (at run time using --enable-new-dtags), GNU ld, besides setting the DT_RPATHattribute, 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 theDT_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 -rpath if--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.

本文详细介绍了RPath在二进制文件中如何指导库和依赖项定位的方法,并深入探讨了GNU ld.so的工作原理及配置选项。文章还解释了在运行时如何搜索共享库的复杂算法。
3068

被折叠的 条评论
为什么被折叠?



