【问题标题】:Different GNU ABI Tag for same C library version?相同 C 库版本的不同 GNU ABI 标签?
【发布时间】:2018-04-25 21:17:20
【问题描述】:

我的 Linux 机器上有两个 ELF 二进制文件。当我在它们上运行file 时,我收到以下信息:

File#1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.2.0, not stripped

File#2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.2.5, stripped

现在据我了解,for GNU/Linux 2.2.X 部分源自二进制文件的.note.ABI-tag 部分,并由链接器添加。 2.2.X 的结果值取决于链接到二进制文件的 C 库版本,并描述了此 C 库版本支持的最低 ABI 版本——这意味着具有 Linux 内核 >= 的机器将支持文件 #1 2.2.0 和文件 #2 在 Linux 内核 >= 2.2.5 的机器上。 (这是正确的,还是我在这里已经错了?)

我认为 ABI 标记的差异源于两个二进制文件中包含的两个不同的 C 库版本。但是当我检查二进制文件的字符串时,它们都包含字符串glibc 2.3.2

这怎么可能?在我看来,GNU C 库的某种补丁不会导致版本号更改会更改受支持的 ABI 版本,这似乎是不合理的......

【问题讨论】:

  • 只是猜测(不了解 libc 版本控制的复杂性),但file 给出的版本可能取决于可执行文件使用的实际功能;即第一个可执行文件使用 v2.2.0 中最后更改的函数,而第二个可执行文件使用 v2.2.5 中已修补的某些函数...?

标签: linux gcc glibc elf abi


【解决方案1】:

glibc ABI 应该独立于为其构建的内核版本,并且测试套件会尝试验证新构建的 glibc 是否符合官方 ABI。

glibc 版本所需的最低内核版本可以在 glibc 配置时指定,这就是 .note.ABI-tag 部分的内容。不需要修补 glibc 源代码。我不完全确定配置的最低内核版本最终以动态链接的二进制文件结束是否正确(因为应该可以在具有不同构建 glibc 的旧内核上运行二进制文件)。

但是,对于静态链接的二进制文件,这当然是正确的,因为配置更高的最低内核版本会导致程序无法在旧内核上运行。

【讨论】:

  • 感谢您的回答,但您认为是什么导致了支持的内核版本发生变化?链接器是否确定需要哪个内核版本,以及二进制文件中是否包含其他静态库,这些可能会提高最低内核版本?
  • 我假设这两个二进制文件是针对不同版本的 glibc 静态链接的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2012-05-08
  • 2016-03-11
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多