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

问题描述 投票:0回答:2

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

这个答案说:-L 告诉 ld 在哪里查找库以在链接时进行链接

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

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

environment-variables ld rpath
2个回答
4
投票

这绝对不是“链接器的错误特征”。

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

-rpath

是一个完全不同的野兽。其目的是在可执行文件或共享/动态库中嵌入一个或多个路径的列表,以搜索

动态库
,当在运行时r中的-rpath
)在共享库中查找必要的符号时
)。

在很多情况下,人们想要

-L

但不想要

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

也许可以看看

http://sta.li/faq

,了解反对动态链接的令人信服的案例。


0
投票
ld

可以完全实现一个功能标志,如果启用该功能标志,则在使用共享库时自动添加 RPATH。

CMake 提供了这样的功能:

INSTALL_RPATH_USE_LINK_PATH



添加链接器搜索路径并安装rpath。

INSTALL_RPATH_USE_LINK_PATH 是一个布尔值,如果设置为 TRUE,则会将链接器搜索路径中或包含链接库文件的项目外部的任何目录附加到已安装二进制文件的运行时搜索路径 (rpath)。这些目录附加在 INSTALL_RPATH 目标属性值之后。

© www.soinside.com 2019 - 2024. All rights reserved.