2

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

这个答案说: -L 告诉 ld 在链接时在哪里寻找要链接的库。

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

PS:我想如果你有这个功能,那么可执行文件在其他环境中将毫无用处。但是如果是这样,那么ld在链接期间实际做了什么,或者如果 -rpath 在其他一些环境中不同,为什么有必要提供 -L 路径。

4

1 回答 1

3

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

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

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

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

或许可以看看http://sta.li/faq来寻找一个反对动态链接的令人信服的案例。

于 2016-02-29T04:59:54.440 回答