MDK中One ELF Section per Function選項功能探究【轉載】

本文主要探討的是MDK開發工具中One ELF Section per Function選項對於代碼優化的做用及其實現的機制。函數

這裏以EK-STM32F開發板的LCDDemo實驗例程爲例進行說明:工具

1)在MDK的Project -> Options for Target -> Target選項卡下,在Code Generation 中選中Use MicroLIB,選擇使用微庫。在User選項卡Run User Programs After Build/Rebuild中,勾選Run #1,同時在文本框中輸入命令C:/Keil/ARM/BIN31/fromelf.exe --bin -o  ./output/LCDDemo.bin ./output/開發工具

LCDDemo_MDK.axf用於生成.bin文件。測試

    2)在選項卡C/C++中選擇優化等級2,同時不選中任何的優化選項。保存,編譯連接,下載運行程序,查看output中LCDDemo.bin文件的大小爲4728Byte。優化

3)在圖3所示的界面中,將One ELF Section per Function選項選中,保存,編譯連接,下載運行程序,查看output中LCDDemo.bin文件的大小爲3700Byte。ui

能夠從以上的操做看出, 在其餘條件相同的狀況下,選項One ELF Section per Function能夠將LCDDemo最後生成的.bin文件的大小減小1028Byte,這對於存儲資源有限的嵌入式設備來講,仍是具備很大的吸引力的。.net

那麼,選項One ELF Section per Function是如何對C程序代碼進行優化呢?爲此,筆者特別設計了一個方案用於驗證選項One ELF Section per Function的優化功能。設計

首先在LCDDemo工程的main.c文件中加入以下的代碼:接口

void unuse()資源

{

int i,j = 0;

for (i=0; i<0xfffff; i++) j++;

for (j=0; j<0xfffff; j++) i++;

}

unuse()函數僅是爲了測試用而加入的一個函數,該函數爲被其餘任何的函數所調用。下面分別查看使用選項One ELF Section per Function和不使用選項One ELF Section per Function的區別。

A,              如以前的步驟2)所示操做,生成的LCDDemo.bin的大小爲7396Byte。同時,筆者採用反彙編過程進一步驗證,找到了unuse()的反彙編代碼。能夠看出,確實由於添加了unuse()這個函數,而使得最後生成的LCDDemo.bin文件的變大。.

B,              如以前的步驟3)所示操做,生成的LCDDemo.bin的大小爲3700Byte。同時,筆者採用反彙編過程進一步驗證,未找到unuse()的反彙編代碼。能夠看出,使用選項. One ELF Section per Function後,即便添加了未使用的函數unuse(),也對於最後生成的LCDDemo.bin文件沒有任何的影響。

所以,能夠得出,選項One ELF Section per Function的主要功能是對冗餘函數的優化。經過這個選項,能夠在最後生成的二進制文件中將冗餘函數排除掉(雖然其所在的文件已經參與了編譯連接),以便最大程度地優化最後生成的二進制代碼。

而該選項實現的機制是將每個函數做爲一個優化的單元,而並不是整個文件做爲參與優化的單元。

選項One ELF Section per Function所具備的這種優化功能特別重要,尤爲是在對於生成的二進制文件大小有嚴格要求的場合。人們習慣將一系列接口函數放在一個文件裏,而後將其整個包含在工程中,即便這個文件將只有一個函數被用到。這樣,最後生成的二進制文件中就有可能包含衆多的冗餘函數,形成了寶貴存儲空間的浪費。

選項One ELF Section per Function對於一個大工程的優化效果尤爲突出,有時候甚至能夠達到減半的效果。固然,對於小工程或是少有冗餘函數的工程來講,其優化效果就沒有那麼明顯了

相關文章
相關標籤/搜索