¿Por qué dos binarios de programas con solo comentarios cambiados no coinciden exactamente en gcc?

 C Programming >> Programación C >  >> Tags >> GCC
¿Por qué dos binarios de programas con solo comentarios cambiados no coinciden exactamente en gcc?


Creé dos programas en C



  1. Programa 1


    int main()
    {
    }

  2. Programa 2


    int main()
    {
    //Some Harmless comments
    }


AFAIK, al compilar, el compilador (gcc) debe ignorar los comentarios y los espacios en blanco redundantes y, por lo tanto, el resultado debe ser similar.


Pero cuando revisé los md5sums de los binarios de salida, no coinciden. También intenté compilar con optimización -O3 y -Ofast pero aún así no coincidían.


¿Qué está pasando aquí?


EDITAR:
los comandos exactos y md5sums son (t1.c es el programa 1 y t2.c es el programa 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

Y sí, md5sums coincide en varias compilaciones con las mismas marcas.


Por cierto, mi sistema es gcc (GCC) 5.2.0 y Linux 4.2.0-1-MANJARO #1 SMP PREEMPT x86_64 GNU/Linux


Respuestas:


Es porque los nombres de los archivos son diferentes (aunque la salida de las cadenas es la misma). Si intenta modificar el archivo en sí (en lugar de tener dos archivos), notará que los binarios de salida ya no son diferentes. Como Jens y yo dijimos, es porque GCC vuelca una gran cantidad de metadatos en los archivos binarios que crea, incluido el nombre de archivo de origen exacto (y AFAICS también lo hace).


Prueba esto:


$ 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

Esto explica por qué sus md5sums no cambian entre compilaciones, pero son diferentes entre diferentes archivos. Si quieres, puedes hacer lo que sugirió Jens y comparar el resultado de strings para cada binario, notará que los nombres de archivo están incrustados en el binario. Si desea "arreglar" esto, puede strip los binarios y los metadatos serán eliminados:


$ 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