2017-08-11 145 views
1

我正在編譯一個基於Cortex-M4的微控制器的可執行文件arm-none-eabi-gcc。非性能關鍵代碼與-Os(針對可執行代碼大小進行了優化)以及具有另一個優化標誌的性能關鍵部分進行編譯,例如。 -Og/-O2如何在不同優化的目標文件中使用GCC LTO?

在這樣的構建中使用-flto安全嗎?如果是這樣,哪個最優化標誌應該傳遞給鏈接器?

回答

1

按照GCC documentation關於優化選項:

建議您編譯所有的文件,參與同一鏈路使用相同的選項

這種說法是相當模糊的。然而,挖入release notes of GCC 5時,有一些額外的細節:

命令行優化和目標選項現在流在每個功能的基礎,並通過鏈接時優化榮幸。此更改使鏈接時間優化成爲每個文件優化更加透明的替代方案。現在可以構建不同翻譯單元需要不同優化設置的項目(例如-ffast-math,-mavx或-finline)。哪些標誌受到這些限制的影響,這

而且也是信息不:

注意,這僅適用於可通過優化和目標屬性的命令行選項。影響全局代碼生成的命令行選項(如-fpic),警告(如-Wodr),影響靜態變量優化方式的優化(如-fcommon),調試輸出(如-g)和 - 參數參數只能應用於整個鏈接時間優化單元。在這些情況下,建議在編譯時和鏈接時均始終使用相同的選項。

在你的情況下,優化標誌-Og-O2-Os可以作爲優化的屬性被傳遞,並且不落入情況下,編譯時和鏈接時的標誌應該是相同的。所以是的,在這樣的構建中使用-flto應該是安全的。

關於在鏈接時通過的優化標誌,如發行說明中指出:

相反,早期的GCC版本中,鏈接命令行上傳遞的優化和目標選項 被忽略。

GCC自動確定使用哪個優化級別,這是編譯目標文件時使用的最高級別。因此,您無需將您的任何-O優化選項傳遞給鏈接器。

+0

哇,這太好了,謝謝你找到它並在這裏發帖。這是否也適用於GCC 6和7? – Venemo

+0

@Venemo我沒有看到任何在GCC 6和7更新日誌或其他相關文檔中提到的這種行爲。所以它可能也適用於新版本的GCC。 – Pyves

+1

謝謝!我已經接受了你的答案! – Venemo