有一个软件包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/