2009-11-20 95 views
6

很抱歉,如果这是一个明显的问题,但我在网上找到了令人惊讶的一些参考...二进制兼容性

我与我们的业务合作伙伴用C语言编写的API时并以Fedora 11为基础构建的.so二进制文件提供给我们。我们已经在Fedora 11开发机器上测试了API,没有任何问题。但是,当我尝试与客户的目标平台(恰好是SuSE Enterprise 10.2)上的API进行链接时,出现“文件格式未识别”错误。

命令那也是binutils的包的一部分,如objdump的或纳米,给我相同的文件格式错误。 “文件”命令显示了我:

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

+2

在同一架构上? (i386!= amd64) – elmarco 2009-11-20 16:27:13

+0

我应该提到构建平台和目标SuSE 10.2平台都是x86_64。 – 2009-11-20 16:45:01

+0

您可以使用objdump或通过简单地执行.so来检查文件格式(是的,这是可能的)。这将是ELF,因为它是从石器时代开始使用的。如果你有不兼容的libc版本,你会得到一个错误信息,说明这一点 - 所以你的猜测很可能是错误的,这个问题可能是不同的。 – hirschhornsalz 2009-11-20 19:41:34

回答

4

我认为,关键是要建立在Linux上的最旧的内核和任何你想支持平台的C库版本一番风味。在我的工作中,我们基于Debian 4,它允许我们以非官方的方式正式支持Debian 4和更高版本,RedHat 3,4,5,SuSE 10以及其他各种发行版(SELinux等)。

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

(编辑)我要指出,我们采用自带的Debian 4,我认为这是GCC 4.1.2编译器默认。安装较新的编译器版本往往会使兼容性变得更糟。

3

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

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

  • 运行库改变
  • 链接库改变
  • 内核修改
  • 编译器技术的变化(如:前,后的电梯群控系统的gcc版本,这可能。成为你的问题)。
  • 打包问题(RPM与APT)

你的具体情况,我让他们做一个“GCC -v”他们的系统上,并且向你汇报的gcc版本号。将其与您正在使用的内容进行比较。

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

1

如果消息是不承认,那么问题是Elmarco公司,在留言中最有可能的一个文件格式 - 即,不同的架构。它可能(我不确定)是一个动态链接器版本不匹配,但这意味着.so文件是由一个古老的动态链接器构建的。我不相信libc中的任何不兼容可能导致这种情况 - 它们可能会导致链接失败和运行时问题(后者很少),但不是这样。

0

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

3

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

enter image description here

2

这只是个人意见,但分布在东西时,只有二进制文件的形成在Linux上,你有几种选择:

  1. 建立.deb文件和.rpms的色域对于每个发生在太阳下的发行版,对于任何你错过的任何东西,都会有一个名为“.tar.gz完整的二进制文件”的软件包。第一部分是理想但繁琐。后一部分将带领您到2点和3

  2. 做一些所提出的建议,并找到你可以找到和建立有最古老的发行。我个人的看法是这是一个荒谬的想法。见第3点。

  3. 分配二进制文件和静态链接哪里可以。特别是对于libstdC++,这似乎是你的问题。似乎存在很多不兼容的libstdC++版本,这使得它成为兼容性的噩梦。如果您无法静态链接,您还可以将* .so文件放在您的二进制文件旁边,并使用像LD_PRELOADLD_LIBRARY_PATH这样的文件使它们在运行时优先链接。请注意,如果您采用此路线,您可能必须遵守LGPL等,因为您现在正在将其他人的工作分配给您的项目。

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