我的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在Linux内核> = 2.2.5的机器上,> = 2.2.0和文件#2。 (这是正确的,还是我在这里已经错了?)
我认为ABI标签的差异源于两个二进制文件中包含的两个不同的C库版本。但是当我检查二进制文件的字符串时,它们都包含字符串glibc 2.3.2
。
这怎么可能?对我来说似乎是不合理的,GNU C库的某种补丁并没有导致版本号的改变会改变支持的ABI版本......
答案 0 :(得分:0)
glibc ABI应该独立于它构建的内核版本,测试套件试图验证新构建的glibc是否符合官方ABI。
glibc发行版所需的最低内核版本可以在glibc配置时指定,这就是.note.ABI-tag
部分的结果。不需要修补glibc源。我不完全确定配置的最小内核版本是否在动态链接的二进制文件中结束是否正确(因为它应该可以在具有不同构建的glibc的旧内核上运行二进制文件)。
但是,对于静态链接的二进制文件,这当然是正确的,因为配置更高的最低内核版本将使程序无法在较旧的内核上运行。