我正在阅读APUE并看到以下内容:
a.out中存在多个段类型,包含符号表,调试信息,动态共享库的链接表等。这些附加部分不会作为进程执行的程序映像的一部分加载。
但是,如果动态共享库的链接表没有加载到程序的映像中,进程如何找到必要的.so
?
答案 0 :(得分:1)
动态链接器作为程序解释器通过链接期间添加到程序头的.interp(PT_INTERP
)部分加载。
动态链接器读取DT_NEEDED
ELF标记(在静态链接期间添加)以确定需要解析的共享库。
最后,关于解析图书馆deps,来自ld.so(8)
:
在解析库依赖关系时,动态链接器首先检查 每个依赖关系字符串,以查看它是否包含斜杠(这可能会发生 如果在链接时指定了包含斜杠的库路径名)。 如果找到斜杠,则依赖关系字符串将被解释为a (相对或绝对)路径名,并使用它加载库 路径名。
如果库依赖项不包含斜杠,则搜索它 按以下顺序:
(仅限ELF)使用DT_RPATH动态中指定的目录 二进制文件的section属性(如果存在)和DT_RUNPATH属性 不存在。不推荐使用DT_RPATH。
使用环境变量LD_LIBRARY_PATH。除非是 executable是set-user-ID / set-group-ID二进制文件,在这种情况下是 忽略。
(仅限ELF)使用DT_RUNPATH动态中指定的目录 二进制文件的section属性(如果存在)。
来自缓存文件/etc/ld.so.cache,其中包含已编译的列表 之前在扩充库路径中找到的候选库。 但是,如果二进制文件与-z nodeflib链接器选项链接, 跳过默认库路径中的库。图书馆 安装在硬件功能目录(见下文)中是首选 到其他图书馆。
在默认路径/ lib中,然后在/ usr / lib中。如果二进制文件已链接 使用-z nodeflib链接器选项,将跳过此步骤。