我目前正在为大量代码更新构建系统,其中恰好包括一个 Linux C++ 项目。如果这里的所有开发人员都可以在使用自己的想法时运行构建,那就太好了,所以我正在研究是否有可能在模糊的现代 Linux 系统上构建它,尽管目标系统是 2.6.18。
通过“模糊的现代”,我估计像 GCC 4.5+ 这样的东西,过去一两年的发行版可能会附带一些东西。目前,我通过静态编译解决了 libstdc++ 问题,并且任何 glibc 问题都可以通过使用一些快速包装代码重新映射到旧版本的 memcpy 符号(等等)来巧妙地解决。到现在为止还挺好。
我似乎无法完全弄清楚的一个问题是,从 .o 文件构建到可执行文件中的某些符号的类型为“u”,这是 GNU 唯一对象,是 2.6.18 不支持的 ELF 标准的扩展好像完全不认识。这意味着可执行文件不会运行,因为它找不到符号,尽管它们实际上存在(只是目标上的类型“?”,来自“nm”)。
编译 G++ 时可以禁用 GNU 唯一对象,但这并不是最方便的解决方案。在编译代码时我看不到任何方法来禁用它(发行版 gcc/g++ 总是有这个选项),我想让目标系统识别它的唯一方法是更新 ld-linux 和内核. 这几乎肯定不会发生。
有没有我没有找到禁用这些符号类型的选项?或者也许有一些巧妙的方法可以解决这个问题,或者我错过了什么?我开始怀疑它只需要在 G++ 4.1.x 上编译,这意味着旧的 Linux 安装或从源代码构建。