2014-06-10 14 views
5

Dopo una lunga sequenza di debug, ho ridotto il mio problema a un unico file. E il problema è che il file viene compilato in modo diverso in due diverse directory, quando tutto il resto è lo stesso.In che modo la compilazione dello stesso codice sorgente genera file oggetto diversi?

Sto utilizzando il compilatore gcc di CodeSourcery (gcc versione 4.3.3, Sourcery G ++ Lite 2009q1-161) per compilare un file semplice. Lo stavo usando in un modulo senza problemi e poi l'ho copiato su un altro modulo per usarlo. Quando si compila, il file oggetto è significativamente diverso. La riga di comando per compilare i due file è identica (ho usato la cronologia di linux per essere sicuro), e i 3 file includono anche copie identiche (controllate con diff).

Ho fatto un confronto binario sui due file oggetto e hanno un sacco di differenze di singoli byte sparsi in giro. Ho fatto un objdump -D di entrambi e li ho confrontati e ci sono molte differenze. Ecco dump1, dump2 e diff. La riga di comando è " arm-none-eabi-gcc --std = gnu99 -Wall -O3 -g3 -ggdb -Wextra -Wno-unused -c crc.c -o crc.o".

Com'è possibile? Ho anche compilato con -S al posto di -c e guardato l'output dell'assembler e questo è identico tranne che per il percorso della directory. Quindi, come può il file oggetto essere diverso?

Il mio vero problema è che quando provo a collegare il file oggetto per dump2 al mio programma, ottengo errori di riferimento non definiti, quindi qualcosa nell'oggetto è sbagliato, mentre l'oggetto per dump1 non riceve tali errori e collegamenti fini.

+0

Apparentemente c'è un tag [tag: riproducibilità binaria] per questo. Ho visto la stessa cosa con questo compilatore. La maggior parte di * diff * mostra diverse selezioni di registro o offset di file, ma ha le stesse funzionalità di base. Vedi: [Debian riproducible builds] (https://wiki.debian.org/ReproducibleBuilds). Naturalmente è possibile che l'output sia diverso. È il tuo problema? Penso che il tuo problema sia qualcos'altro. –

+0

Inoltre: [SO binario che cambia in ogni build] (http://stackoverflow.com/questions/4140329/binary-object-file-changing-in-each-build), ecc. –

+0

Si potrebbe provare a compilare con '-O0 'per vedere se le differenze persistono. – markgz

risposta

0

Molto probabilmente il file preleva diversi file di inclusione. Questa è la ragione più probabile.

Verificare che i percorsi di inclusione siano esattamente gli stessi, percorsi nelle istruzioni di inclusione. Possono indicare directory diverse. C e C++ ha una funzione che quando si tenta di caricare abcd.h dalla directory del file chiamante. Controllare questo.

1

Per il software su larga scala, ci sono molte implementazioni che eseguono l'hashing sui puntatori. Questo è uno dei motivi principali che causano la randomizzazione dei risultati. Di solito, se la logica del programma è corretta, l'ordine di alcune strutture di dati interne potrebbe essere diverso, il che non è dannoso nella maggior parte dei casi.

E inoltre, non si confronta l'uscita 'objdump -D', dal momento che il la compilazione del codice da directory diversa, la tabella di stringhe, tabella dei simboli, NANO o eh_frame dovrebbe essere diverso. Avrai sicuramente molte linee di diffusione.

L'unico paragone che ha senso è confrontare l'output di 'objdump -d' che si occupa solo della sezione di testo. Se la sezione di testo è la stessa (simile), può essere considerata identica.