This page表示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,或者确保

所以,使用RPATHRUNPATH是不好的,因为RUNPATH抵消了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的建议.在我看来,最好在已发布的二进制文件中使用nether DT_RPATH而不是DT_RUNPATH.

除非

您将所有依赖库与可执行文件一起提供,并希望确保安装后的东西JustWork(tm),在本例中使用DT_RPATH.

Linux相关问答推荐

在不影响ROS2安装的情况下更新Ubuntu Linux中的CMake

使用ms宏将PIC图像放置在页面的任意位置

将十六进制文件名转换为十进制

Linux 中大型 TSV 的条件编辑

通过 ssh 在远程计算机上按索引访问数组元素

使用ansible配置Linux VM使用vmware_vm_shell模块时变成su?

删除 csv 列中的不匹配值

递归/详尽地将点插入字符串

读取命令停止执行 bash 脚本

awk 不打印所需的 df 输出

`G++ 4.9.4` 中关于 WEXITSTATUS 的奇怪行为

使用 AWS CLI 进行 Bash - 无法找到凭证

如何使用该位置的相对路径在单个位置创建多个文件夹?

如何排除 tar 的绝对路径?

nvm:无法卸载当前活动的 node 版本

Linux 和 I/O 完成端口?

Docker Bash 提示不显示 colored颜色 输出

ngrok 如何在防火墙后工作?

如何在redhat linux上安装maven

在 bash 脚本中使用备用屏幕