ELF 可执行文件:导入符号所需的版本信息

ELF executables: required version information for imported symbols

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

  1. 一个 .gnu.version_r 部分(或另一个标记为 DT_VERNEED 的部分),并且
  2. 此部分包含从动态链接共享对象导入的每个符号所需的版本。

然而,似乎存在 compiler/linker 添加 DT_NEEDED 条目(即嵌入所需共享对象的名称)而没有任何所需版本信息的情况。

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

All ELF objects may provide or depend on versioned symbols

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

The implementation allows every DSO to either use versions for their symbols or not. Depending on whether the DSO an object is linked against had symbols or not, the reference to the DSO requires symbols or not.

如果我理解正确的话,这意味着可以创建没有公开符号版本信息的共享对象。因此,可以在没有 要求 版本信息的情况下引用这些符号。

我的解释正确吗?

虽然这些情况应该很少见,因为,为什么 compiler/linker 不包含任何版本信息?

If I understand it correctly, this says that it is possible to create shared objects without version information for an exposed symbol.

正确。共享库比版本化符号的引入早了大约 10 年。版本化符号是 GNU/GLIBC 扩展。

And thus, there can be references to these symbols without required version information.

版本信息可选

These cases should be rare though, since, why would the compiler/linker not include any version information?

相反。 compiler/linker 包含版本信息,除非程序员告诉他们这样做,这在 GLIBC 之外并不常见。