0、引
看到这一个宏定义,想着u-boot.lds里的段的使用,觉得应该把__attribute__好好总结一下。
#define ll_entry_declare(_type, _name, _list) \
_type _u_boot_list_2_##_list##_2_##_name __aligne d(4) \
__attribute__((unused, \
section(".u_boot_list_2_"#_list"_2_"#_name)))
1、基本格式
__attribute__ ((attribute-list))
attribute-list 也许是一个以逗号为分隔的一系列的属性。
attribute可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute)等.
2、 函数属性( Function Attributes)
- noreturn,
- noinline,
- always_inline,
- pure,
- const,
- format,
- format_arg,
- no_instrument_function,
- section,
- constructor,
- destructor,
- used,
- unused,
- deprecated,
- weak,
- malloc,
- alias.
3、变量属性 ( Variable Attributes)
- aligned,
- mode,
- nocommon,
- packed,
- section,
- transparent_union,
- unused,
- deprecated,
- vector_size,
- weak
4、类型属性(Type Attributes)
- aligned,
- packed,
- transparent_union,
- unused,
- deprecated
5、常用属性1---- section
通常,编译器把编译出的目标放在像 data和bss这样的段内,有时需要把它放到特定的段内(见lds文件)。
/sections.c
char __bss_start[0] __attribute__((section(".__bss_start")));
。。。
char __image_copy_end[0] __attribute__((section(".__image_copy_end")));
char __rel_dyn_start[0] __attribute__((section(".__rel_dyn_start")));
。。。
char _end[0] __attribute__((section(".__end")));
6、常用属性2---- weak
这个主要用于库函数的定义可以在用户的代码中被覆盖。库函数里使用weak属性的函数func,用户代码里不使用这个属性的func,这样两个函数名可以同名,一个是弱符号,一个是强符号,没有强符号函数体的时候使用弱符号的函数,有强符号时使用强符号的函数,都没有定义时,报错。这样可用于兼容。
__weak void green_led_on(void) {}
7、常用属性2---- aligned,packed
给变量或者结构体设置最小的对齐 ,以字节记。
格式如下:
__attribute__ ((aligned (n)))
也可以让编译器自己去决定对齐的字节数,(往大的定)
格式如下:
__attribute__ ((aligned))
一般设置 aligned属性后,占用的空间是往大的方向,而packed是把变量后结构体的空间占用算最小的。
对齐原则:
char 偏移量必须为sizeof(char) 即1的倍数,可以任意地址开始存储
short 偏移量必须为sizeof(short) 即2的倍数,只能从0,2,4…等2的倍数的地址开始存储
int 偏移量必须为sizeof(int) 即4的倍数,只能从0,4,8…等4的倍数的地址开始存储
float 偏移量必须为sizeof(float) 即4的倍数,只能从0,4,8…等4的倍数的地址开始存储
double 偏移量必须为sizeof(double)即8的倍数,只能从0,8,16…等地址开始存储
struct foo
{
char a;
int x[2] __attribute__ ((packed));
};
x域会紧跟着a域。 (不同平台sizeof不一样大)
struct foo0
{
char a[2];
short b;
int x[2];
} ;
struct foo1
{
char a[3];
short b;
int x[2];
}__attribute__ ((aligned(16))) ;
struct foo2
{
char a[3];
short b __attribute__ ((aligned(8)));
int x[2] __attribute__ ((packed));
};
struct foo3
{
char a[3];
short b __attribute__ ((aligned(8)));
int x[2];
};
struct foo4
{
char a[3];
short b ;
};
qDebug()<<sizeof(int);
qDebug()<<sizeof(foo0);
qDebug()<<sizeof(foo1);
qDebug()<<sizeof(foo2);
qDebug()<<sizeof(foo3);
qDebug()<<sizeof(foo4);
4
12
16
24
24
6