有一个软件包elfutils
,其中包含一个名为eu-elflint
检查 ELF 二进制文件的程序(就像lint
C 一样——因此得名)。
出于好奇,我用这个工具检查了我们自己的共享库,发现了很多问题,例如:
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 上也会发生同样的情况
这是我应该关心的事情吗?