Der Gnu gcc
-
Hallo!
Ich habe ein Programm welches mit dem letzen gcc3 (gcc-3.4.6) mit der Option -m486 noch richtig übersetzt wird, mit dem gcc4 (>=gcc-4.0.0) funktioniert das schon nicht mehr. Die Ergebnisse sind falsch. Wo liegen die größten Unterschiede der
beiden Compiler-Versionen? Hat jemand eine Idee, woran das liegen könnte?Gruß
Boris
-
Was heißt "richtig"? Wird fehlerhafter Code erzeugt oder kompiliert er es nicht?
Schau dir doch mal die Changelog an. So ohne Code (Code as in _minimales Beispiel was den Fehler illustriert_) oder Fehlermeldungen etc. können wir dir wohl kaum helfen.
-
Ich kann leider kein Bsp.-Code angeben, da das Minimal-Bsp. schon sehr lang bzw. unübersichtlich ist. Zweitens wird der C-CODE durch einen Pre-Compiler automatisch generiert. Der generierte C-Code des Pre-Compilers, den ich auch mit verschiedenen gcc-Versionen übersetzt habe, ist immer der Gleiche. An ihm liegt es wohl nicht. Die Changelogs habe ich mir angeguckt, aber viele Änderungen gab es am gcc nicht. Ich sehe zwei mögliche Fehlerquellen:
1. "The cast-as-lvalue, conditional-expression-as-lvalue and compound-expression-as-lvalue extensions, which were deprecated in 3.3.4 and 3.4, have been removed."
Was auch immer das bedeutet. Kann mir das jemand erklären?
2. Die globale Optimierung des gcc's. Wenn ich mit -O0 kompiliere, sollten aber alle Codeoptimierungen ausgeschaltet sein und er sollte das gleiche Binary erzeugen wie die vorherigen Versionen. Oder sehe ich das falsch?Gruß
Boris
-
Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Kompiliert es nun oder nicht? Wenn nicht, dann wären die Fehlermeldungen recht nett. Hat es beim gcc3 irgendwelche Warnungen gegeben?
-
1. http://gcc.gnu.org/gcc-3.4/changes.html
Handelt sich wohl um eine Erweiterung des GCCs die entfernt wurde und Code ala
int i; (char)i=5;
erlaubt hat.
2. Nein
-
rüdiger schrieb:
1. http://gcc.gnu.org/gcc-3.4/changes.html
Handelt sich wohl um eine Erweiterung des GCCs die entfernt wurde und Code ala
int i; (char)i=5;
erlaubt hat.
Ok, dann müssten ab dem gcc4 ein Abbruch beim kompilieren kommen. Er kompiliert
aber ohne Warnungen und Abbrüche.2. Nein
Es liegen also irgendwo Unterschiede an den Binaries, aber wie kann ich Sie
finden? Ich habe es mit 'cmp' probiert, was mir aber nicht viel gebracht hat.Ja, er kompiliert alles ohne Fehler und Warnungen, nur liefert das Binary ab dem
gcc4 falsche Ergebnisse bei den durchgeführten Berechnung im Programm.
-
hjdt schrieb:
Es liegen also irgendwo Unterschiede an den Binaries, aber wie kann ich Sie
finden? Ich habe es mit 'cmp' probiert, was mir aber nicht viel gebracht hat.WENN du auf dieser Ebene suchen willst würde ich mit beiden Compilern mit -s kompilieren und dann ein diff machen.
-
darthdespotism schrieb:
hjdt schrieb:
Es liegen also irgendwo Unterschiede an den Binaries, aber wie kann ich Sie
finden? Ich habe es mit 'cmp' probiert, was mir aber nicht viel gebracht hat.WENN du auf dieser Ebene suchen willst würde ich mit beiden Compilern mit -s kompilieren und dann ein diff machen.
Das habe ich gerade mal gemacht, Unterschiede gibt es reichlich. Nur wie komme ich
zu einem Ziel?
-
was macht das fehlerhafte programm? wie weit läuft es richtig?
und lass es im debugger laufen...
-
pale dog schrieb:
was macht das fehlerhafte programm? wie weit läuft es richtig?
und lass es im debugger laufen...
Es läuft ganz normal ab. Keine Segmentation Faults und keine Auffälligkeiten
wenn ich Valgrind einsetze. Nur die Ergebnisse sind absolut falsch. In diesem
Programm geht es um Berechnungen beruhend auf der numerischen Verifikation.Bsp., es werde zwei Intervalle addiert:
[1,1]+[2,2]=[1.2,1.2]
das ist sicherlich falsch, denn [3,3] sollte rauskommen.In Assembler-Code sind einige Unterschiede zu sehen, aber wie werte ich diese
bei einem Ass.-Quellcode von 3500 Zeilen aus und das ist ein Minimal-Bsp.?
-
hast du mal diff benutzt? Vielleicht gibt die Übersicht hilfreiche Hinweise. Ansonsten kompilierst du den Code auch mit allen Warnungen (-Wall -W -pedantic -std=c99)?
-
Meinst Du ein diff auf die Assembler-Codes? Das habe ich gestern gemacht, die Unterschiede sind so zahlreich, dass so auf die Schnelle keine Aussage getroffen werden kann, woran es liegt. Das würde wahrscheinlich Tage/Wochen dauern, deshalb dachte ich eher an die Änderungen vom gcc, nur diese geben nicht wirklich viel für mich her. Wenn ich 'gcc-3.4.6 -S -c -O0' und 'gcc-4.0.0 -S -c -O0' ausführe, müsste der Assembler-Code nicht derselbe sein?
Ich probiere nochmal alles mit '-Wall -W -pedantic etc.' zu kompilieren. Mal sehen was kommt.
-
hjdt schrieb:
Wenn ich 'gcc-3.4.6 -S -c -O0' und 'gcc-4.0.0 -S -c -O0' ausführe, müsste der Assembler-Code nicht derselbe sein?
Nein.
Wie gesagt, probier es mal mit eingeschalteten Warnungen, vielleicht gibt er dir dann einen Hinweis.
-
rüdiger schrieb:
hjdt schrieb:
Wenn ich 'gcc-3.4.6 -S -c -O0' und 'gcc-4.0.0 -S -c -O0' ausführe, müsste der Assembler-Code nicht derselbe sein?
Nein.
Wie gesagt, probier es mal mit eingeschalteten Warnungen, vielleicht gibt er dir dann einen Hinweis.
Ich habe jetzt alle Warnungen eingeschaltet, aber leider kommen keine.
Puuh, so langsam habe ich keine Idee mehr. Dann muss ich mir wohl den Assembler-Code einmal genauer anschauen, nur weiß man dann immer noch nicht genau, was im C-Code geändert werden muss.
Hat vielleicht noch jemand eine andere Idee?
-
iirc hatte gcc-4.0.0 doch einige Bugs bei der Codeerzeugung - wie wäre es denn mit einer aktuelleren Version 4.0.4 oder 4.1.2 oder 4.2.1?
Ansonsten könntest du evtl auch beide Compilate parallel debuggen - bei irgendeinem EInzelschritt müssten ja Abweichungen entstehen.
-
camper schrieb:
iirc hatte gcc-4.0.0 doch einige Bugs bei der Codeerzeugung - wie wäre es denn mit einer aktuelleren Version 4.0.4 oder 4.1.2 oder 4.2.1?
Ansonsten könntest du evtl auch beide Compilate parallel debuggen - bei irgendeinem EInzelschritt müssten ja Abweichungen entstehen.Gibt es eine Möglichkeit beim gdb das Programm aublaufen zu lassen und die Einzelschritte in einem File zu protokollieren?