6

我目前正在为大量代码更新构建系统,其中恰好包括一个 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 安装或从源代码构建。

4

1 回答 1

7

我试图处理同样的问题(这导致我找到了这个问题),经过大量研究得出明确的结论,不,你没有遗漏任何东西,除了编译你自己的 g++ 之外没有其他办法。在 gcc-help 邮件列表中查看这个最近的问题:

http://gcc.gnu.org/ml/gcc-help/2013-01/msg00008.html

我比较了 gcc 的来源,发现你可以达到 4.4 的最高价格,因为在 4.5 中添加了独特的符号。然而,在 RHEL/CentOS 6 上,它们默认为 4.4,但在其中修补了唯一符号支持,因此像往常一样必须注意特定于发行版的 gcc 版本。对我来说这是一个巨大的麻烦,因为这意味着在 RHEL 6 上编译的东西不能在 RHEL 5 上运行,即使是为 gcc 4.4 + RHEL 5 制作的 libstdc++ 副本。

顺便说一下,这是首次提出唯一符号支持的消息:

https://gcc.gnu.org/ml/gcc-patches/2009-07/msg01240.html

如果您四处搜索,您会发现人们出于各种原因在其他列表中抱怨它,但我想它会一直存在。

于 2013-03-24T23:55:05.180 回答