environment-variables - 为什么使用共享库时 -L 不自动包含 -rpath?

标签 environment-variables ld rpath

当 -L 已经告诉共享库路径在哪里时,我不明白为什么有必要提供 rpath 或使用 LD_LIBRARY_PATH 设置环境变量。

this answer说: -L 告诉 ld 在链接时在哪里寻找要链接的库。

但是为什么同时相应的-rpath没有自动设置?为什么我们需要再次手动执行?

P.S:我想如果你有这个功能,那么可执行文件在其他环境中将毫无用处。但如果是这样,那么 ld链接期间实际上做了什么,或者如果其他环境中的 -rpath 不同,为什么需要给出 -L 路径。

最佳答案

这绝对不是“链接器的错误功能”。

-L(一个更旧的标志)只是告诉链接器在该目录中查找与任何后续 -l 匹配的任何库标志,包括静态库/文件(请记住,在过去,这是唯一类型的库)。它有意保留仅链接时间标志;链接器的业务完成后就没有作用了。

-rpath 是一个完全不同的野兽。其目的是在运行时在共享库中查找必要的符号时,在可执行文件或共享/动态库中嵌入一个或多个搜索动态库路径的列表em> (-rpath 中的 r)。

在很多情况下,人们需要 -L 而不是 -rpath;特别是当人们特别想要链接静态库而不是遵循动态链接器时。在大多数平台上,覆盖内置 rpath(即使用 LD_PRELOAD 环境变量)相对简单,有些人实际上认为这是一个安全问题。

也许看看 http://sta.li/faq反对动态链接的令人信服的案例。

关于environment-variables - 为什么使用共享库时 -L 不自动包含 -rpath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481558/

相关文章:

linux - 是否设置了始终可靠的环境变量?

ld - 带有 Rust 的可移植二进制文件

macos - 如何在 OS X 上更改 RPATH

qt - 使用 Qt Creator 在 Unix 系统中开发 Qt 应用程序

vue.js - 在 nuxt 中针对不同情况使用不同的 env

apache-kafka - 在禁用 Zookeeper 审核后停止工作

c - 具有 __attribute__ 的 GCC 变量被视为已初始化的变量

g++ - 在 Ubuntu 18.04 上构建共享对象时嵌入 RPATH 而不是 RUNPATH

Angular 6 .env 与environment.ts 之间的差异

android - .so 文件创建期间的链接器错误。错误 : Function not Implemented