GCC/G:为没有旧Linux内核的GNU唯一对象符号构建

我目前正在为大量代码更新构建系统,这恰好包括一个Linux C项目.如果这里的所有开发人员都可以在使用他们自己的想法进行攻击时运行构建会很好,所以我正在研究是否有可能在模糊的现代Linux系统上构建它,尽管目标系统是2.6.18.

通过’模糊的现代’,我估计像GCC 4.5这样的东西,过去一两年的分布可能会附带.目前我通过静态编译来解决libstdc问题,并且通过使用快速的包装代码重新映射到旧版本的memcpy符号(等等),可以巧妙地解决任何glibc问题.到现在为止还挺好.

我似乎无法完全弄清楚的一个问题是,.o文件中可执行文件中内置的某些符号是’u’类型,它是一个GNU唯一对象,是2.6.18不能用于ELF标准的扩展似乎根本没有认识到.这意味着可执行文件不能运行,因为它无法找到符号,尽管它们实际上存在(目标上的类型为’?’,来自’nm’).

可以在编译G时禁用GNU唯一对象的使用,但这并不是最方便的解决方案.在编译代码时我看不到任何方法来禁用它(发行版gcc / g总是有这个选项),我想目标系统识别它的唯一方法就是更新ld-linux和内核.这几乎肯定不会发生.

有没有找到禁用这些符号类型的选项?或许也有一些巧妙的方法,或者我缺少的东西?我开始怀疑它只需要在G 4.1.x上编译,这将意味着从源代码开始的旧Linux安装或构建.

最佳答案
我试图处理同样的问题(这导致我发现这个问题)并且经过一系列的研究得出了明确的结论:不,你没有遗漏任何东西,除了编译你自己的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

如果你在周围搜索,你会发现有人因为各种原因在其他名单上抱怨过,但我想这就是留下来的.

转载注明原文:GCC/G:为没有旧Linux内核的GNU唯一对象符号构建 - 代码日志