GCC目标特定性和二进制兼容性

5

初始备注:问题提到AIX是因为这是最初的上下文,但问题实际上涉及gcc本身,很可能与平台无关。

AIX应该是向后兼容的:在AIX 5.1上编译的C程序将在5.2、5.3、6.1和7.1上原样运行。

据我所知,gcc应该构建为针对特定系统的(无论是当前系统还是在交叉编译的情况下选择另一个系统)。因此,在AIX 6.1上构建的gcc针对AIX 6.1,通过二进制兼容性可以产生可用于6.1和7.1的二进制文件。

然而,在AIX 6.1上构建的gcc本身是一个6.1程序,因此应该可以直接在7.1上执行。当然,如果我使用它在7.1上编译程序,该程序可能会链接或使用特定于7.1的头文件,从而使生成的二进制文件需要7.1。因此,就我所理解的来看,我应该能够在7.1机器上运行在AIX 6.1上构建的gcc,并且生成可能不是最优但完全有效的二进制文件,尽管由于链接的副作用,它们需要7.1。

这看起来有点像彩虹和独角兽在闪闪发光的天空下跳舞。我嗅到了一些可疑的东西,但对gcc内部没有任何了解。请赐教,众人。

简短概括: 在特定版本N的操作系统/平台上构建和针对该版本N目标的gcc是否可以通过平台二进制兼容性在版本N+1上运行并产生在版本N+1上运行的二进制文件?如果不能,是什么机制会阻止它?


perzl.org/aix是一个非常出色的项目,为AIX提供最新的RPM软件包。它特别提供了非常有用的GCC软件包,适用于每个AIX版本。不幸的是,AIX 7.1没有GCC。我会认为自己很幸运能够在AIX 6.1上使用gcc。 - Lloeki
问题应该在操作系统方面更具体。AIX可能更难,而Linux/BSD操作系统与旧版/新版更兼容。此外,答案将严重依赖于libc。 - osgx
1个回答

2
这里有些启示:你的问题太泛泛了。为了回答它,有人必须了解:
  • 你关心的操作系统
  • 你关心的操作系统版本
  • 你关心的gcc版本
然后研究在这个三维矩阵中的二进制兼容性。
防止二进制兼容性的机制太多了,直接与你的操作系统和编译器供应商的创新能力相关。其中一种更常见和有记录的方法是官方弃用API调用,移除已安装的兼容性库和烧毁桥梁,例如从a.out到ELF的转变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接