[隨筆]gcc的__attribute__編譯屬性

注:此文非原創,是博主在學習過程中網絡摘抄整理而出。

__attribute__主要用於 改變所聲明或定義的函數或數據的特性,它有很多子項,用於改變作用對象的特性。

比如,對函數,noline將禁止進行內聯擴展、noreturn表示沒有返回值、pure表明函數除返回值外,不會通過其它(如全局變量、指針)對函數外部產生任何影響。

這裏我們聊聊對代碼段起作用的子項section。
__attribute__的section子項的使用格式爲:

__attribute__((section("section_name"))) 

其作用是 將作用的函數或數據放入指定名爲”section_name”輸入段。

這裏還要注意一下兩個概念:輸入段和輸出段

輸入段和輸出段是相對於要生成最終的elf或binary時的Link過程說的,Link過程的輸入大都是由源代碼編繹生成的目標文件.o,那麼這些.o文件中包含的段相對link過程來說就是輸入段。

而,Link的輸出一般是可執行文件elf或庫等,這些輸出文件中也包含有段,這些輸出文件中的段就叫做輸出段。

輸入段和輸出段本來沒有什麼必然的聯繫,是互相獨立,只是在Link過程中,Link程序會根據一定的規則(這些規則其實來源於Link Script),將不同的輸入段重新組合到不同的輸出段中,即使是段的名字,輸入段和輸出段可以完全不同。

其用法舉例如下:

int var __attribute__((section(".xdata"))) = 0; 

這樣定義的變量var將被放入名爲.xdata的輸入段。

再如:

static int __attribute__((section(".xinit"))) functionA(void) 
{ 
    ..... 
} 

這個例子將使函數functionA被放入名叫.xinit的輸入段。

需要特別注意的是,__attribute__的section屬性只指定對象的輸入段,它並不能影響所指定對象最終會放在可執行文件的什麼段。

下面是目前支持的變量屬性:
• address (addr)
• aligned (alignment)
• boot
• deprecated
• fillupper
• far
• mode (mode)
• near
• noload
• packed
• persistent
• reverse (alignment)
• section (“section-name”)
• secure
• sfr (address)
• space (space)
• transparent_union
• unordered
• unused
• weak

另外,
1. 也可以通過在關鍵字前後使用 __(雙下劃線)來指定屬性(例如,用
__aligned__代替aligned)。這樣將使你在頭文件中使用它們時不必考慮會出現與
宏同名的情況。
2. 要指定多個屬性,可在雙括弧內用逗號將屬性分隔開,例如:

__attribute__((aligned (16), packed))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章