Linux发行版之间的二进制兼容性

时间:2009-11-20 15:47:45

标签: c linux compiler-construction binary-compatibility

很抱歉,如果这是一个显而易见的问题,但我在网上发现的参考文献很少......

我正在使用我们的业务合作伙伴用C语言编写的API,并将其作为.so二进制文件提供给我们,构建在Fedora 11上。我们一直在测试Fedora 11开发机器上的API没问题。但是,当我尝试在我们客户的目标平台(恰好是SuSE Enterprise 10.2)上链接API时,我收到“文件格式无法识别”错误。

同样属于binutils包的命令,例如objdump或nm,给我带来了相同的文件格式错误。 “file”命令显示:

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上运行。

6 个答案:

答案 0 :(得分:3)

Windows在不同的版本,服务包,已安装的SDK和一般的DLL(DLL Hell,任何人?)之间存在兼容性问题。 Linux并不能解决同样的问题。

我见过的兼容性问题包括:

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

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

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

答案 1 :(得分:3)

我认为诀窍在于使用您希望支持的任何平台的最旧内核和C库版本来构建Linux。在我的工作中,我们建立在Debian 4上,它允许我们以非官方的方式正式支持Debian 4及以上版本,RedHat 3,4,5,SuSE 10以及其他各种发行版(SELinux等)。

我怀疑通过构建一个不错的新版本的Linux,很难支持旧机器上的人。

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

答案 2 :(得分:3)

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

enter image description here

答案 3 :(得分:2)

这只是个人观点,但在Linux上以二进制形式分发内容时,您有以下几种选择:

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

  2. 有些人建议并找到你能找到并在那里建造的最古老的发行版。我个人认为这是一个荒谬的想法。见第3点。

  3. 分发二进制文件,然后静态链接。特别是对于libstdc ++,这似乎是你的问题。似乎有许多不兼容的libstdc ++版本浮出水面,这使它成为兼容性的噩梦。如果您无法静态链接,还可以将* .so文件与二进制文件放在一起,并使用LD_PRELOADLD_LIBRARY_PATH之类的内容使它们在运行时优先链接。请注意,如果您采用这种方式,您可能必须遵守LGPL等,因为您现在正在与您的项目一起分发其他人的工作。

  4. 当然,在Linux上始终首选以源代码形式分发项目。 : - )

答案 4 :(得分:1)

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

答案 5 :(得分:0)

我不知道Suse,但我知道Fedora喜欢留在最前沿。所以你可能对图书馆版本非常正确。你为什么不问,看看你是否可以获得源代码并在Suse机器上构建它?