ELF共享库:重定位偏移超出​​范围

时间:2010-02-02 19:53:10

标签: gcc shared-libraries ld binutils

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

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

BTW:我使用gcc v4.4.1在Ubuntu-Karmic-32bit上

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

这是我应该关注的吗?

1 个答案:

答案 0 :(得分:0)

快速回答:“这是我应该关注的吗?”

更长的答案:elflint不仅检查ABI标准,还检查一些ELF约定。 ABI和ELF约定都会随着时间而变化:ABI被扩展,并且必须保持向后兼容,并且ELF约定会随着时间的推移而发展(主要是为了获得新功能)。因此,elflint的期望必须与汇编器/链接器(在这种情况下为GNU binutils)产生的预期保持同步。你可以在elflint上找到很多关于GNU binutils中引入的新ELF扩展的报告,以及elflint稍后会捕获的报告。因此,最有可能的是,您的elflint版本对于已安装的binutils来说太旧了。由于elflint没有那么多使用,因此Linux发行版不会让这两者保持同步并不会让我感到惊讶。