簡體   English   中英

在相同的 docker 中運行構建(gcc、make、cmake),來自相同的源會給出具有不同哈希值的二進制文件

[英]Running builds (gcc, make, cmake) inside identical docker, from same source gives binaries with different hashes

我遇到了“有趣”的問題。 我正在為我們的 Bamboo 項目進行構建自動化。 我很確定我已經完成了,然后有人問:為什么周五晚上和周六晚上的構建(沒有代碼更改)不同? 我有 2 個遠程構建器。 兩者都安裝了相同的操作系統(Ubuntu)並同時更新到最新版本。 兩者都安裝了相同的庫。 編譯在 docker 內(從同一來源導入的圖像)所以我開始研究這個並達到了可以觀察以下內容的地步:

  • 在同一台機器上從同一源運行編譯兩次,為每個編譯啟動新的 docker 會產生相同的(根據 sha1sum)二進制文件。
  • 在兩台不同的機器上從相同的源代碼運行兩次編譯,產生不同的二進制文件。 源在同名文件夾中,它也安裝在同名路徑上的 docker 中。
  • 在具有某些硬件規范的 1 台 PC 上運行編譯,然后取出磁盤並將其連接到不同的 PC(具有不同的硬件規范)並再次從同一源運行編譯。 生成的二進制文件是相同的。

代碼是否可能以某種方式依賴於確切的操作系統映像? 或任何其他操作系統屬性? 還有什么想法嗎?

有追鬼的感覺……

編輯:在逐步嘗試 go 之后,我將其縮小到 cmake。 這意味着:在兩台不同機器上制造的 cmake 不同(現在開始 1-by-1 差異)。 如果我把幾台機器的 cmake 的結果並從那里用 make 編譯,我總是得到相同的二進制文件。 所以我認為問題在於編寫 cmakefile 的方式而不是編譯本身。

EDIT2:我現在知道這是 Qt 5.2.1 rcc 是非確定性問題。 在 cmake 期間運行 rcc 並計算一些哈希值。 這些哈希的差異是導致整個事情不確定的原因。 如果我執行 cmake 並將其內容帶到 3 台不同的機器上並運行編譯(make),我得到 100% 相同的結果(根據 sha1sum)。 我認為這就解決了。 現在我需要說服項目升級到更新版本的 Qt,我知道如何使 rcc 確定性,或者我需要找到如何在 5.2.1 中使 rcc 確定性。

如果您從相同的操作系統映像開始,那么您的測試表明映像后配置步驟引入了更改。 查看該配置。 一個簡單的例子是主機名。 我會區分任何中間構建工件,例如 config.h 或任何 cmake 寫入其 output。 嘗試在兩個二進制文件(不同的)上運行字符串,然后比較 output 看看你是否學到了一些東西。

https://tests.reproducible-builds.org/debian/index_issues.html也可能很有啟發性。

結果可能是巧合。 鏈接要求將所有需要的函數 go 放入可執行文件中,但順序一般不受限制。 這很可能取決於 object 文件出現在磁盤上的順序。

暫無
暫無

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

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