代码之家  ›  专栏  ›  技术社区  ›  andand

在mingw/msys上编译gcc 4.x.x失败

  •  4
  • andand  · 技术社区  · 15 年前

    上周我一直在尝试编译gcc 4系列编译器中的任何一个,以便在gcc 3.4.5版附带的mingw 5.1.6/msys 1.0.11(sourceforge.org中的自动安装程序)中运行。最终的目标是安装GCC4.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的调用。它构建了一个C文件(insn modes.c),大小约为2GB,据我所知,该文件主要由空白填充(尽管这里和那里分散了C代码的偶尔行)。GCC 3.4.5阻塞了它,构建就是这样结束的。在我尝试过的所有版本中都显示了类似的行为,除了4.5,它由于其他原因失败了,我希望可以通过使用编译器的中间版本来解决。

    所以,有三个问题:

    1. 还有人经历过吗?
    2. 是什么引起的?
    3. 什么,如果存在任何解决方案?

    我正试图在64位Windows7计算机上执行此操作。

    谢谢。

    更新:我已将两个可疑文件的压缩副本上载到 this location. 结果表明,min insn模式c也比它应该的大。这两个文件(总共超过3GB)压缩到121KB。

    3 回复  |  直到 13 年前
        1
  •  2
  •   Community Mohan Dere    13 年前

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

    手动从文件中除去所有多余的空白( tr -s ' \r\n\t\v\f' ' ' )可能会给你一些可以编译的东西。

    编辑: 我看了你上传的min insn模式,我认为布莱恩是对的,有一个错误 tagged_printf :每次调用它,它都会发出大约700万个空格字符。布莱恩的改变应该能让你跨过这一关,或者你可以通过改变定义来帮助进一步调查:

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

    这也将使您的构建成功,我希望看到min insn模式。(无需输入模式C。)

    添加: 请看一下 发射模式 功能。它还包含printf %N 需要类似于上述内容修改的说明符:

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

    没有这个变化 信噪比模式 也会充满大量的空间。

        2
  •  3
  •   Bryan    15 年前

    我有同样的问题;我已经把它缩小到genmodes.c.中的tagged\u printf。我仍然不知道它为什么失败,但是用以下方法替换tagged\u printf的定义(从do到,包括while):

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

        3
  •  2
  •   osgx    13 年前

    msdn文档显示:

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

    因此,设置打印计数输出(1)应该可以解决这个问题。 是的,这太糟糕了。