Forum: Compiler & IDEs Probleme beim Bau einer Toolchain mit gcc-3.3.3


von J. K. (jkraemer)


Lesenswert?

Hallo allerseits,
seit geraumer Zeit versuche ich verzweifelt eine vorgegebene Toolchain 
(u.a. mit gcc-3.3.3) ans Laufen zu bekommen. Es handelt sich hierbei um 
einen Cross-Compiler für einen PowerPC (Motorola MPC8250).
Das Entwicklungssystem ist ein schickes Debian Squeeze: kernel 2.6.32-5, 
gcc-4.4.5 und einem etwas älteren gcc-3.4.

Beim Kompilieren bricht er an einer Stelle ab und bringt jede Menge 
Fehlermeldungen:
1
verzeichnis/gcc-3.3.3/gcc/cp/decl.c -o cp/decl.o
2
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘push_binding_level’:
3
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:727: error: lvalue required as left operand of assignment
4
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘pop_binding_level’:
5
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:783: error: lvalue required as left operand of assignment
6
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘suspend_binding_level’:
7
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:800: error: lvalue required as left operand of assignment
8
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:819: error: lvalue required as left operand of assignment
9
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘resume_binding_level’:
10
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:832: error: lvalue required as left operand of assignment
11
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘pushdecl_with_scope’:
12
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:4559: error: lvalue required as left operand of assignment
13
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:4561: error: lvalue required as left operand of assignment
14
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘cxx_init_decl_processing’:
15
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:6964: error: lvalue required as left operand of assignment
16
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘grokdeclarator’:
17
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:10816: error: lvalue required as left operand of assignment
18
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:10819: error: lvalue required as left operand of assignment
19
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘start_function’:
20
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:14465: error: lvalue required as left operand of assignment
21
In file included from /verzeichnis/gcc-3.3.3/gcc/cp/decl.c:15472:
22
./gtype-cp.h: In function ‘gt_ggc_mx_lang_decl’:
23
./gtype-cp.h:354: warning: case label value exceeds maximum value for type
24
./gtype-cp.h: In function ‘gt_ggc_mx_lang_type’:
25
./gtype-cp.h:396: warning: case label value exceeds maximum value for type
26
make[2]: *** [cp/decl.o] Fehler 1
27
make[2]: Leaving directory `/verzeichnis/gcc-3.3-final/gcc'
28
make[1]: *** [all-gcc] Fehler 2
29
make[1]: Leaving directory `/verzeichnis/gcc-3.3-final'
30
make: *** [/verzeichnis/gcc-3.3-final/.compiled] Fehler 2

Jetzt habe ich mich in der besagten Datei decl.c ein wenig umgeschaut.
Um Zeile 680 herum wird current_binding_level definiert:
1
#define current_binding_level      \
2
  (cfun && cp_function_chain->bindings    \
3
   ? cp_function_chain->bindings    \
4
   : scope_chain->bindings)
In allen Zeilen, die die Fehlermeldungen verursachen, wird in 
current_binding_level irgendetwas reingeschrieben. Jetzt wird in 
current_binding_level natürlich selbst nichts reingeschrieben, sondern 
in eine der beiden Strukturen, die im #define erwähnt werden. Das 
scheint aber irgendwie nicht zu funktionieren...

Hat jemand eine Idee woran es liegt? Es kann doch nicht sein, dass ein 
frisch heruntergeladenes gcc-3.3.3 sich nicht kompilieren lässt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

J. Krämer schrieb:
> Es kann doch nicht sein, dass ein
> frisch heruntergeladenes gcc-3.3.3 sich nicht kompilieren lässt.

Doch, offenbar schon. ;-)  Da war wohl der Parser in älteren
Versionen etwas laxer in dem, was er an nicht standardgemäßer
Syntax noch durchgehen lassen hat.

Entweder beschaffst du dir einen hinreichend alten Hostcompiler
dafür (vermutlich wird jede 3.x-Version noch gehen), oder du
dröselst diese Bugs wirklich auf, indem du aus jeder der
angemoserten Zuweisungen eine if-Anweisung machst.  Das lässt
sich eventuell ja trotzdem noch über ein #define vereinfachen,
so in der Art
1
#define set_current_binding_level(lev) \
2
  do { \
3
    if (cfun && cp_function_chain->bindings)    \
4
       cp_function_chain->bindings = (lev);   \
5
    else \
6
       scope_chain->bindings = (lev); \
7
  } while(0)

und dann alle Statements der Art

current_binding_level = \(.*\);

durch

set_current_binding_level(\1);

ersetzen.  Den alten Makro current_binding_level wirst du sicher
trotzdem noch lassen müssen, denn ich vermute ganz stark, dass der
auch auf der rechten Seite in Ausdrücken benutzt wird.

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo,

stell mal sicher, dass Du den X-Compiler mit dem gcc-3.x.x übersetzt:
probier mal "gcc --version"

Gruß

Olaf

von J. K. (jkraemer)


Lesenswert?

Ich habe den "Fehler" vermutlich beheben können.
In der initialen Makefile hatte ich gcc-3.4 angegeben, aber es werden 
anscheinend weitere aufgerufen, die einfach nur gcc verwenden.
Daraufhin habe ich in /usr/bin den Softlink gcc geändert. Jetzt zeigt 
gcc nicht mehr auf gcc-4.4, sondern auf gcc-3.4 und es läuft momentan 
sehr gut durch.
Nun heißt's abwarten und Tee trinken :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

env CC=gcc-3.4 ../configure

sollte da eigentlich helfen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.