【发布时间】:2010-12-18 18:52:54
【问题描述】:
对不起,如果这是一个明显的问题,但我在网络上发现的参考资料非常少......
我正在使用由我们的一位业务合作伙伴用 C 编写的 API,并以 .so 二进制文件的形式提供给我们,基于 Fedora 11 构建。我们一直在使用 Fedora 11 开发机器测试该 API没问题。但是,当我尝试在我们客户的目标平台(恰好是 SuSE Enterprise 10.2)上链接 API 时,我收到“无法识别文件格式”错误。
也是 binutils 包的一部分的命令,例如 objdump 或 nm,给我同样的文件格式错误。 “文件”命令向我展示了:
ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped
“ldd”命令显示:
ldd: warning: you do not have execution permission for `./libuscuavactivity.so.1.1'
./libuscuavactivity.so.1.1: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./libuscuavactivity.so.1.1)
[dependent library list]
我猜这是由于两个平台上的 C 库之间不兼容,问题是代码是针对新版本的 glibc 等编译的,而不是 SuSE 10.2 上可用的。我发布这个问题是因为有一种方法可以在我们合作伙伴的 Fedora 11 平台上编译代码,使其也可以在 SuSE 10.2 上运行。
【问题讨论】:
-
在同一个架构上? (i386 != amd64)
-
我应该提到构建平台和目标 SuSE 10.2 平台都是 x86_64。
-
您可以使用 objdump 或简单地执行 .so 来检查文件格式(是的,这是可能的)。它将是 ELF,因为它是从石器时代开始使用的。如果您有不兼容的 libc 版本,您将收到一条错误消息,其中说明了这一点 - 所以您的猜测很可能是错误的,问题可能是不同的。
-
实际上,在 SuSE 上运行的 objdump 给了我与链接器相同的“无法识别文件格式”错误。我已经编辑了问题以反映这一点并显示文件和 ldd 命令的输出,它们确实有效。
标签: c linux compiler-construction binary-compatibility