我使用GCC 4.2.4版與優化二元變化。下面解釋的問題不能在Gcc 4.6.x上覆制,這是我測試的唯一兩個版本。枚舉導致的gcc 4.2.4
我具有定義枚舉, 頭的頭文件:abc.h
enum test
{
VALUE_1 = 1,
VALUE_2 = 2,
VALUE_MAX = 0xFFFF,
};
此報頭被包括在幾個源文件和每個源文件創建在編譯時的目標(.o)。並且有幾個源文件不引用任何abc.h中的枚舉。
我看到的問題是,如果我在abc.h中添加一個新常量(VALUE_3),那麼不使用任何枚舉的對象的二進制md5sum也會得到更改。這隻發生在我應用優化而不是在編譯時。
我懷疑它有事情做與獲取與優化啓用標誌-ftree-VRP和-ftree-支配-OPTS。在-fno中使用這些標誌仍然會導致一些對象發生變化,但是可以防止其他幾個變化(這些標誌會發生變化)。
另一個有趣的obsevation是md5sum也出來是同爲偶數或奇數枚舉。
誰能請幫助我瞭解什麼在後端是怎麼回事,是有什麼辦法可以避免二元變化來維持的md5sum當有針對特定對象沒有實際上的代碼改變。
在此先感謝。
被修改:
對於一個對象,以下是diff。對於其他對象,其他更改也很少(在mov等指令中)。正如你所看到的,只有某些指令中的操作數寄存器被交換了。我想了解原因以及如何通過優化來避免它。
# diff test.o.1 test.o.2
1548,1549c1548,1549
< cmpl %eax, %ecx
< jg .L442
---
> cmpl %ecx, %eax
> jl .L442
簡單地指出MD5哈希的變化是不夠的。如果你關心這個級別,你應該使用'objdump -d'和朋友來確定* .o文件中*實際*改變了什麼。 –
感謝喬納森。問題描述已被編輯。 – Akamai
已編輯的問題描述。 – Akamai