ELF可执行文件:导入符号

时间:2015-05-05 12:49:29

标签: linux linker shared-libraries elf dynamic-linking

我希望每个动态链接的ELF二进制文件都有

  1. .gnu.version_r部分(或标记为DT_VERNEED的其他部分),以及
  2. 此部分包含从动态链接的共享对象导入的每个符号的必需版本。
  3. 然而,似乎有可能编译器/链接器添加DT_NEEDED条目(即嵌入所需共享对象的名称)而没有任何必需的版本信息。

    我能找到的最接近的陈述是Linux Standard Base Core Specification 3.1

      

    所有ELF对象都可以提供或依赖版本化符号

    ,更准确一点,在http://www.akkadia.org/drepper/symbol-versioning

      

    该实现允许每个DSO使用其版本   符号与否。取决于DSO是否链接了对象   如果有符号或不符号,则对DSO的引用需要符号   或不。

    如果我理解正确,这说明可以创建没有暴露符号的版本信息的共享对象。因此,如果没有必需的版本信息,可以引用这些符号。

    我的解释是否正确?

    这些情况应该很少,因为,为什么编译器/链接器不包含任何版本信息?

1 个答案:

答案 0 :(得分:1)

  

如果我理解正确,这说明可以创建没有暴露符号版本信息的共享对象。

正确。共享库在引入版本化符号之前大约需要10年。版本化符号是GNU / GLIBC扩展名。

  

因此,可以在没有必要版本信息的情况下引用这些符号。

版本信息是可选

  

这些情况应该很少,因为,为什么编译器/链接器不包含任何版本信息?

Au逆转。编译器/链接器包含版本信息,除非程序员告诉他们,并且这在GLIBC之外并不常见。