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

对不起,如果这是一个明显的问题,但我在网上发现了惊人的少数引用...

我正在使用由我们的一个业务合作伙伴用C语言编写的API,并以Fedora 11为基础构建的.so二进制文件提供给我们。我们一直在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上运行。


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

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

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


Windows在不同的释放,服务包,安装的SDK和一般的DLL(DLL地狱,任何人?)之间具有兼容性问题。 Linux不能解决相同类型的问题。

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

  • 运行时库更改
  • 链接库更改
  • 内核更改
  • 编译器技术的变化(例如:EGCS gcc版本之前和之后,这可能是你的问题)。
  • 打包程序问题(RPM与APT)
  • 在你的特定情况下,我会让他们在他们的系统上执行“gcc -v”并向你报告gcc版本号。 将其与您正在使用的内容进行比较。

    您可能需要掌握该版本的编译器才能使用。


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

    在这里输入图像描述

    链接地址: http://www.djcxy.com/p/41885.html

    上一篇: Binary compatibility between Linux distributions

    下一篇: What is the difference between Cygwin and MinGW?