当前位置: 首页 > 面试题库 >

使用RPATH但不使用RUNPATH?

邹英发
2023-03-14
问题内容

此页面- http://labs.qt.nokia.com/2011/10/28/rpath-and-
runpath/

-说,大约为了在ld.so库搜索:

Unless loading object has RUNPATH:
    RPATH of the loading object,
        then the RPATH of its loader (unless it has a RUNPATH), ...,
        until the end of the chain, which is either the executable
        or an object loaded by dlopen
    Unless executable has RUNPATH:
        RPATH of the executable
LD_LIBRARY_PATH
RUNPATH of the loading object
ld.so.cache
default dirs

然后建议:

运送二进制文件时,请使用RPATH而不是RUNPATH或确保在运行它们之前已设置LD_LIBRARY_PATH。

那么,RPATHwith的使用RUNPATH是不好的,因为RUNPATHkind-
of会取消,RPATH因此间接动态加载无法按预期工作?但是,为什么然后RPATH不赞成RUNPATH呢?

有人可以解释情况吗?


问题答案:

运送二进制文件时,最好为用户提供使二进制文件适应其自身系统细节的方法,其中包括调整库搜索路径。

用户通常可以调整LD_LIBRARY_PATH/etc/ld.so.conf,两者的优先级均低于DT_RPATH,即您不能覆盖二进制文件中的硬编码内容,而如果使用DT_RUNPATH,则用户可以使用进行覆盖LD_LIBRARY_PATH

(FWIW,我认为ld.so.conf也应该优先于DT_RUNPATH,但无论如何,至少我们有LD_LIBRARY_PATH)。

另外,我强烈不同意以上使用的建议DT_RPATH。IMO,最好DT_RPATH不要DT_RUNPATH在出厂的二进制文件中使用。

除非

您附带了所有依赖库和可执行文件,并希望确保在安装后使用JustWork(tm),在这种情况下请使用DT_RPATH



 类似资料:
  • 我使用两次作为启动参数启动了java应用程序(Java8版本),而不是使用一次和一次。我马上改变了它,但我在研究它会有什么影响。 它会默认设置吗?它是否没有最大的堆内存,对垃圾回收器有影响,运行的频率降低,甚至不运行?

  • 问题内容: 我正在使用JDK-8(x64)。对于(原始),我在Java文档中发现了以下内容: 排序算法是Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch编写的Dual-Pivot Quicksort 。 对于(对象),我找到了“ Timsort”: 此实现是一个稳定的,自适应的,迭代的 mergesort 。此实现 将指定的列表转储到数组中,对数组进行排

  • 有时,在处理流的两个步骤之间对流中的每个元素进行“处理”(例如打印)会很方便,例如调试。 一个简单的例子可能是这样的,不幸的是,这不起作用,因为消耗流: 如何做到这一点?

  • 我正在尝试在Windows 10 Home(64位)中安装Java。就像许多教程指出的那样,我下载了Javajdk安装文件,执行了它,安装后更改了环境变量中的路径。但是由于某种原因,当我执行命令“javac”时,它会在命令提示符中返回非内部/外部命令错误,但在Powershell中运行绝对正常。我试图通过卸载Java并非常小心地重新安装它来纠正这一点,遵循所有步骤,但这仍然继续发生。 此外,在安装

  • 我一直在使用docker撰写文件来运行在生产中部署到kubernetes的微服务架构的开发环境,因此我使用将k8s提供的域名映射到撰写服务名称。例如 使用时一切正常。但是当使用新的(注意没有连字符)时,容器无法相互粉碎。Kafka连接失败。HTTP请求失败。 docker cli版本的compose与旧的命令之间是否有任何更改。没有hypen,我看不到docker compose的版本,但有了它,

  • 问题内容: 我有一段代码,使用时会出错,但使用时会正确编译。我了解到的是,只需要定义至少一个变量,就不需要定义其他变量,但是考虑到此代码,这是Go中的错误吗? 无法编译的代码: 错误:services / db_service.go:16:会话已声明且未使用 编译代码 改变是 至 问题答案: 该运算符用于短变量声明。它声明并初始化变量。 在第一个示例中,您已在全局范围中声明了变量,并且在函数中声明