我需要部署到Red Hat 4.1.2框(具有
gcc 4.1.2).我在Ubuntu 11.10上使用GCC 4.6.1进行开发.不幸的是,我的构建过程创建的一些二进制文件在RedHat机器上不可用.原因似乎是ABI变化,根据
another Stackoverflow question引入STT_GNU_IFUNC符号.有没有办法阻止导出任何这样的符号,以便我的二进制文件可以使用旧的ABI?我使用nm在我的二进制文件中查找“i”类型的任何符号,但没有找到.
我问这个是因为我构建的其他二进制文件以及一些第三方库(tbb,boost)都没有使用新的ABI,所以在RedHat机器上运行正常.
希望很清楚.提前致谢.
解决方法
通常,UNIX系统支持向后二进制兼容性(在旧机器上构建的二进制文件继续在较新的机器上运行),但反之则不然.您不能指望在新系统上构建的二进制文件可以在较旧的系统上运行. STT_GNU_IFUNC只是您遇到的许多问题中的第一个.
如果需要在较旧的机器上构建二进制文件,请在较旧的机器上运行,请参阅this文档.
曾经有过“apgcc:一个GCC包装器来制作便携式二进制文件”,这使得这很容易(从上面引用),但似乎已经不见了;-(
最简单的选择是在旧机器上构建(我曾经在RedHat 6.2上构建,并且生成的二进制文件随处可见).您不必在物理计算机上实际运行RH-6.2,只需将其置于VM中即可.
另一个相对容易的选择是在chroot中构建,再次使用旧版本的工具和库(例如RH-6.2).