在 Linux 上,ld.so(8)
手册页讨论了动态库的搜索顺序。它说DT_RPATH
已被弃用,并且还提到DT_RUNPATH
。没有提到-rpath
链接器选项。
The ld(1)
手册页提到了-rpath
and -rpath-link
选项,但从未提及DT_RPATH
or DT_RUNPATH
除了描述图书馆搜索顺序,这当然与中给出的信息不匹配ld.so(8)
.
最后有一个LD_RUN_PATH
环境变量。ld(1)
说它使用如果-rpath
and -rpath-link
选项未设置,但ld.so(8)
没有提到它。
我的直觉是-rpath
实际上设置DT_RPATH
, and -rpath-link
sets DT_RUNPATH
,但我找不到任何地方证实这一点。我一直用-rpath
;如果它是相同的DT_RPATH
我不应该使用它,但是我在动态链接上找到的操作方法文章说要使用它,所以我不确定它是否相同。
有人可以澄清一下如何DT_RPATH
and DT_RUNPATH
已设置,以及它们是否相同-rpath
and -rpath-link
?
当你是编译一个程序,您创建目标文件,然后link他们在一起。你可以使用GNU ld(1)来链接它们,还有其他链接器,LLVM链接器。链接器将目标文件组合成可执行文件。 GNU ld(1) 是 binutils 的一部分此处提供文档.
当你execute一个已经编译好的可执行文件,然后动态链接器 ld.so(8) 在系统上找到该可执行文件所依赖的库,加载它们并执行该可执行文件。 ld.so(8) 是一个共享库,通常作为 C 标准库的一部分分发,通常在 Linux 上是 glibc,但也有其他库,例如 musl。
我认为这两个程序都被命名为“链接器”,这很令人困惑。一种是“编译链接器”,另一种是“可执行链接器”。
如何设置 DT_RPATH 或 DT_RUNPATH?
编辑 elf 文件以包含特定部分。
当使用 GNU ld 创建 elf 文件时,现在您可以使用以下命令设置 RUNPATH 部分-rpath=something
。您可以设置RPATH
部分与--disable-new-dtags -rpath=something
。 RPATH 已被弃用,所以通常-rpath
设置运行路径。https://www.javaer101.com/en/article/1127068.html*这不会在我的系统上检查,我必须使用gcc -Wl,--enable-new-dtags -Wl,-rpath=/tmp
设置运行路径...
您还可以在编译后在任何 ELF 文件中设置部分。看我可以更改已编译的二进制文件中的“rpath”吗?
它们是否与-rpath和-rpath-link相同?
From ld文档:
-rpath 和 -rpath-link 之间的区别在于 -rpath 选项指定的目录包含在可执行文件中并在运行时使用,而 -rpath-link 选项仅在链接时有效。
该文档还解释了如何-rpath-link
作品。就是指定搜索依赖共享库的目录。
最后还有一个LD_RUN_PATH环境变量
When 编译可执行的 GNU ld(1) 也会在此变量指定的目录中搜索库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)