有一个软件包elfutils,其中包括一个名为eu-elflint的程序,用于检查ELF二进制文件(与C的lint相同-因此为名称)。

出于好奇,我已经使用此工具检查了自己的共享库,发现了很多问题,例如:

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


如您所见,即使是简单的示例也显示了很多问题。

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

顺便说一句:...在gcc v4.2.4的Debian-Lenny-64bit上也是如此

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

最佳答案

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

更长的答案:elflint不仅检查ABI标准,而且检查某些ELF约定。 ABI和ELF约定都随时间而变化:ABI扩展了,必须保持向后兼容,并且ELF约定的确随着时间而发展(主要是为了获得新功能)。因此,必须将elflint的期望与您的汇编器/链接器(在本例中为GNU binutils)生成的内容保持同步。您可以找到许多报告给elflint,这些报告涉及GNU binutils中引入的新ELF扩展,而elflint仅在以后会有所报道。因此,最有可能的是您的elflint版本对于安装的binutils而言过旧。由于elflint的使用并不多,所以Linux发行版不能很好地保持这两个同步并不奇怪。

关于gcc - ELF共享库:重定位偏移超出​​范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2187169/

10-11 18:58