Linux系统(Fedora 9)上的所有标准共享库都将ELFOSABI_NONE(0)指定为其OSABI。

很好-但是我从供应商那里收到了一个共享库,其中ELF header 中提供的OSABI是ELFOSABI_LINUX(3)。

对于一个供Linux系统使用的共享库,这听起来不算是一个不合理的值,但是它与我所有其他库的值都不一样-因此,当我尝试使用dlopen()从一个库中打开该库时我的其他库中的该库失败,并显示错误“ELF文件OS ABI无效”。

我编译了FreeBSD实用程序brandelf.c,并使用它将OSABI类型更改为0,现在该库似乎可以与其他所有功能配合使用。

我只是想知道-您为什么认为该库被标记为ELFOSABI_LINUX?我猜想也许他们在另一个系统上交叉编译并指定了一些导致该值设置为ELF header 的gcc标志?我试图实现类似的目的,但是无法确定适当的gcc标志或多个标志。

我想知道可能的原因,因为这个特定的供应商如果没有很多手将不做任何事情,并且我想说“您可能正在执行X,但这意味着我们必须修改您的库在我们将它们交付后”。

最佳答案

可能是供应商在FreeBSD上或使用最新的Fedora系统进行交叉编译,其中使用STT_GNU_IFUNC的所有内容都将被标记为ELFOSABI_LINUX。如果您尝试在Linux上使用它,就像您将其更改为ELFOSABI_NONE一样,应该没有问题。

09-04 21:01
查看更多