KEIL之attribute描述符

轉自:https://blog.csdn.net/eleanoryss/article/details/71750910

KEIL之attribute描述符

_attribute__改變段的特性,即section選項

定義:
gcc通過選項attribute可以改變所聲明或定義的函數、數據的特性。它有很多子項,用於改變作用對象的特性。比如對函數,noline將禁止進行內聯擴展、noreturn表示沒有返回值、pure表明函數除返回值外,不會通過其它(如全局變量、指針)對函數外部產生任何影響。但這裏我們比較感興趣的是對代碼段起作用子項section。

attribute的section子項的使用格式爲:

__attribute__((section("section_name")))
  • 1

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

輸入段和輸出段

輸入段和輸出段是相對於要生成最終的elf或binary時的Link過程說的。

Link過程的輸入大都是由源代碼編繹生成的目標文件.o,那麼這些.o 文件中包含的段相對link過程來說就是輸入段,而Link的輸出一般是可執行文件elf或庫等,這些輸出文件中也包含有段,這些輸出文件中的段就叫做輸出段。輸入段和輸出段本來沒有什麼必然的聯繫,是互相獨立。只是在Link過程中,Link程序會根據一定的規則(這些規則其實來源於Link Script),將不同的輸入段重新組合到不同的輸出段中,即使是段的名字,輸入段和輸出段可以完全不同。

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

轉自:http://blog.csdn.net/yuweixian/article/details/5623524
從etherboot代碼中發現有一個attribute的使用,#define pci_driver __attribute ((used,section(“.drivers.pci”)))
/* Defined by the linker… */
extern const struct pci_driver pci_drivers[];
extern const struct pci_driver pci_drivers_end[];

這部分代碼是etherboot搜索相應網卡驅動用到的。

for(driver = pci_drivers; driver < pci_drivers_end; driver++) {

/scan driver/

}

section是把相應的結構放到指定的段.drivers.pci 中

在 src/arch/i386/core/etherboot.lds中有下面描述

SECTIONS {

……
.drivers.pci : {
pci_drivers = . ;
*(.drivers.pci);
pci_drivers_end = . ;
}

……

}

說明所有的驅動都放在pci_drivers 和pci_drivers_end兩個地址之間,這樣可以通過上面的for循環一次查找相應的驅動程序。

unused

屬性 unused 用於函數和變量,表示該函數或變量可能不使用,這個屬性可以避免
編譯器產生警告信 息。used反之 。

 

 

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