我在Fedora Core 12上编译了一个PHP扩展,但当我将它发送给使用CentOS的人时,他们得到错误:"ELF文件操作系统ABI无效"
我不确定是什么原因导致此运行文件提供以下信息:ELF 64位LSB共享对象,AMD x86-64,版本1(GNU/Linux),未剥离
加载正常的扩展提供以下文件:ELF 64位LSB共享对象,AMD x86-64,版本1(SYSV),未剥离
因此,似乎我需要为某些发行版生成SYSV类型文件,而不是GNU/LINUX文件,不知道如何.有什么指针吗?
我也应该静态链接吗?
声明:"ELF文件OS ABI无效",意味着应用程序二进制接口在所使用的二进制文件之间不兼容(即一个尝试混合主机和目标二进制文件,这可能无法按预期工作).ELF头的e_ident[EI_OSABI]
字节包含操作系统/ ABI标识.你的Fedora系统,将其设置为(),而你的朋友的CentOS系统是将其设置为(或).ELFOSABI_LINUX
3
ELFOSABI_SYSV
ELFOSABI_NONE
0
您可以编译FreeBSD brandelf实用程序(brandelf.c)并使用它将OSABI设置为ELFOSABI_SYSV
(brandelf -f 0
或brandelf -t SVR4
.
我不知道在编译/链接时指定此值的任何gcc标志.我相信你的Fedora系统上gcc使用的binutils版本负责将OSABI设置为Linux.这是我的理解是连接器只指定ABI如果一个 STT_GNU_IFUNC
符号在输出文件中结束了(见ifunc.txt在http://groups.google.com/group/generic-abi的细节STT_GNU_IFUNC
).
所述readelf(1)命令可用于检索和显示(存储在ELF头的ABI信息readelf -h
).
这个类似的问题也可能是有意义的.