0

考虑我有一个 ELF 共享库liba.so,它导出一个符号from_a。的实现from_a是根据一个符号定义的from_b,它是从共享库中导出的libb.so,并且liba.so有一个 DT_NEEDED 条目libb.so

我现在有了program,它使用了 符号from_a。当我链接 时program,我-la会在链接行中包含链接器查找所需的任何链接时间搜索路径(如果有)liba.solibb.so对in 中的符号没有直接依赖关系program

第一个问题:是否保证(在可移植到所有使用系统的非损坏 ELF 的意义上)我不需要在链接行上列出间接依赖项(在这种情况下libb.so)?我相信这是真的,但我想确认一下。链接器的这种行为是由任何规范规定的吗?如果是这样,哪一个(ELF规范?)liba.soprogram

第二个问题:如果liba.solibb.so安装在不默认搜索的非标准位置(比如 $HOME/lib,而不是 /usr/lib),那么在链接时program,BFD 链接器,至少在我当前的系统和尽管库安装目录是用 -L 指定的,并建议使用or ,但我测试过的其他人很少会抱怨libb.so找不到。但是,如果标识安装位置的 RPATH 或 RUNPATH 设置在 中,则 BFD 链接器将被放置。如果没有直接依赖,为什么 BFD 链接器关心是否可以在链接时找到?是通过将 RPATH 设置为 on 获得的行为-rpath-rpath-linkliba.solibb.soprogramliba.so保证?依靠它来安抚链接器会很好。我还注意到在这种情况下黄金链接器不会失败。这里的预期行为是什么?

4

1 回答 1

0

根据上面提到的测试,这似乎适用于所有最新版本的 Ubuntu。如果您对这个问题感兴趣,并且使用我的测试,并且找到了该行为不起作用的平台,请在评论中回复。

于 2013-06-08T16:24:11.860 回答