Gcc ELF共享库:重新定位偏移量超出范围

Gcc ELF共享库:重新定位偏移量超出范围,gcc,shared-libraries,ld,binutils,Gcc,Shared Libraries,Ld,Binutils,有一个软件包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_OFFSE

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

顺便说一句:。。。使用gcc v4.2.4的Debian-Lenny-64位也会发生同样的情况

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

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

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