编译生成的object file,代码会保存在".text"段,全局变量和静态变量会放在".data"和".bss"(未初始化的全局变量和局部静态变量)
利用GCC的扩展机制就可以做到自定义段了.
对[ __attribute__ ] 很感兴趣,下面来看一个不一样的HelloWorld程序:
#include <stdio.h>
#include <stdlib.h>
static __attribute__((constructor)) void before()
{
printf("Hello");
}
static __attribute__((destructor)) void after()
{
printf(" World!\n");
}
int main(int args,char ** argv)
{
return EXIT_SUCCESS;
}
我们知道这是一个HelloWorld程序,所以输出的结果就是"Hello World!",很简单,不需要对这点过多关心.
下面我们来关心关心别的:
__attribute__((constructor))
__attribute__((destructor))
解释一下:__attribute__((constructor)) 在main() 之前执行,__attribute__((destructor)) 在main()执行结束之后执行.
上面的例子中我没有在main函数中添加任何的输出,所以看不到具体的信息.这点可以自己尝试~
如果要在main()之前或者是执行完成之后,需要执行很多的前处理动作或者是后处理动作,我们应该怎么处理?
也许,你需要下面这些东西:
__attribute__((constructor(PRIORITY)))
__attribute__((destructor(PRIORITY)))
PRIORITY: 优先级.
好吧,下面就来试试:
输出如下:
7 pre_proc_1
20 pre_proc_2
26 end_proc_2
14 end_proc_1
从输出的信息看,前处理都是按照优先级先后执行的,而后处理则是相反的.
另外一个问题,优先级有没有范围的?
0-100(包括100),是内部保留的,所以在编码的时候需要注意.
关于__attribute__的用法,可以有另外一种写法,先声明函数,然后再定义.
如:
hello
cleanup code after main()
利用GCC的扩展机制就可以做到自定义段了.
对[ __attribute__ ] 很感兴趣,下面来看一个不一样的HelloWorld程序:
#include <stdio.h>
#include <stdlib.h>
static __attribute__((constructor)) void before()
{
printf("Hello");
}
static __attribute__((destructor)) void after()
{
printf(" World!\n");
}
int main(int args,char ** argv)
{
return EXIT_SUCCESS;
}
我们知道这是一个HelloWorld程序,所以输出的结果就是"Hello World!",很简单,不需要对这点过多关心.
下面我们来关心关心别的:
__attribute__((constructor))
__attribute__((destructor))
解释一下:__attribute__((constructor)) 在main() 之前执行,__attribute__((destructor)) 在main()执行结束之后执行.
上面的例子中我没有在main函数中添加任何的输出,所以看不到具体的信息.这点可以自己尝试~
如果要在main()之前或者是执行完成之后,需要执行很多的前处理动作或者是后处理动作,我们应该怎么处理?
也许,你需要下面这些东西:
__attribute__((constructor(PRIORITY)))
__attribute__((destructor(PRIORITY)))
PRIORITY: 优先级.
好吧,下面就来试试:
输出如下:
7 pre_proc_1
20 pre_proc_2
26 end_proc_2
14 end_proc_1
从输出的信息看,前处理都是按照优先级先后执行的,而后处理则是相反的.
另外一个问题,优先级有没有范围的?
0-100(包括100),是内部保留的,所以在编码的时候需要注意.
关于__attribute__的用法,可以有另外一种写法,先声明函数,然后再定义.
如:
#include<stdio.h>
/* Apply the constructor attribute to myStartupFun() so that it
is executed before main() */
void myStartupFun (void) __attribute__ ((constructor));
/* Apply the destructor attribute to myCleanupFun() so that it
is executed after main() */
void myCleanupFun (void) __attribute__ ((destructor));
/* implementation of myStartupFun */
void myStartupFun (void)
{
printf ("startup code before main()\n");
}
/* implementation of myCleanupFun */
void myCleanupFun (void)
{
printf ("cleanup code after main()\n");
}
int main (void)
{
printf ("hello\n");
return 0;
}
输出是:
startup code before main()hello
cleanup code after main()
文章评论
共有 1 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面