10

我需要部署到 Red Hat 4.1.2 机器(它有 gcc 4.1.2)。我在 Ubuntu 11.10 上使用 GCC 4.6.1 进行开发。不幸的是,我的构建过程创建的一些二进制文件在 RedHat 机器上不可用。原因似乎是 ABI 更改,根据另一个 Stackoverflow 问题,这是由于引入了 STT_GNU_IFUNC 符号。有没有办法防止导出任何此类符号,以便我的二进制文件可以使用旧的 ABI?我使用 nm 在我的二进制文件中查找任何“i”类型的符号,但没有找到。

我问这个是因为我构建的一些其他二进制文件以及一些第 3 方库(tbb、boost)没有使用新的 ABI,因此在 RedHat 机器上运行良好。

希望这很清楚。提前致谢。

4

3 回答 3

10

一般来说,UNIX 系统支持向后二进制兼容性(在旧机器上构建的二进制文件继续在新机器上运行),但不支持反向。您不能期望构建在新系统上的二进制文件可以在旧系统上运行。STT_GNU_IFUNC只是您将遇到的许多问题中的第一个。

如果您需要在较旧的机器上运行的较新机器上构建二进制文件,请参阅文档。

曾经有“apgcc:用于制作可移植二进制文件的 GCC 包装器”使这变得容易(从上面引用过),但它似乎已经消失了 ;-(

最简单的选择是在旧机器上构建(我曾经在 RedHat 6.2 上构建,生成的二进制文件到处运行)。您不必在物理机上实际运行 RH-6.2,只需在 VM 中启动即可。

另一个相对简单的选择是chroot再次使用旧发行版(例如 RH-6.2)中的工具和库来构建 .

于 2012-01-13T05:31:33.967 回答
1

由于APGCC似乎不再可用(除了这里这里)。这些glibc 头文件目前似乎是通过包含一个较旧的头文件从 C 代码生成可移植 Linux 二进制文件的最方便的方法。

于 2018-08-28T08:48:24.993 回答
0

交叉编译到较旧的 linux 可能非常困难,这只是您将遇到的众多问题之一。

也就是说,ABI 兼容性问题可以通过添加-Wl,-fno-jump-tables.

于 2017-04-29T00:32:39.887 回答