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

时间:2015-07-17 17:34:46

标签: environment-variables ld rpath

我不明白为什么当-L已经告诉共享库路径在哪里时,有必要使用LD_LIBRARY_PATH提供rpath或set env varible。

this answer说:-L告诉ld在链接时,哪里可以找到链接的库。

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

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

1 个答案:

答案 0 :(得分:1)

它绝对不是链接器"的错误特征。

-L(一个更旧的标志)只是告诉链接器在该目录中查找与任何后续-l标志匹配的任何库,包括静态库/存档(记住,在以前的时代,这是唯一的类库。故意保留仅限链接时间标志;链接器的业务完成后,它没有任何效果。

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

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

或许可以看一下http://sta.li/faq针对动态链接的令人信服的案例。