u-boot 之 __attribute__

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

参考

  1. https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Attribute-Syntax.html#Attribute Syntax
  2. https://www.jianshu.com/p/29eb7b5c8b2d (attribute 总结)
  3. https://blog.csdn.net/mrpre/article/details/23097869
  4. https://www.jianshu.com/p/f69652c7df99
  5. https://www.cnblogs.com/xyelectric/p/9046048.html (at())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值