Muitas seções, erro assembler, usando boost :: spirit
Eu estou no progresso de escrever um compilador para um subconjunto de Java, usandoboost::spirit
, para lexing e parsing. Durante a compilação da fase lexer / parser, o compilador consome1.6GB
de RAM (g++ (GCC) 4.8.1
), isso não é um problema, pois há muita memória nesta máquina.
O que é um problema, no entanto, é que quando o compilador é feito, e o assembler começa a rodar (GNU assembler (GNU Binutils) 2.23.52.20130604
), cai com;
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
Adicionando'-Os'
ao meu compilador flags, permite que o assembler processe a saída do compilador, mas como eu vejo, é apenas uma questão de tempo, até que eu acerte o mesmo problema, mesmo com o pequeno sinalizador de otimização.
Inspecionando, o tamanho do arquivo de objeto otimizado (ast_generate.o
) usandoobjdump
, me diz que estou gerandope-x86-64
, que é o que eu esperaria no Windows.
o2358
seções geradas, é no entanto um choque para mim. Principalmente, parece que uma seção foi gerada para cada parte doboost::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
...
Então minhas perguntas são;
É o número no erro (too many sections (X)
), o número de seções a serem geradas, ou é um código de erro?Por que uma seção é gerada para cada tipo de dados?O que posso fazer para evitar ter que passar'-Os'
para o meu compilador. Ou seja, o que posso fazer para corrigir o problema em vez de contorná-lo?A divisão da fase lexer e parse em duas fases distintas (e unidades de compilação), conectadas somente através de um iterador lexer, me ajudaria?Nota; Estou compilando usandocygwin64
.