2014-06-10 3 views
5

Nach einer langen Sequenz von Debugging habe ich mein Problem auf eine Datei eingegrenzt. Und das Problem ist, dass die Datei in zwei verschiedenen Verzeichnissen anders kompiliert, wenn alles andere gleich ist.Wie kann das Kompilieren desselben Quellcodes unterschiedliche Objektdateien generieren?

Ich benutze CodeSourcery Arm gcc Compiler (GCC-Version 4.3.3, Sourcery G ++ Lite 2009q1-161), um eine einfache Datei zu kompilieren. Ich benutzte es in einem Modul ohne Probleme und dann kopierte ich es in ein anderes Modul, um es dort zu verwenden. Beim Kompilieren unterscheidet sich die Objektdatei erheblich. Die Befehlszeile zum Kompilieren der beiden Dateien ist identisch (ich habe den Linux-Verlauf verwendet, um sicher zu gehen), und die 3 Include-Dateien sind auch identische Kopien (mit Diff geprüft).

Ich habe einen binären Vergleich auf den zwei Objektdateien und sie haben eine Menge von einzelnen Byte Unterschiede verstreut. Ich habe ein Objdump -D von beiden gemacht und verglichen und es gibt viele Unterschiede. Hier ist dump1, dump2, und die diff. Die Befehlszeile lautet " arm-none-eabi-gcc -std = gnu99 -Wall -O3 -g3 -ggdb -Wextra -Wno-unused -c crc.c -o crc.o".

Wie ist das möglich? Ich habe auch mit -S anstelle von -c kompiliert und habe die Assembler-Ausgabe betrachtet, und das ist bis auf den Verzeichnispfad identisch. Also, wie kann die Objektdatei anders sein?

Mein echtes Problem ist, dass, wenn ich versuche, die Objektdatei für dump2 in meinem Programm zu verknüpfen, bekomme ich undefined Referenzfehler, so dass etwas im Objekt falsch ist, während das Objekt für dump1 keine solche Fehler und Links erhält.

+0

Anscheinend gibt es dafür ein Tag [Tag: Binär-Reproduzierbarkeit]. Ich habe das Gleiche mit diesem Compiler gesehen. Die Mehrheit des * diff * zeigt unterschiedliche Registerauswahl oder Dateioffsets, aber es hat die gleiche Grundfunktionalität. Siehe: [Reproduzierbare Debian-Builds] (https://wiki.debian.org/ReproducibleBuilds). Natürlich ist es möglich, dass die Ausgabe unterschiedlich ist. Ist es dein Problem? Ich denke, dass dein Problem etwas anderes ist. –

+0

Auch: [SO binäre Änderung in jedem Build] (http://stackoverflow.com/questions/4140329/binary-object-file-changing-in-each-build), etc. –

+0

Sie könnten versuchen, mit '-O0 kompilieren 'um zu sehen, ob die Unterschiede bestehen bleiben. – markgz

Antwort

0

Wahrscheinlich wird Ihre Datei verschiedene Include-Dateien aufnehmen. Dies ist der wahrscheinlichste Grund.

Überprüfen Sie, ob Ihre Include-Pfade genau dieselben Pfade in den include-Anweisungen sind. Sie können auf verschiedene Verzeichnisse verweisen. C und C++ hat eine Funktion, die versucht, #include abcd.habcd.h aus dem Verzeichnis der aufrufenden Datei zu laden. Überprüfen Sie dies.

1

Für große Software, gibt es viele Implementierungen tun Hashing auf Zeigern. Dies ist einer der Hauptgründe für die Randomisierung von Ergebnissen. Wenn die Programmlogik korrekt ist, kann die Reihenfolge einiger interner Datenstrukturen unterschiedlich sein, was in den meisten Fällen nicht schädlich ist.

Und auch, vergleichen Sie nicht die 'objdump -D' Ausgabe, da Sie den Code aus einem anderen Verzeichnis kompilieren, die Zeichenfolge Tabelle, Symboltabelle, DWARF oder eh_frame sollte anders sein. Sie werden sicherlich viele Diff-Linien bekommen.

Der einzige Vergleich, der sinnvoll ist, ist der Vergleich der Ausgabe von 'objdump -d', die nur für den Textabschnitt sorgt. Wenn der Textabschnitt gleich (ähnlich) ist, kann er als identisch betrachtet werden.

Verwandte Themen