如何设置DT_RPATH或DT_RUNPATH? [英] How do I set DT_RPATH or DT_RUNPATH?

查看:0
本文介绍了如何设置DT_RPATH或DT_RUNPATH?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Linux上,ld.so(8)手册页讨论了动态库的搜索顺序。它说DT_RPATH已弃用,还提到了DT_RUNPATH。未提及-rpath链接器选项。

ld(1)手册页提到-rpath-rpath-link选项,但从未提及DT_RPATHDT_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_RPATHDT_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆