Я занимаюсь написанием компилятора для подмножества Java, используя boost::spirit
, для лексинга и синтаксического анализа. Во время компиляции фазы lexer/parser компилятор потребляет 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
, чего я ожидал бы в Windows.
Сгенерированные разделы 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
.