5

抱歉,如果这是一个明显的问题,但我在网上发现的参考资料令人惊讶地少......

我正在使用由我们的一位业务合作伙伴用 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 上运行。

4

6 回答 6

3

Windows 在不同版本、服务包、已安装的 SDK 和一般 DLL 之间的兼容性方面存在问题(DLL Hell,有人知道吗?)。Linux 也不能幸免于同类问题。

我看到的兼容性问题包括:

  • 运行时库更改
  • 链接库更改
  • 内核更改
  • 编译器技术更改(例如:EGCS gcc 前后版本。这可能是您的问题)。
  • 打包程序问题(RPM 与 APT)

在您的特定情况下,我会让他们在他们的系统上执行“gcc -v”并向您报告 gcc 版本号。将其与您使用的进行比较。

您可能必须掌握该版本的编译器来构建您的一半。

于 2009-11-20T16:10:37.813 回答
3

您可以使用Linux Application Checker工具([1][2][3])来解决 Linux 发行版之间应用程序的兼容性问题。它将检查您的文件格式和所有依赖库。它支持几乎所有流行的 Linux 发行版,包括所有版本的 SuSE 和 Fedora。

在此处输入图像描述

于 2011-01-15T21:03:43.447 回答
3

我认为诀窍是在你希望支持的任何平台的最旧内核和 C 库版本的 linux 上构建。在我的工作中,我们建立在 Debian 4 之上,这使我们能够以非官方的方式正式支持 Debian 4 及更高版本、RedHat 3、4、5、SuSE 10 以及各种其他发行版(SELinux 等)。

我怀疑通过构建一个不错的新版本的 linux,在旧机器上支持人们变得很困难。

(编辑)我应该提到我们使用 Debian 4 附带的默认编译器,我认为它是 GCC 4.1.2。安装更新的编译器版本往往会使兼容性变得更糟。

于 2009-11-20T16:29:00.473 回答
2

这只是个人意见,但在 Linux 上以二进制形式分发某些东西时,您有几个选择:

  1. 为阳光下的每个发行版构建 .debs 和 .rpms 的范围,并为您错过的任何内容使用名义上的“.tar.gz full of binaries”包。第一部分很理想但很麻烦。后一部分将引导您进入第 2 点和第 3 点。

  2. 按照一些人的建议去做,找到你能找到并在那里构建的最古老的发行版。我个人的看法是,这是一种荒谬的想法。见第 3 点。

  3. 分发二进制文件,并尽可能地静态链接。特别是对于 libstdc++,这似乎是你的问题。似乎有很多不兼容的 libstdc++ 版本四处飘荡,这使其成为兼容性的噩梦。如果你不能静态链接,你也可以把 *.so 文件放在你的二进制文件旁边,并使用类似LD_PRELOADorLD_LIBRARY_PATH的东西让它们在运行时优先链接。请注意,如果您采用这条路线,您可能必须遵守 LGPL 等,因为您现在正在与您的项目一起分发其他人的工作。

当然,在 Linux 上总是首选以源代码形式分发您的项目。:-)

于 2011-01-15T21:14:24.120 回答
1

如果消息是无法识别的文件格式,那么问题很可能是 elmarco 在评论中提到的问题——即不同的架构。它可能(我不确定)是动态链接器版本不匹配,但这意味着 .so 文件是使用古老的动态链接器构建的。我不相信 libc 中的任何不兼容性会导致这种情况——它们可能会导致链接失败和运行时问题(后者很少发生),但不是这个。

于 2009-11-20T16:39:59.037 回答
0

我不了解 Suse,但我知道 Fedora 喜欢走在最前沿。所以你很可能对库版本是正确的。你为什么不问问看你能不能得到源代码并在你的 Suse 机器上构建它?

于 2009-11-20T21:26:11.127 回答