Zbyt wiele sekcji, błąd asemblera, używając boost :: spirit
Jestem w trakcie pisania kompilatora dla podzbioru Java, używającboost::spirit
, do leksykowania i parsowania. Podczas kompilacji fazy leksykonu / parsera kompilator zużywa1.6GB
pamięci RAM (g++ (GCC) 4.8.1
), nie stanowi to jednak problemu, ponieważ na tym komputerze jest dużo pamięci.
Problem polega jednak na tym, że kompilator jest gotowy, a asembler zaczyna działać (GNU assembler (GNU Binutils) 2.23.52.20130604
), zawiesza się;
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
Dodawanie'-Os'
do moich flag kompilatora, pozwala asemblerowi przetworzyć wyjście kompilatora, ale jak to widzę, to tylko kwestia czasu, dopóki nie trafię na ten sam problem, nawet z małą flagą optymalizacji.
Inspekcja, plik zoptymalizowany pod względem rozmiaru (ast_generate.o
) za pomocąobjdump
, mówi mi, że generujępe-x86-64
, czego oczekiwałem w systemie Windows.
The2358
wygenerowane sekcje są jednak dla mnie szokiem. Najczęściej wydaje się, że sekcja została wygenerowana dla każdej częściboost::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
...
Więc moje pytania są;
Czy numer jest w błędzie (too many sections (X)
), liczba sekcji do wygenerowania, czy jest to kod błędu?Dlaczego sekcja jest generowana dla każdego typu danych?Co mogę zrobić, aby uniknąć konieczności przechodzenia'-Os'
do mojego kompilatora. To znaczy, co mogę zrobić, aby rozwiązać problem, zamiast go obejść?Czy rozdzielenie fazy lexer i parse na dwie odrębne fazy (i jednostki kompilacji), połączone tylko przez iterator leksykalny, pomoże mi?Uwaga; Kompiluję używająccygwin64
.