_attribute__改变段的特性,即section选项

定义:
gcc通过选项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),将不同的输入段重新组合到不同的输出段中,即使是段的名字,输入段和输出段可以完全不同。

需要着重注意的是,_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反之 。

你可能感兴趣的:(编译原理)