zoukankan      html  css  js  c++  java
  • GNU C 一个别致的HelloWorld程序 引申到: __attribute__((constructor)|(destructor)(PRIORITY))

    在前面的<<程序员的自我修养 链接 装载与库>>关于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多采用第一种写法.

     

    外面又下雨了~ Cause i am ur lady, u are my man. 

     

     
  • 相关阅读:
    在tmux中如何复制文本并粘贴到某处?
    linux下的用户密码文件/etc/shadow
    linux下openssl命令解析
    第 27 章 CSS 传统布局[下]
    第 27 章 CSS 传统布局[上]
    第 26 章 CSS3 动画效果
    第 25 章 CSS3 过渡效果
    第 24 章 CSS3 变形效果[下]
    第 23 章 CSS3 边框图片效果
    第 22 章 CSS3 渐变效果
  • 原文地址:https://www.cnblogs.com/respawn/p/2582078.html
Copyright © 2011-2022 走看看