3

有一个软件包elfutils,其中包含一个名为eu-elflint检查 ELF 二进制文件的程序(就像lintC 一样——因此得名)。

出于好奇,我用这个工具检查了我们自己的共享库,发现了很多问题,例如:

eu-elflint libUtils.so

section [ 2] '.dynsym': _DYNAMIC symbol size 0 does not match dynamic segment size 248
section [ 2] '.dynsym': _GLOBAL_OFFSET_TABLE_ symbol size 0 does not match .got.plt     section size 3076
section [ 8] '.rel.plt': relocation 0: offset out of bounds
section [ 8] '.rel.plt': relocation 1: offset out of bounds
...
section [ 8] '.rel.plt': relocation 765: offset out of bounds

作为交叉检查,我从下面的源代码构建了一个非常简单的共享库

int foo(int a) {
   return a + 1;
}

// gcc -shared -fPIC -o libfoo.so foo.c

并再次尝试...

eu-elflint libfoo.so

section [ 9] '.rel.plt': relocation 0: offset out of bounds
section [ 9] '.rel.plt': relocation 1: offset out of bounds
section [23] '.comment' has wrong flags: expected none, is MERGE|STRINGS
section [25] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol size 0 does not match .got.plt section size 20
section [25] '.symtab': _DYNAMIC symbol size 0 does not match dynamic segment size 200

正如您所看到的,即使是微不足道的示例也显示出很多问题。

顺便说一句:我在 Ubuntu-Karmic-32bit 上使用 gcc v4.4.1

顺便说一句:......在 Debian-Lenny-64bit 和 gcc v4.2.4 上也会发生同样的情况

这是我应该关心的事情吗?

4

1 回答 1

0

快速回答:“这是我应该关心的事情吗?” 没有

更长的答案:elflint 不仅检查 ABI 标准,还检查一些 ELF 约定。ABI 和 ELF 约定都会随着时间而改变:ABI 是扩展的,并且必须保持向后兼容,而 ELF 约定确实会随着时间而发展(主要是为了获得新功能)。因此,elflint 的期望必须与您的汇编器/链接器(在本例中为 GNU binutils)生成的内容保持同步。你可以找到很多关于 GNU binutils 中引入的新 ELF 扩展的报告给 elflint,而 elflint 只是在以后才发现。因此,很可能您的 elflint 版本对于您安装的 binutils 来说太旧了。由于 elflint 的使用并不多,因此 Linux 发行版不能很好地保持这两者同步也就不足为奇了。

于 2010-02-11T10:56:12.447 回答