Warum stimmen zwei Binärdateien von Programmen mit nur geänderten Kommentaren nicht genau in gcc überein?

 C Programming >> C-Programmierung >  >> Tags >> GCC
Warum stimmen zwei Binärdateien von Programmen mit nur geänderten Kommentaren nicht genau in gcc überein?


Ich habe zwei C-Programme erstellt



  1. Programm 1


    int main()
    {
    }

  2. Programm 2


    int main()
    {
    //Some Harmless comments
    }


AFAIK, beim Kompilieren sollte der Compiler (gcc) die Kommentare und redundanten Whitespaces ignorieren, und daher muss die Ausgabe ähnlich sein.


Aber als ich die MD5-Summen der Ausgabebinärdateien überprüft habe, stimmen sie nicht überein. Ich habe auch versucht, mit der Optimierung -O3 zu kompilieren und -Ofast aber sie stimmten immer noch nicht überein.


Was passiert hier?


EDIT:
die genauen Befehle und dort md5sums sind (t1.c ist Programm 1 und t2.c ist Programm 2)


gcc ./t1.c -o aaa
gcc ./t2.c -o bbb
98c1a86e593fd0181383662e68bac22f aaa
c10293cbe6031b13dc6244d01b4d2793 bbb
gcc ./t2.c -Ofast -o bbb
gcc ./t1.c -Ofast -o aaa
2f65a6d5bc9bf1351bdd6919a766fa10 aaa
c0bee139c47183ce62e10c3dbc13c614 bbb
gcc ./t1.c -O3 -o aaa
gcc ./t2.c -O3 -o bbb
564a39d982710b0070bb9349bfc0e2cd aaa
ad89b15e73b26e32026fd0f1dc152cd2 bbb

Und ja, md5sums stimmen über mehrere Kompilationen mit denselben Flags überein.


Übrigens ist mein System gcc (GCC) 5.2.0 und Linux 4.2.0-1-MANJARO #1 SMP PREEMPT x86_64 GNU/Linux


Antworten:


Das liegt daran, dass die Dateinamen unterschiedlich sind (obwohl die Ausgabe der Zeichenfolgen dieselbe ist). Wenn Sie versuchen, die Datei selbst zu ändern (anstatt zwei Dateien zu haben), werden Sie feststellen, dass die ausgegebenen Binärdateien nicht mehr unterschiedlich sind. Wie sowohl Jens als auch ich gesagt haben, liegt es daran, dass GCC eine ganze Menge Metadaten in die von ihm erstellten Binärdateien ausgibt, einschließlich des genauen Quelldateinamens (und AFAICS tut das auch).


Versuchen Sie Folgendes:


$ cp code.c code2.c subdir/code.c
$ gcc code.c -o a
$ gcc code2.c -o b
$ gcc subdir/code.c -o a2
$ diff a b
Binary files a and b differ
$ diff a2 b
Binary files a2 and b differ
$ diff -s a a2
Files a and a2 are identical

Dies erklärt, warum sich Ihre MD5-Summen zwischen Builds nicht ändern, aber zwischen verschiedenen Dateien unterschiedlich sind. Wenn Sie möchten, können Sie tun, was Jens vorgeschlagen hat, und die Ausgabe von strings vergleichen Für jede Binärdatei werden Sie feststellen, dass die Dateinamen in die Binärdatei eingebettet sind. Wenn Sie dies "reparieren" möchten, können Sie strip die Binärdateien und die Metadaten werden entfernt:


$ strip a a2 b
$ diff -s a b
Files a and b are identical
$ diff -s a2 b
Files a2 and b are identical
$ diff -s a a2
Files a and a2 are identical