【发布时间】: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 中已修补的某些函数...?