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

对不起,如果这是一个明显的问题,但我发现在网上惊人的less数参考…

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

Solutions Collecting From Web of "Linux发行版之间的二进制兼容性"

我认为诀窍是建立一个linux的味道与你想支持的任何平台的最古老的内核和C库版本。 在我的工作中,我们基于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 Application Checker工具( [1] , [2] , [3] )来解决Linux发行版之间的应用程序兼容性问题。 它会检查你的文件格式和所有相关的库。 它支持几乎所有流行的Linux发行版,包括SuSE和Fedora的所有版本。

在这里输入图像描述

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

  1. 在太阳下为每个发行版建立一个.debs和.rpms的色域,用一个名为“.tar.gz full binaries”的软件包来处理你错过的任何东西。 第一部分是理想的,但繁琐。 后半部分会引导你到第二点和第三点。

  2. 按照一些建议,找到最古老的发行版,你可以在那里找到并建立。 我自己的意见是这是一个荒谬的想法。 见第3点。

  3. 分发二进制文件,并静态链接到任何你可以。 特别是对于libstdc ++,这似乎是你的问题在这里。 似乎存在很多不兼容的libstdc ++版本,这使得它成为一个兼容的噩梦。 如果不能静态链接,也可以将* .so文件放在二进制文件中,并使用LD_PRELOADLD_LIBRARY_PATH类的LD_PRELOAD使它们在运行时优先链接。 请注意,如果您采用此路线,则可能需要遵守LGPL等,因为您现在正在将其他人的工作分配给您的项目。

当然,在Linux上总是首选以源代码形式发布项目。 🙂

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

我不知道Suse,但我知道Fedora喜欢留在流血的边缘。 所以你可能对图书馆版本很对。 你为什么不问,看看你是否可以获得源代码,并在你的Suse机器上构建它?