我如何在Linux上编译与所有发行版共享?

我在Fedora Core 12上编译了一个PHP扩展,但是当我把它发送给使用CentOS的人时,他们得到错误:“ELF file OS ABI invalid”

我不确定是什么原因导致这个正在运行的文件提供了以下信息:ELF 64位LSB共享对象,AMD x86-64,版本1(GNU / Linux),没有剥离

加载正常的扩展从文件中提供以下内容:ELF 64位LSB共享对象,AMD x86-64,版本1(SYSV),未删除

所以看来我需要为某些发行版产生一个SYSVtypes文件,而不是GNU / LINUX文件,不知道如何。 任何指针?

也应该静态链接?

声明:“ELF文件操作系统ABI无效”,意味着应用程序二进制接口在所使用的二进制文件之间不兼容(即试图混合主机和目标二进制文件,这可能无法按预期工作)。 ELF头的e_ident[EI_OSABI]字节包含操作系统/ ABI标识。 当你朋友的CentOS系统将它设置为ELFOSABI_SYSVELFOSABI_NONE0 )时,你的Fedora系统将它设置为ELFOSABI_LINUX3 )。

可以编译FreeBSD的brandelf实用程序( brandelf.c )并使用它将OSABI设置为ELFOSABI_SYSVbrandelf -f 0 <file>brandelf -t SVR4 <file>

我不知道任何gcc标志在编译/链接时指定此值。 我相信在Fedora系统上gcc使用的binutils版本负责将OSABI设置为Linux。 我的理解是,如果STT_GNU_IFUNC符号在输出文件中结束,则链接器仅指定ABI(有关STT_GNU_IFUNC的详细信息,请参阅http://groups.google.com/group/generic-abi上&#x7684;STT_GNU_IFUNC )。


可以使用readelf(1)命令来检索和显示ELF头中存储的ABI信息( readelf -h <file> )。


这个类似的问题也可能是有趣的。

编译的目标文件通常不会在不同的Linux发行版之间传输。 不同的分布对图书馆来说往往有不同的政策,在那里存储,如何加载。

他们之间有很多不同(即使在Fedora&RedHat / CentOS中也是如此)。 他们可能会在每个级别(内核,PHP,库位置)为组件提供自己的补丁。 如果他们正在使用发行版PHP包,那么发行版可能会更好地将其修补到他们的系统中。

您可能遇到的主要问题是分发使用了不同的库/编译器设置。 检查看看他的电脑上有什么vercc gcc,并将它与你的电脑进行比较。 (Fedora 12有不止一个比CentOS更新的库)。 这就是你的问题所在。

另一个可能的问题是你的二进制文件很好,但它与它使用的所有库不兼容。 我不确定是否有一个很好的方法来解决这个问题,而没有编译目标分布(或变量)。 您可以使用lld <file>命令查看每个共享对象/可执行文件所使用的库。

另外,有错误ELF file OS ABI invalid之前有任何输出ELF file OS ABI invalid ? 我看到的大部分地方都被引用了,这里有更多的信息。

这很可能是你的朋友没有运行一个64位系统。 ELF是Linux可执行文件的标准格式,但32位系统无法运行64位可执行文件。

从你的朋友获取uname -a的输出。 如果输出不包含“x86_64”,那么他就是一个32位版本的CentOS。

如果是这样的话,你需要建立一个交叉编译环境,或者一个用于编译32位二进制文​​件的虚拟机,或者只是给你的朋友提供源代码,以便他自己编译它。