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))

属性リストは、コンマで区切られた一連の属性の場合があります。
属性は、関数属性、変数属性、タイプ属性などを設定できます。

2.関数属性

  • 返品不可、
  • インライン、
  • always_inline、
  • ピュア、
  • const、
  • フォーマット、
  • format_arg、
  • no_instrument_function、
  • セクション、
  • コンストラクタ、
  • デストラクタ、
  • 中古、
  • 未使用、
  • 非推奨、
  • 弱い、
  • malloc、
  • エイリアス。

3.変数属性

  • 整列、
  • モード、
  • 珍しい、
  • パック、
  • セクション、
  • 透過性ユニオン、
  • 未使用、
  • 非推奨、
  • vector_size、
  • 弱い

4.タイプ属性

  • 整列、
  • パック、
  • 透過性ユニオン、
  • 未使用、
  • 非推奨

5.共通属性1 ----セクション

通常、コンパイラはコンパイルされたターゲットを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属性を持つ関数funcが使用され、ユーザーコードではこの属性を持つ関数は使用されないため、2つの関数に同じ名前を付けることができます。1つは弱いシンボルで、もう1つは強いシンボルです。 。強いシンボル関数本体がない場合は弱いシンボル関数を使用します。強いシンボルがある場合は強いシンボルを使用する関数が定義されていない場合、エラーが報告されます。これは互換性のために使用できます。

__weak void green_led_on(void) {}

7.共通属性2 ----整列、パック

変数または構造体の最小配置をバイト単位で設定します。
形式は次のとおりです。

__attribute__ ((aligned (n)))

コンパイラに整列するバイト数を決定させることもできます。
形式は次のとおりです。

 __attribute__ ((aligned))

一般に、aligned属性を設定すると、占有スペースが大きくなり、変数の後の構造体が占有するスペースを最小化するためにpackedされます。

調整の原則:

charオフセットは1の倍数であるsizeof(char)である必要があり、
shortは任意のアドレスに格納できます。オフセットは2の倍数であるsizeof(short)である必要があり、0、2からのみ可能です。 、4 ...および2の倍数であるその他のアドレス
intの格納を開始します。オフセットは、4の倍数であるsizeof(int)である必要があります。0などの4の倍数であるアドレスにのみ格納できます。 、
4、8 ...など。オフセットはsizeof(float)である必要があり、これは4の倍数です。Doubleは、0、4、8などの4の倍数のアドレスから格納
できます。オフセットはsizeof(double)である必要があり、これは8の倍数であり、0、8、16などのアドレスからのみ格納できます。

          struct foo
          {
            char a;
            int x[2] __attribute__ ((packed));
          };

xドメインはドメインの直後に続きます。(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構文
  2. https://www.jianshu.com/p/29eb7b5c8b2d属性の概要)
  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())

おすすめ

転載: blog.csdn.net/amwha/article/details/86703132