Слишком много разделов, ошибка ассемблера, используя boost :: spirit
м в процессе написания компилятора для подмножества Java, используяboost::spirit
, для lexing и разбора. Во время компиляции фазы лексера / парсера компилятор потребляет1.6GB
оперативной памяти (g++ (GCC) 4.8.1
), это не проблема, так какНа этой машине достаточно памяти.
Однако проблема заключается в том, что когда компилятор готов, и ассемблер начинает работать (GNU assembler (GNU Binutils) 2.23.52.20130604
), он падает с;
as: build/src/ast_generate.o: too many sections (33098)
/tmp/cc0ZyvKK.s: Assembler messages:
/tmp/cc0ZyvKK.s: Fatal error: can't write build/src/ast_generate.o: File too big
as: build/src/ast_generate.o: too many sections (33098)
/tmp/cc0ZyvKK.s: Fatal error: can't close build/src/ast_generate.o: File too big
scons: *** [build/src/ast_generate.o] Error 1
Добавление'-Os'
к моим флагам компилятора, позволяет ассемблеру обрабатывать выходные данные компилятора, но, как я вижу, это 'Это только вопрос времени, пока яЯ столкнусь с той же проблемой, даже с небольшим флагом оптимизации.
Проверка, оптимизирован ли размер объектного файла (ast_generate.o
) с помощьюobjdump
говорит мне, что ям генерацииpe-x86-64
что ябуду ожидать на винде.
2358
сгенерированные разделы, однако, шок для меня. Главным образом, поскольку кажется, что раздел был создан для каждой части;boost::spirit
CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_DISCARD
...
60 .pdata$_ZNK5boost5lexer6detail8end_node9unique_idEv 0000000c 0000000000000000 0000000000000000 00030750 2**2
61 .text$_ZNK5boost5lexer6detail8end_node11lexer_stateEv 00000010 0000000000000000 0000000000000000 0003075c 2**4
...
Итак, мои вопросы:
Это число в ошибке (too many sections (X)
), количество секций, которые будут сгенерированы, или это код ошибки?Почему раздел создается для каждого типа данных?Что я могу сделать, чтобы избежать необходимости проходить'-Os'
моему компилятору. То есть, что я могу сделать, чтобы исправить проблему, а не обойти ее?Поможет ли мне разделение фазы лексера и синтаксического анализа на две отдельные фазы (и единицы компиляции), связанные только через итератор лексера?Заметка; Я'м компиляции с использованием.cygwin64