0x1 constructor
attribute((constructor)) 是 GCC 编译器的一个特性,它允许定义一个特殊的函数,这个函数会在 main 函数执行之前,也就是程序开始执行时被调用。
这通常用于执行一些初始化任务,比如设置日志系统、初始化全局变量等。
这个属性可以应用于任何函数,该函数不需要参数,也不需要返回值。
当你使用这个属性时,GCC 编译器会确保这个函数在程序的构造阶段被调用,也就是在 C++ 中的 std::ios_base::Init 对象被销毁之前。
#include <stdio.h>
// 定义一个构造函数
void init() __attribute__((constructor));
void init() {
printf("Initialization function called.\n");
}
int main() {
printf("Main function called.\n");
return 0;
}
0x2 constructor_priority
attribute((constructor(priority))) GCC 还支持使用优先级参数来控制多个构造函数的调用顺序。
这个优先级是一个整数值,优先级较小的构造函数会先于优先级较大的构造函数执行。
在下面例子中,执行顺序是part0,part1,part2
void init_function_part0() __attribute__((constructor(80)));
void init_function_part1() __attribute__((constructor(99)));
void init_function_part2() __attribute__((constructor(101)));
0x3 destructor
attribute((destructor)) 是 GCC 编译器的一个扩展属性,它允许你定义一个特殊的函数,这个函数会在 main 函数执行结束后,或者当调用 exit() 函数退出程序时自动执行。
这种析构函数通常用于执行程序退出前的清理工作,比如释放资源、关闭文件等。
void cleanup_function() __attribute__((destructor));
0x4 destructor_priority
**attribute((destructor(priority)))**和构造函数一样,析构函数也可以有优先级参数来控制它们的执行顺序。优先级较小的析构函数会先于优先级较大的析构函数执行。
优先级的范围同样是 0 到 65535。
void cleanup_function_step1() __attribute__((destructor(50)));
void cleanup_function_step2() __attribute__((destructor(100)));