C 语言中的__attributes__

__attributes__()是 GNU C 支持的一个机制,因此使用该机制需要确保 GNU C 标准适用于你的编译器,__attributes__()可放置在函数、变量或类型的声明前,从而使得编译器对该内容进行某些特殊处理。

例如:在 Function 前使用

constructor destructor

使用 constructor(构造)会使该方法在运行 main() 方法前被自动调用,相同的 destructor 会使该方法在 main() 方法运行后或者 exit() 方法运行之后被自动调用(注:atexit() 方法也可做到 main 执行后调用)。

linux 运行 elf 程序链接、启动过程如下图:

调试 QEMU 中对应部分程序:

实际上,使用 constructor 属性,使得该函数在__libc_csu_init()中被调用,在 main 方法被调用之前,由此可看出__attributes__机制可以影响编译器,是一个编译器相关的特性,需要编译器支持。