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

我需要部署到一个红帽4.1.2框(其中有gcc 4.1.2)。 我在Ubuntu 11.10上使用GCC 4.6.1进行开发。 不幸的是我的构build过程创build的一些二进制文件在RedHat机器上不可用。 原因似乎是一个ABI更改,根据另一个Stackoverflow问题导致STT_GNU_IFUNC符号的引入。 有没有办法阻止导出任何这样的符号,以便我的二进制文件可以使用旧的ABI? 我使用nm在我的二进制文件中查找任何“我”types的符号,但没有find。

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

希望是明确的。 提前致谢。

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

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

曾经有“apgcc:一个GCC封装来制作可移植的二进制文件”,这使得这很容易(它从上面引用),但它似乎已经不存在了;-(

最简单的选择是建立在一台旧机器上(我曾经在RedHat 6.2上构建过,所产生的二进制文件到处都是 )。 您不必在物理机器上运行RH-6.2,只需将其放入虚拟机即可。

另一个比较简单的选择是使用旧版本的工具和库(如RH-6.2)来构建chroot

交叉编译到一个较旧的Linux可能是非常困难的,这只是你会遇到的许多问题之一。

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