glibc:ELF文件OS ABI无效。

22

我下载并编译了glibc-2.13。当我尝试运行一个进行malloc()的C程序时,出现以下错误: elf文件OS ABI无效

请问有没有人能给我一些有用的指针来解决这个问题。请注意我的内核版本是linux-2.6.35.9。


这里的信息有点不太充足。你确定你在链接和运行那个libc库吗? - Mat
4个回答

34

问题不在于您的内核版本。

您的系统加载程序不支持新的Linux ABI。最近,为了支持STT_GNU_IFUNC,Linux ABI被添加到Linux ELF二进制文件中。您需要更新您的系统C库,以使其具备支持STT_GNU_IFUNC的加载程序,然后它也将识别具有Linux ABI类型的ELF对象。

如果您感兴趣,可以参见Dave Miller关于Sparc的STT_GNU_IFUNC的博客文章(已存档),以了解STT_GNU_IFUNC的作用。


2
嘿,谢谢mkj。那是一条很有用的信息。我刚刚替换了ld-linux.so(基本上是ld-2.13.so),然后事情就开始对我起作用了。以防你好奇,我的设置是这样的,我创建了一个无盘Linux目标,并在虚拟机中运行它。当我在root-fs中将libc.so.6(glibc-2.9或类似版本)替换为libc.so.6(glibc-2.13)时,问题开始出现。通过比较先前的libc.so.6的OS-ABI,它显示为“system V”,而新版本则为“Linux”,正如你所说的。 - Kapil
1
啊,我没有意识到你已经替换了系统 C 库,而没有替换加载器,否则我在给出建议时会更加具体。我原本以为你正在像使用 LD_LIBRARY_PATH 加载替代库那样做某些事情。很高兴能帮到你! - mkj

5
如果你得到了来自新系统的加载器,你可能可以使用它使其工作。但是你必须将加载器随处携带。你可以按照这里所述编译你的程序以使用该加载器,或者编译你的程序并稍后使用patchelf进行补丁修复,类似于我在这里提到的方式。我能够在一个拥有ld-2.5.so的linux 2.6.18(比你的版本更旧)上运行一个一直提示“OS ABI invalid”错误的程序,方法是从其他地方复制ld-2.15.so。
注意:不要覆盖你的系统 ld*.so 或 ld-linux。;-/

3

有可能您的glibc是使用了--enable-multiarch编译标记,这强制使用ifunc和新的LINUX ABI。


2
据我所知,--enable-multiarch 是默认设置,您应该通过设置 --enable-multiarch=no 来禁用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接