如何设置DT_RPATH或DT_RUNPATH? [英] How do I set DT_RPATH or DT_RUNPATH?
问题描述
在Linux上,ld.so(8)
手册页讨论了动态库的搜索顺序。它说DT_RPATH
已弃用,还提到了DT_RUNPATH
。未提及-rpath
链接器选项。
ld(1)
手册页提到-rpath
和-rpath-link
选项,但从未提及DT_RPATH
或DT_RUNPATH
,除非是在说明库搜索顺序中,这当然与ld.so(8)
中提供的信息不匹配。
LD_RUN_PATH
环境变量。ld(1)
表示未设置-rpath
和-rpath-link
选项时使用,但ld.so(8)
未提及。
我的直觉是-rpath
实际上设置了DT_RPATH
,而-rpath-link
设置了DT_RUNPATH
,但我在任何地方都找不到这一点得到证实。我一直使用-rpath
;如果它与DT_RPATH
相同,那么我就不应该使用它,但我找到的关于动态链接的How-to文章说要使用它,所以我不确定它是否相同。
请问DT_RPATH
和DT_RUNPATH
是如何设置的,它们是否与-rpath
和-rpath-link
相同?
推荐答案
当您编译程序时,您创建目标文件,然后将它们链接在一起。您可以使用GNU ld(1)来链接它们,还有其他链接器,LLVM链接器。链接器将目标文件组合成可执行文件。GNU%d(%1)是带有documentation available here的二进制文件的一部分。
当您执行已编译的可执行文件时,动态链接器ld.so(8)在系统上查找可执行文件所依赖的库,加载它们并执行该可执行文件。Ld.so(8)是一个共享库,通常作为C标准库的一部分分发,通常是在Linux上发布的glibc,但也有其他库,如MUSL。
我认为这两个程序都被命名为&linker&令人困惑。一种类似于";编译链接器;另一种类似于";可执行链接器。
如何设置DT_RPATH或DT_RUNPATH?
编辑ELF文件以包括特定部分。
在使用GNU LD创建ELF文件时,现在使用-rpath=something
设置RUNPATH节。您可以用--disable-new-dtags -rpath=something
设置RPATH
节。RPATH已弃用,因此通常-rpath
设置RUNPATH。https://www.javaer101.com/en/article/1127068.html*这在我的系统上没有签出,我必须使用gcc -Wl,--enable-new-dtags -Wl,-rpath=/tmp
编译以设置RUNPATH...
还可以在编译后在任何ELF文件中设置节。请参见Can I change 'rpath' in an already compiled binary?
它们是否与-rpath和-rpath-link相同?
发件人ld documentation:
-rpath和-rpath-link之间的区别在于,由-rpath选项指定的目录包含在可执行文件中并在运行时使用,而-rpath-link选项仅在链接时有效。
文档还解释了-rpath-link
的工作原理。指定用于搜索依赖共享库的目录。
最后还有一个LD_RUN_PATH环境变量
当编译可执行GNU%d(%1)时,还会在此变量指定的目录中搜索库。
这篇关于如何设置DT_RPATH或DT_RUNPATH?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!