2011-10-04 171 views
20

下载并编译了glibc-2.13。当我尝试运行一个实例malloc()的示例C程序时。我得到以下错误 elf file OS ABI invalidglibc:elf文件操作系统ABI无效

可有人请把我的任何指针有帮助解决这个issue.Please注意到,我的内核版本是Linux-2.6.35.9

+0

信息有点短缺。你确定你正在链接和运行该libc吗? – Mat

回答

29

这不是你的内核版本这就是问题所在。

系统上的加载程序不支持新的Linux ABI。直到最近,Linux ELF二进制文件都使用了ABI的System V。最近,为了支持STT_GNU_IFUNC,增加了Linux ABI。您必须更新系统 C库以使其具有支持STT_GNU_IFUNC的加载程序,然后它还将识别带有Linux ABI类型的ELF对象。

请参阅Dave Miller's blog entry on STT_GNU_IFUNC for Sparc以了解STT_GNU_IFUNC的功能,如果您在意的话。

+1

嘿谢谢mkj。这是一个很好的信息。我刚刚取代了ld-linux.so(基本上,ld-2.13.so),并开始为我工作。万一你很好奇,我的设置就像我创建了一个linux-diskless目标并在虚拟机上运行它。这个问题开始出现在我已经将libc.so.6(glibc-2.9左右)替换为libc.so.6(glibc-2.13)的root-fs中,并且比较了以前的libc.so的OS-ABI。如你所说,它显示了“系统V”,其中较新的那个具有“Linux”。 – Kapil

+0

啊,我没有意识到你已经替换了系统C库而没有更换加载器,或者我会在我的建议中更具体。我假设你正在做一些类似于使用LD_LIBRARY_PATH来加载替代库的方法。很高兴有帮助! – mkj

2

很可能你的glibc是用--enable-multiarch标志,强制使用ifunc和新的Linux ABI

1

从我可以告诉的是--enable-multiarch是默认设置,你应该通过设置--enable-multiarch=no禁用它建成。

0

如果您从新系统中获得装载机的手,则可以使用该系统进行工作。但是,无论程序运行在哪里,您都必须随身携带。您可以编译程序以使用该加载器,如here所述,或者编译您的程序并使用patchelf对其进行修补,方式与我提到的here类似。我能够运行一个程序,该程序在Linux 2.6.18(比你的旧版本)有ld-2.5.so的情况下给我提供了OS ABI invalid错误,从其他地方复制ld-2.15.so。

注意:做不是覆盖您的系统ld * .so或ld-linux。 ; -/