mah*_*y67 7 linux shared-libraries ld
在 Linux 上,ld.so(8)手册页讨论了动态库的搜索顺序。它说这DT_RPATH已被弃用,并且还提到了DT_RUNPATH. 没有提及-rpath链接器选项。
手册ld(1)页提到了-rpath和-rpath-link选项,但在描述库搜索顺序时从未提及DT_RPATH或DT_RUNPATHexcept,这当然与 中给出的信息不匹配ld.so(8)。
最后还有一个LD_RUN_PATH环境变量。ld(1)说如果未设置-rpath和选项则使用它,但没有提及。-rpath-linkld.so(8)
我的直觉是,-rpath实际上设置了DT_RPATH,并且-rpath-link设置了DT_RUNPATH,但我在任何地方都找不到这一点得到证实。我一直用-rpath; 如果它与我不应该使用它相同DT_RPATH,但是我在动态链接上找到的操作方法文章说要使用它,所以我不确定它是否相同。
有人可以澄清DT_RPATH和是如何设置的,以及它们是否与和DT_RUNPATH相同?-rpath-rpath-link
当您编译程序时,您创建目标文件,然后将它们链接在一起。你可以使用GNU ld(1)来链接它们,还有其他链接器,LLVM链接器。链接器将目标文件组合成可执行文件。GNU ld(1) 是 binutils 的一部分,可在此处获取文档。
当您执行已经编译好的可执行文件时,动态链接器 ld.so(8) 会在系统上找到该可执行文件所依赖的库,加载它们并执行该可执行文件。ld.so(8) 是一个共享库,通常作为 C 标准库的一部分分发,通常在 Linux 上是 glibc,但也有其他库,例如 musl。
我认为这两个程序都被命名为“链接器”,这很令人困惑。一种是“编译链接器”,另一种是“可执行链接器”。
如何设置 DT_RPATH 或 DT_RUNPATH?
编辑 elf 文件以包含特定部分。
当使用 GNU ld 创建 elf 文件时,现在您可以使用-rpath=something. 您可以RPATH使用 来设置部分--disable-new-dtags -rpath=something。RPATH 已弃用,因此通常-rpath设置 RUNPATH。https://www.javaer101.com/en/article/1127068.html *这不会在我的系统上检查,我必须编译gcc -Wl,--enable-new-dtags -Wl,-rpath=/tmp以设置 RUNPATH...
您还可以在编译后在任何 ELF 文件中设置部分。请参阅我可以更改已编译的二进制文件中的“rpath”吗?
它们是否与-rpath和-rpath-link相同?
来自ld 文档:
-rpath 和 -rpath-link 之间的区别在于 -rpath 选项指定的目录包含在可执行文件中并在运行时使用,而 -rpath-link 选项仅在链接时有效。
该文档还解释了如何-rpath-link工作。就是指定搜索依赖共享库的目录。
最后还有一个LD_RUN_PATH环境变量
编译可执行文件时,GNU ld(1) 还会在此变量指定的目录中搜索库。
| 归档时间: |
|
| 查看次数: |
5541 次 |
| 最近记录: |