我的 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,但这意味着我们必须修改你的库在我们收到它们之后”。