GNU C
来源:互联网 发布:anywhere软件源 编辑:程序博客网 时间:2024/05/16 12:02
转自http://www.cnblogs.com/respawn/archive/2012/07/09/2582078.html
在前面的<<程序员的自我修养 链接 装载与库>>关于object files的内容中,有看到使用自定义段的部分内容,
(如果关于object files的内容不了解的话,可以去参考<<程序员的自我修养 链接 装载与库>>这本书或者去wiki,
其中也有关于段的解释,也可以称作节区.) 可以通过硬编码实现自定义段.
__attribute__ ((section(
"name"
))) .....
编译生成的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: 优先级.
好吧,下面就来试试:
执行的输出如下:
从输出的信息看,前处理都是按照优先级先后执行的,而后处理则是相反的,好吧,我们使用GDB调试验证一下:
从调试的信息也是验证了上面的结果.
另外一个问题,优先级有没有范围的?
其实刚开始我写的程序中的优先级是1,我们将上面的程序改一下,然后编译看一下会有什么样的结果:
0-100(包括100),是内部保留的,所以在编码的时候需要注意.
关于__attribute__的用法,可以有另外一种写法,先声明函数,然后再定义.
glibc多采用第一种写法.
- GNU C
- GNU C
- GNU C
- GNU C ANSI C
- GNU C Compiler
- Learning GNU C
- The GNU C Library
- GNU C: __attribute__
- GNU C __attribute__ 精解
- Using GNU C __attribute__
- GNU C扩展
- GNU C扩展(一)
- GNU C扩展(一)
- GNU C __attribute__ 机制
- GNU C __attribute__ 用法
- 扩展GNU C
- GNU C __attribute__
- Using GNU C __attribute__
- application实时统计功能的实现。。。求指教。。
- Spring中集成Hibernate
- Observer代替广播实现注册,通知,更新数据
- 如何调试分析Android中发生的tombstone
- Mysql日志解析
- GNU C
- 【C++】学习笔记五十二——友元
- 贝叶斯决策 实例
- 主题三 编译过程介绍----20.#和##运算符的使用分析
- HDU2433 Travel 最短路径树
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析
- web支付
- eclipse最有用快捷键整理
- DataSnap