2013-03-06 49 views
3

我想知道如果我得到完全相同的二進制結果,如果我與編譯:將具有相同的源,編譯器和庫版本結果編制完全相同的二進制

  1. 相同的源代碼
  2. 相同的編譯器,版本,指揮
  3. 相同的庫

還是有也可能導致不同的二進制文件像其他限制:

  • 當源編譯
  • 系統時間,內核版本
  • 其他的構建工具

謝謝!

+2

編號您的編譯器可能會在文件中寫入時間/日期標記。它也可能通過使用基於隨機化的優化來產生代碼生成的不同結果。可以構建一個確定性的編譯器;只是不要指望你必須那樣。 – 2013-03-06 06:32:00

回答

1

無法保證僅通過修復代碼,庫和編譯器即可獲得相同的輸出。正如你已經確定,在編譯器運行環境可能產生影響:

  • 這不只是一個編譯器,但你必須保持靜態(接頭,裝配等)的整體工具鏈。
  • 工具鏈是否使用可能隨時間而更新的動態庫?
  • 環境變量呢?
  • 你是以同一用戶身份運行嗎?具有相同的特權。

即使您可以找到並控制所有這些功能,編譯也可能不是確定性的。下面是來自GCC 3.3 documentation一個具體的例子(注意措辭最新版本已經改變):

-fno猜測分支概率

使用隨機模型不要猜測分支概率。 有時,gcc會選擇使用隨機模型來猜測分支概率,當分析反饋(-fprofile-arcs)或__builtin_expect中沒有可用的分支概率時。這意味着同一程序中不同的編譯器運行可能產生不同的目標代碼。

在硬實時系統中,人們不希望編譯器的不同運行產生具有不同行爲的代碼;最小化非決定論是最重要的。這個開關允許用戶減少非確定性,可能以犧牲較差的優化爲代價。

相關問題