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

标签 linux gcc abi

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

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

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

最佳答案

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

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

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

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

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

关于linux - 如何避免二进制文件中的 STT_GNU_IFUNC 符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54532815/

相关文章:

linux - Selenium 测试用例在 Firefox 中有效,但在 Chrome 中无效 - Headless Setup

linux - 命令列出除 . (点)和..(点点)

c++ - MSVC 2015 为 std::vector 选择不正确的构造函数重载

c - 程序退出,代码为 : 5 - Geany with gcc

c++ - 返回元组时 GCC/Clang x86_64 C++ ABI 不匹配?

linux - 在 Linux 上检查所有文件和文件夹所有者/组和权限的任何命令

linux - 在哪里可以找到在 linux 2.6.21.5-cfs-v19 上运行的 arm 目标的 gdb

c++ - 如何正确引用匿名命名空间中的函数

c++ - 使用用于传递参数的寄存器的预定顺序调用约定是否有特殊原因?

c - C 编译器如何实现返回大型结构的函数?