考虑我有一个 ELF 共享库liba.so
,它导出一个符号from_a
。的实现from_a
是根据一个符号定义的from_b
,它是从共享库中导出的libb.so
,并且liba.so
有一个 DT_NEEDED 条目libb.so
。
我现在有了program
,它使用了 符号from_a
。当我链接 时program
,我-la
会在链接行中包含链接器查找所需的任何链接时间搜索路径(如果有)liba.so
。libb.so
对in 中的符号没有直接依赖关系program
。
第一个问题:是否保证(在可移植到所有使用系统的非损坏 ELF 的意义上)我不需要在链接行上列出间接依赖项(在这种情况下libb.so
)?我相信这是真的,但我想确认一下。链接器的这种行为是由任何规范规定的吗?如果是这样,哪一个(ELF规范?)liba.so
program
第二个问题:如果liba.so
和libb.so
安装在不默认搜索的非标准位置(比如 $HOME/lib,而不是 /usr/lib),那么在链接时program
,BFD 链接器,至少在我当前的系统和尽管库安装目录是用 -L 指定的,并建议使用or ,但我测试过的其他人很少会抱怨libb.so
找不到。但是,如果标识安装位置的 RPATH 或 RUNPATH 设置在 中,则 BFD 链接器将被放置。如果没有直接依赖,为什么 BFD 链接器关心是否可以在链接时找到?是通过将 RPATH 设置为 on 获得的行为-rpath
-rpath-link
liba.so
libb.so
program
liba.so
保证?依靠它来安抚链接器会很好。我还注意到在这种情况下黄金链接器不会失败。这里的预期行为是什么?