經過很長時間的調試,我將問題縮小到一個文件。問題在於,當其他所有內容相同時,文件在兩個不同的目錄中編譯方式不同。如何編譯相同的源代碼生成不同的目標文件?
我正在使用CodeSourcery的arm gcc編譯器(gcc版本4.3.3,Sourcery G ++ Lite 2009q1-161)編譯一個簡單的文件。我在一個沒有問題的模塊中使用它,然後將其複製到另一個模塊以在那裏使用。編譯時,目標文件顯着不同。編譯這兩個文件的命令行是相同的(我使用linux歷史記錄來確保),並且這3個包含文件也是相同的副本(使用diff進行檢查)。
我做了兩個對象文件的二進制比較,他們有很多散落在周圍的單個字節差異。我做了一個objdump -D,並對它們進行了比較,並且有很多不同之處。這裏是dump1,dump2和diff。命令行是「 arm-none-eabi-gcc -std = gnu99 -Wall -O3 -g3 -ggdb -Wextra -Wno-unused -c crc.c -o crc.o」。
這怎麼可能?我也使用-S編譯而不是-c編譯器,並查看彙編器輸出,除了目錄路徑外,它們是相同的。那麼目標文件如何可以不同?
我真正的問題是,當我嘗試將dump2的目標文件鏈接到我的程序中時,我得到未定義的引用錯誤,所以對象中的某些內容是錯誤的,而dump1的對象沒有這種錯誤並且鏈接正常。
顯然這裏有一個標籤[tag:binary-reproducibility]。我已經看到了這個編譯器的同樣的東西。 * diff *的大部分顯示不同的寄存器選擇或文件偏移,但它具有相同的基本功能。請參閱:[Debian reproducible builds](https://wiki.debian.org/ReproducibleBuilds)。當然,輸出可能不同。這是你的問題嗎?我認爲你的問題是別的。 –
另外:[SO二進制改變在每個生成](http://stackoverflow.com/questions/4140329/binary-object-file-changing-in-each-build)等 –
你可以嘗試編譯與'-O0 '看看差異是否持續。 – markgz