zoukankan      html  css  js  c++  java
  • 了解甚少的GNU C的__attribute__ 机制

      平时忙着赶项目,很多东西都是不求甚解,当工作中遇到的一些比较刁钻的问题时,才发现自己和那些大牛的

    差距---内功。熟练码农和码神的最大区别估计就是内功是否深厚了。在自我反思的过程中,也要逐渐的积累一些很

    基本的知识,争取能烂熟于心,这样,才能做出高质量的产品。

      最近遇到了一个__attribute__ 机制相关的问题,在这里栽了跟头,就要好好总结一下,免得在以后的岁月中,再

    犯类似的错误。

      其实,GNU C 的一大特色就是__attribute__ 机制。这种机制在嵌入式系统中应用十分广泛,它的神奇作用就表现

    在三个地方:

       设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。

    我也就针对这三个属性做个总结吧。

      函数属性(Function Attribute )

      函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__

    机制也很容易同非GNU应用程序做到兼容之功效。GNU CC需要使用 –Wall编译器来击活该功能,这是控制警告信息的一个很

    好的方式。

      格式:__attribute__ format
    该__attribute__属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间

    的格式化字符串是否匹配。该功能十分有用,尤其是处理一些很难发现的bug。

      example:

    __attribute__((format(printf,m,n)))
    __attribute__((format(scanf,m,n)))

    m:第几个参数为格式化字符串(format string);
    n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总数排在第几,注意,有时函数参数里还有“隐身”的呢,后面会提到;

      源码实例参考:http://www.keil.com/support/man/docs/armcc/armcc_sam1436458756975.htm 

             http://unixwiz.net/techtips/gnu-c-attributes.html

      变量属性(Variable Attribute )

      编译器的关键字 __attribute__ 用来指定变量或结构位域的特殊属性。关键字后 双括弧中的内容是属性说明。常用的关键字都有

    哪些呢?

      section ("section-name")

      packed

      aligned (alignment)

       举个例子:

      在操作系统中常用的 __attribute__  ((section("name")))   .....

     就是通过着来实现的,这个的作用主要是:

    编译生成的object file,代码会保存在".text"段,全局变量和静态变量会放在".data"和".bss"(未初始化的全局变量和局部静态变量)

    利用GCC的扩展机制就可以做到自定义段了.

      关于变量的还有其他例子,写的比较详细,需要可以参考:

    http://www.cnblogs.com/respawn/archive/2012/07/09/2582078.html

    http://www.cnblogs.com/astwish/p/3460618.html

      类型属性(Type Attribute )

    类型属性主要用在结构体的操作上,其实很多时候和变量属性结合使用的,下面的实例可以很好说明类型属性 的作用和使用方法:

       代码:

    struct p
    
    {
    
    int a;
    
    char b;
    
    short c;
    
    }__attribute__((aligned(4))) pp;
    
    struct m
    
    {
    
    char a;
    
    int b;
    
    short c;
    
    }__attribute__((aligned(4))) mm;
    
    struct o
    
    {
    
    int a;
    
    char b;
    
    short c;
    
    }oo;
    
    struct x
    
    {
    
    int a;
    
    char b;
    
    struct p px;
    
    short c;
    
    }__attribute__((aligned(8))) xx;
    
    int main()
    
    {
    
    printf("sizeof(int)=%d,sizeof(short)=%d.sizeof(char)=%d
    ",sizeof(int),sizeof(short),sizeof(char));
    
    printf("pp=%d,mm=%d 
    ", sizeof(pp),sizeof(mm));
    
    printf("oo=%d,xx=%d 
    ", sizeof(oo),sizeof(xx));
    
    return 0;
    
    }

      输出结果:

    sizeof(int)=4,sizeof(short)=2.sizeof(char)=1
    
    pp=8,mm=12
    
    oo=8,xx=24
  • 相关阅读:
    跑路了
    *CTF 2019 quicksort、babyshell、upxofcpp
    pyspark如何遍历broadcast
    pwn易忘操作原理笔记
    pwn学习之四
    pwn学习之三
    pwn学习之二
    pwn学习之一
    2017GCTF部分writeup
    OD使用教程12
  • 原文地址:https://www.cnblogs.com/dylancao/p/8490253.html
Copyright © 2011-2022 走看看