【发布时间】:2017-03-15 11:45:26
【问题描述】:
Linux 将链接器时搜索路径和运行时搜索路径分开。
对于运行时搜索路径,我在其man page (8 ld.so) 中找到了ld.so 的规则:
- DT_RPATH
- 环境 LD_LIBRARY_PATH
- DT_RUNPATH
- ld.so.cache
- /lib, /usr/lib
但是对于链接器时搜索路径,ld 没有运气:(
Man page for ld (1 ld) 说,除了-L 选项:
搜索的默认路径集(未使用
-L指定)取决于 ld 使用的仿真模式,在某些情况下还取决于它的配置方式。也可以使用“
SEARCH_DIR”命令在链接脚本中指定路径。以这种方式指定的目录将在链接描述文件出现在命令行中的位置进行搜索。
取决于模拟模式的“默认路径集”是否意味着“SEARCH_DIR”?
【问题讨论】:
-
misssprite,什么是“ld”?是“ld.so”,还是“ld-linux.so”或“libdl.so”? "ld-linux.so"(ELF 动态链接器/加载器)在动态 ELF 文件中注册为解释器,部分...INTERP,检查
readelf -l ./dynamic_application。 PS您使用的是哪个手册页,是man7.org/linux/man-pages/man8/ld.so.8.html 还是man7.org/linux/man-pages/man1/ld.1.html 或其他? -
我指的是 GCC 中的
linker,而不是加载程序。我会编辑它。@osgx -
misssprite,你对 man page 1 ld man7.org/linux/man-pages/man1/ld.1.html 的理解不正确,DT_RPATH 等用于搜索动态库(它们被命名为
libSOMETHING.so,如libc.so),应用程序需要动态部分的 NEEDED 条目(检查readelf -d ./dynamic_program的输出)。没有名为ld.so的动态库。 -
我知道
ld.so是 LOADER,而不是 .so 库。也许你可以帮我编辑问题以解决任何令人困惑的问题。@osgx -
动态库由动态加载程序 ld-linux.so 搜索(在运行时),如您在问题中所述。并且 ld-linux.so 路径(在编译+链接过程结束时)在 binutils 链接器
ld(不正确)和 gcc(正确,检查gcc -dumpspecs|grep dynamic-linker)中硬编码,并从 gcc 传递到 ld(检查我的答案)。