- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我的 Linux 系统 (Fedora 9) 上的所有标准共享库都指定 ELFOSABI_NONE (0) 作为它们的 OSABI。
这很好 - 但是我从供应商那里收到了一个共享库,其中 ELF header 中给出的 OSABI 是 ELFOSABI_LINUX (3)。
对于用于 Linux 系统的共享库,这听起来不是一个不合理的值,但是它与我所有其他库的值不同 - 所以当我尝试打开这个库,带有 dlopen(),来 self 的其他库之一,失败并出现错误“ELF 文件操作系统 ABI 无效”。
我编译了 FreeBSD 实用程序 brandelf.c并使用它将 OSABI 类型更改为 0,现在库似乎可以很好地处理其他所有内容。
我只是想知道 - 为什么您认为这个库被标记为 ELFOSABI_LINUX?我猜他们可能在另一个系统上交叉编译并指定了一些导致这个值被设置到 ELF 头文件中的 gcc 标志?我试图实现类似的目标,但无法确定合适的 gcc 标志。
我想知道可能的原因是什么,因为这个特定的供应商如果没有大量的指导就不会做任何事情,我想能够说“你可能正在做 X,但这意味着我们必须在我们收到它们后修改您的库”。
最佳答案
供应商可能在 FreeBSD 上交叉编译或使用最新的 Fedora 系统,其中任何使用 STT_GNU_IFUNC 的东西都将被标记为 ELFOSABI_LINUX。如果您尝试在 Linux 上使用它,那么将它更改为 ELFOSABI_NONE 应该没有问题,就像您所做的那样。
关于linux - 为什么共享库的 ELF header 将 Linux 指定为 OSABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020961/
我是一名优秀的程序员,十分优秀!