小编典典

如何避免二进制文件中出现STT_GNU_IFUNC符号?

linux

我需要部署到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”类型的符号,但均未找到。

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

希望很清楚。提前致谢。


阅读 602

收藏
2020-06-02

共1个答案

小编典典

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

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

曾经有“ apgcc:用于制作可移植二进制文件的GCC包装器”可以简化此操作(从上面引用),但是它似乎已经消失了;-(

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

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

2020-06-02