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.
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. –
Auch: [SO binäre Änderung in jedem Build] (http://stackoverflow.com/questions/4140329/binary-object-file-changing-in-each-build), etc. –
Sie könnten versuchen, mit '-O0 kompilieren 'um zu sehen, ob die Unterschiede bestehen bleiben. – markgz