8

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

这很好 - 但是我从供应商那里收到了一个共享库,其中 ELF 标头中给出的 OSABI 是 ELFSABI_LINUX (3)。

对于用于 Linux 系统的共享库来说,这听起来并不是一个不合理的值,但是它与我所有其他库的值不同 - 所以当我尝试使用 dlopen() 从一个在我的其他库中,这失败并出现错误“ELF 文件操作系统 ABI 无效”。

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

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

我想知道可能的原因是什么,因为这个特定的供应商在没有很多手的情况下不会做任何事情,我想说“你可能正在做 X,但这意味着我们必须修改你的库在我们收到它们之后”。

4

1 回答 1

4

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

于 2010-01-07T15:32:39.883 回答