2010-07-24 2 views
4

Я пытался на прошлой неделе или около того скомпилировать любую из компиляторов GCC 4 для работы в MinGW 5.1.6/MSYS 1.0.11 (автоматические установщики как от Sourceforge.org), который поставляется с версией GCC версии 3.4.5. Конечная цель - установить GCC 4.5 для установки, но я не смог собрать компиляторы 4.x.x для сборки.Компиляция GCC 4.xx на MinGW/MSYS Fails

Я сузил его до последовательности инструкций сборки, которые приводят к некоторому необычному поведению. Компилятор выполняет:

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) размером около 2 ГБ и который, насколько я могу судить, заполнен в основном пробелами (хотя там и там разбросаны отдельные строки кода C). GCC 3.4.5 дросселей на нем, и вот как заканчивается сборка. Подобное поведение проявляется во всех версиях, которые я пробовал, кроме 4.5, которые не срабатывают по другим причинам, которые я надеялся вылечить, используя промежуточную версию компилятора.

Итак, три вопроса:

  1. Кто-нибудь еще сталкивался с этим?
  2. Что вызывает это?
  3. Что, если какой-либо обходной путь существует?

Я пытаюсь сделать это на 64-битной машине Windows 7.

Спасибо.

Обновление: я загрузил сжатую копию двух файлов подозреваемых в this location. Оказывается, min-insn-modes.c также больше, чем должно быть. Эти два файла (более 3 ГБ) сжимаются до 121 КБ.

ответ

2

insn-modes.c не должно быть гигантским или заполнено пробелами; genmodes работает неправильно. Я не знаю, почему это так не получится, но мне было бы очень любопытно взглянуть на insn-modes.c (если вы поместите его в ZIP-файл, который должен сжать его до такой степени, чтобы вы могли достаточно загрузить его где-нибудь и изменить URL-адрес в свой вопрос).

Вручную удалять все лишние пробелы из файла (tr -s ' \r\n\t\v\f' ' ') может быть вам что-то, что можно скомпилировать.

EDIT: Я посмотрел на м-insn-modes.c вы загруженный, и я думаю, что Брайан является правильным, есть ошибка в tagged_printf: каждый раз, когда это называется, это что-то вроде 7 миллионов космических символов излучающего. изменение Брайана должно получить мимо этого препятствия, или вы могли бы помочь исследовать немного дальше, изменив определение для этого:

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

Это должно также сделать ваш билд успеха, и я хотел бы видеть мин-insn- mode.c с внесенными изменениями. (Нет необходимости в insn-modes.c а.)

Сложение: Пожалуйста, посмотрите в emit_insn_modes_h() функции.Он также содержит Printf с % п спецификатор, который должен быть изменен так же, как выше:

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

Без этого изменения insn-modes.h также наполняется огромным количеством пробелов.

+0

Я обновил вопрос и разместил ссылку на zip двух файлов подозреваемого (min-insn-modes.c и insn-modes.c). – andand

+0

andand: обновленный мой ответ, новая вещь для вас, если вы не возражаете. – zwol

+0

Оба из них получили код для компиляции. Однако это предложение обращается ко мне, поскольку оно ближе к тому, что было в исходном источнике genmodes.c. – andand

3

У меня такая же проблема; Я сузил его до tagged_printf в genmodes.c. Я до сих пор не знаю, почему это не удалось, но заменяя определить из tagged_printf (от дел до и включая время) с помощью следующей решаемой задачи:

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

+0

Спасибо. Я попробую попробовать – andand

2

MSDN документация говорит это:

Замечание по безопасности Формат% n по своей сути небезопасен и по умолчанию отключен; если в строке формата встречается% n, вызывается недопустимый обработчик параметров, как описано в разделе «Проверка параметров». Чтобы включить поддержку% n, см. _set_printf_count_output.

Так что _set_printf_count_output (1) должен устранить проблему. Да, это отстой.