__attribute__((constructor))和 __attribute__((destructor))怎么执行

2023-04-06 07:19:00

__attribute__((constructor))和__attribute__((destructor))是gcc编译器提供的两个特殊的函数修饰符,可以分别用于在指定的目标文件加载到内存之前和卸载出内存之后执行特定的函数。

常见的应用场景有:

1. 在目标文件加载到内存之前需要进行一些初始化工作,比如注册信号处理函数、初始化全局变量等,这时可以使用__attribute__((constructor))修饰的函数完成这些工作。

2. 在目标文件卸载出内存之后需要进行一些清理工作,比如释放全局变量分配的内存、注销信号处理函数等,这时可以使用__attribute__((destructor))修饰的函数完成这些工作。

下面是一个使用__attribute__((constructor))和__attribute__((destructor))修饰的简单例子:

#include void init_func(void) __attribute__((constructor)); void exit_func(void) __attribute__((destructor)); void init_func(void) { printf("target file is loaded into memory

"); } void exit_func(void) { printf("target file is unloaded from memory

"); } int main(void) { printf("main function is called

"); return 0; }

输出结果为:

target file is loaded into memory main function is called target file is unloaded from memory

可以看到,在目标文件加载到内存之前和卸载出内存之后,分别执行了init_func和exit_func函数。

需要注意的是,__attribute__((constructor))和__attribute__((destructor))只适用于目标文件,如果是链接库,是不会执行这两个函数的。

相关文章