簡體   English   中英

C++ 預編譯頭文件:對於同一個源文件,兩個生成的 .gch 永遠不會相同

[英]C++ Pre-compiled Headers: Two generated .gch are never identical for the same source file

我試圖理解如果源文件沒有更改,為什么系統頭文件的預編譯頭對象在兩次編譯器調用之間永遠不會相同。

我可以通過這個非常簡單的測試來展示這種行為:

$ cat pch.hpp
#include <string.h>

$ g++ pch.hpp -o pch1.hpp.gch && g++ pch.hpp -o pch2.hpp.gch
$ cksum pch1.hpp.gch pch2.hpp.gch
285552444 3408816 pch1.hpp.gch
612212458 3408816 pch2.hpp.gch

我可以在 Windows 7(帶有 MSYS2 的 GCC 5.3.0)、Mac OS X(來自 Homebrew 的 GCC 6.1.0)和 Arch Linux(GCC 6.1.1)中復制這個。

查看依賴項,我找不到任何可以在兩次連續編譯之間更改輸出的預定義宏

比較生成的文件,一些字節序列是亂序的(在圖像中,字符串“pch.hpp”出現在左側文件的后面)並且一些單個字節不同,即使文件大小相同。

十六進制轉儲比較

那么 gcc 真的不能保證每次都生成相同的 PCH 還是我遺漏了什么?

差異是由 ASLR 引起的。 禁用它會導致可重現的 gchs:

# setarch $(uname -m) -R /usr/bin/c++ -x c++-header -include test.hxx -o test.hxx.gch -c test.hxx.cxx && md5sum test.hxx.gch
54486c6ffc08db87d4b58792dcb46091  test.hxx.gch
# setarch $(uname -m) -R /usr/bin/c++ -x c++-header -include test.hxx -o test.hxx.gch -c test.hxx.cxx && md5sum test.hxx.gch
54486c6ffc08db87d4b58792dcb46091  test.hxx.gch

但是,ASLR 通常是一件好事,禁用它並不是真正的解決方案。 這也在此處討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM