【问题标题】:Compiling GCC 4.x.x on MinGW / MSYS Fails在 MinGW / MSYS 上编译 GCC 4.x.x 失败
【发布时间】:2010-07-24 03:09:30
【问题描述】:

上周我一直在尝试编译任何 GCC 4 系列编译器以在 GCC 版本附带的 MinGW 5.1.6 / MSYS 1.0.11(来自 Sourceforge.org 的自动安装程序)中运行3.4.5。最终目标是安装 GCC 4.5,但我无法构建任何 4.x.x 编译器。

我已将其范围缩小为导致某些异常行为的构建指令序列。编译器执行:

build/genmodes.exe > tmp-modes.c
/bin/sh ../../gcc-4.2.4/gcc/../move-if-change tmp-modes.c insn-modes.c
echo timestamp > s-modes
gcc -c   -g -fkeep-inline-functions -DIN_GCC   -W -Wall -Wwrite-strings
-Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wmissing-format-attribute
-fno-common   -DHAVE_CONFIG_H -I. -I. -I../../gcc-4.2.4/gcc -I../../gcc-4.2.4/gcc/.
-I../../gcc-4.2.4/gcc/../include -I./../intl -I../../gcc-4.2.4/gcc/../libcpp/include
-I../../gcc-4.2.4/gcc/../libdecnumber -I../libdecnumber    insn-modes.c -o insn-modes.o

cc1.exe: out of memory allocating 2239725803 bytes
make[3]: *** [insn-modes.o] Error 1
make[3]: Leaving directory `/home/root/gcc-4.2.4-build/gcc'
make[2]: *** [all-stage1-gcc] Error 2
make[2]: Leaving directory `/home/root/gcc-4.2.4-build'
make[1]: *** [stage1-bubble] Error 2
make[1]: Leaving directory `/home/root/gcc-4.2.4-build'
make: *** [all] Error 2

主要问题似乎是对 genmodes.exe 的调用。它构建了一个大小约为 2GB 的 C 文件 (insn-modes.c),据我所知,其中大部分填充了空格(尽管偶尔会出现 C 代码行)。 GCC 3.4.5 扼杀了它,这就是构建结束的方式。在我尝试过的所有版本中都表现出类似的行为,除了 4.5,由于其他原因而失败,我希望可以通过使用中间版本的编译器来解决。

那么,三个问题:

  1. 有其他人经历过这种情况吗?
  2. 是什么原因造成的?
  3. 如果存在任何解决方法,该怎么办?

我正在尝试在 64 位 Windows 7 机器上执行此操作。

谢谢。

更新:我已将两个可疑文件的压缩副本上传到 this location. 事实证明 min-insn-modes.c 也比应有的大。这两个文件(总共超过 3GB)压缩到 121KB。

【问题讨论】:

    标签: c++ c gcc mingw msys


    【解决方案1】:

    我也有同样的问题;我已将其缩小到 genmodes.c 中的 tagged_printf。我仍然不知道为什么它失败了,但是将 tagged_printf 的定义(从 do 到并包括 while)替换为以下解决了问题:

    #define tagged_printf(FMT, ARG, TAG) printf(" " FMT ",\n", ARG)

    【讨论】:

      【解决方案2】:

      insn-modes.c 不应该很大或充满空格; genmodes 出现故障。我不知道为什么它会那样失败,但我很想看看 insn-modes.c (如果你把它放在一个 .zip 文件中,它应该把它缩小到你可以合理地将其上传到某处并将 URL 编辑到您的问题中)。

      手动从文件中删除所有额外的空格 (tr -s ' \r\n\t\v\f' ' ') 可能会得到可以编译的东西。

      编辑:我查看了您上传的 min-insn-modes.c,我认为 Bryan 是对的,tagged_printf 中有一个错误:每次调用它时,它都会发出类似700 万个空格字符。 Bryan 的更改应该可以帮助您克服这个障碍,或者您可以通过将定义更改为以下内容来帮助进一步调查:

      #define tagged_printf(FMT, ARG, TAG) do { \
          int count_ = printf (" " FMT ",", ARG); \
          printf ("\t/* %s [%d], */\n", TAG, count_); \
      } while (0)
      

      这也应该使您的构建成功,我希望看到 min-insn-modes.c 进行了更改。 (也不需要 insn-modes.c。)

      补充: 请查看 emit_insn_modes_h() 函数。它还包含带有 %n 说明符的 printf,需要与上面类似的修改:

      int count_ = printf ("  %smode,", m->name);
      

      如果不进行此更改,insn-modes.h 也会被大量空格填充。

      【讨论】:

      • 我更新了问题并发布了两个可疑文件(min-insn-modes.c 和 insn-modes.c)的 zip 链接。
      • and:更新了我的答案,如果您不介意,可以尝试新的东西。
      • 这两个都有要编译的代码。然而,这个建议对我很有吸引力,因为它更接近原始 genmodes.c 源中的内容。
      • 我认为您可能误解了我的建议 - 它避免了错误,但它也检测了代码,以便我们找出错误是什么并让 GCC 开发人员修复它。我想再次查看 min-insn-modes.c,它是由我的更改生成的。
      【解决方案3】:

      MSDN 文档是这样说的:

      安全说明 %n 格式本质上是不安全的,默认情况下是禁用的;如果在格式字符串中遇到 %n,则调用无效的参数处理程序,如参数验证中所述。要启用 %n 支持,请参阅 _set_printf_count_output

      所以 _set_printf_count_output(1) 应该可以解决问题。 是的,这很糟糕。

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 2010-12-06
        • 2021-02-09
        • 2018-06-16
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多