window和linux下有关xxx.dll和xxx.so动态库,可执行文件运行时的动态库检索路径文档

发布时间 2023-09-21 21:42:47作者: 星小梦

没想到详细的内容都在库和命令的man手册中。


ld.so动态库手册里有描述ELF可执行文件在运行时,都会在哪几个位置检索动态库。

如果共享对象依赖项不包含斜杠,则它 按以下顺序搜索:

(1) 使用二进制文件的 DT_RPATH 动态节属性中指定的目录(如果存在且 DT_RUNPATH 属性不存在)。 不推荐使用 DT_RPATH。

(2) 使用环境变量 LD_LIBRARY_PATH,除非可执行文件正在安全执行模式下运行(见下文),在这种情况下该变量将被忽略。

(3) 使用二进制文件的 DT_RUNPATH 动态节属性中指定的目录(如果存在)。 搜索此类目录只是为了查找 DT_NEEDED(直接依赖项)条目所需的那些对象,并且不适用于这些对象的子对象,这些对象本身必须有自己的 DT_RUNPATH 条目。 这与 DT_RPATH 不同,DT_RPATH 用于搜索依赖树中的所有子项。

(4) 来自缓存文件/etc/ld.so.cache,其中包含先前在增强库路径中找到的候选共享对象的已编译列表。 但是,如果二进制文件是使用 -z nodeflib 链接器选项链接的,则将跳过默认路径中的共享对象。 安装在硬件功能目录(见下文)中的共享对象优先于其他共享对象。

(5) 在默认路径/lib 中,然后在/usr/lib 中。 (在某些 64 位体系结构上,64 位共享对象的默认路径是 /lib64,然后是 /usr/lib64。)如果二进制文件是使用 -z nodeflib 链接器选项链接的,则将跳过此步骤。


ld命令手册,描述-rpath将目录添加到运行时库搜索路径。

将目录添加到运行时库搜索路径。 当将 ELF 可执行文件与共享对象链接时使用。 所有 -rpath 参数都连接起来并传递给运行时链接器,后者使用它们在运行时定位共享对象。
当定位链接中显式包含的共享对象所需的共享对象时,也会使用 -rpath 选项; 请参阅 -rpath-link 选项的说明。
仅使用 --with-sysroot 选项配置的本机链接器和交叉链接器支持以这种方式搜索 -rpath。
如果在链接 ELF 可执行文件时未使用 -rpath,则将使用环境变量“LD_RUN_PATH”的内容(如果已定义)。 -rpath 选项也可用于 SunOS。
默认情况下,在 SunOS 上,链接器将从给定的所有 -L 选项中形成运行时搜索路径。 如果使用 -rpath 选项,则将仅使用 -rpath 选项形成运行时搜索路径,而忽略 -L 选项。
这在使用 gcc 时很有用,它添加了许多可能位于 NFS 安装的文件系统上的 -L 选项。
为了与其他 ELF 链接器兼容,如果 -R 选项后跟目录名而不是文件名,则将其视为 -rpath 选项。


window下dll动态库的搜索路径


readelf命令可显示有关 ELF 文件的信息