zoukankan      html  css  js  c++  java
  • __attribute__ ((section(".text")))的测试

    一、测试原因

       在学习u-boot的环境变量过程中,看到有如此的代码,现对涉及到的内容进行实验测试。 

    二、测试目的

    1、了解gcc允许对段的属性进行更改的方法。

    2、解决”ENV_IS_EMBEDDED“解惑以及相关的移植实验中如何将环境变量(结构体变量environment)定位在代码段的0x33f84000的位置,以实现环境变量区嵌入到代码段的功能。

    三、测试原理(参考attribute 用法 section 部分)     

         gcc通过选项__attribute__可以改变所声明或定义的函数、数据的特性。它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。但这里我们比较感兴趣的是对代码段起作用子项section。

        __attribute__的section子项的使用格式为:

    __attribute__((section("section_name")))

        其作用是将作用的函数或数据放入指定名为"section_name"输入段。

    输入段和输出段

        输入段和输出段是相对于要生成最终的elf或binary时的Link过程说的。

        Link过程的输入大都是由源代码编绎生成的目标文件.o,那么这些.o 文件中包含的段相对link过程来说就是输入段,Link的输出一般是可执行文件elf或库等,这些输出文件中也包含有段,这些输出文件中的段就叫做输出段。输入段和输出段本来没有什么必然的联系,是互相独立。只是在Link过程中,Link程序会根据一定的规则(这些规则其实来源于Link Script),将不同的输入段重新组合到不同的输出段中,即使是段的名字,输入段和输出段可以完全不同。

        需要着重注意的是,__attribute__的section属性只指定对象的输入段,它并不能影响所指定对象最终会放在可执行文件的什么段。

    举例如下:

    更改变量的段属性

         定义的变量var将被放入名为.xdata的输入段,(注意:__attribute__这种用法中的括号好像很严格,这里的几个括号好象一个也不能少。)

    int var __attribute__((section(".xdata"))) = 0;

    更改函数的段属性

        这个例子将使函数functionA被放入名叫.xinit的输入段。

    static int __attribute__((section(".xinit"))) functionA(void)
    
    {
    
    .....
    }

    四、测试代码

        测试代码主要是从common/environment.c中摘取的,以测试本应该放在数据段(.data)的environment如何嵌入到代码段。

    1、start.S

    @******************************************************************************
    @ File:crt0.S
    @ 功能:通过它转入C程序
    @******************************************************************************       
    
    .text
    .global _start
    _start:
                bl      main                @ 调用C程序中的main函数
    halt_loop:
                b       halt_loop

    2、main.c

    int DATA = 5;
    int BSS;
    const int RODATA = 5; 
     
    int main(void)
    {
        return 0;
    }

    3、environment.c

    #define __PPCENV__  __attribute__ ((section(".text")))
    
    asm (".globl " "env_offset"); //定义全局变量env_offset以供连接脚本调用
    asm ("env_offset" " = " "0x04000");
    
    #define CFG_ENV_SIZE        0x2000    //环境变量大小
    # define ENV_HEADER_SIZE    (sizeof(unsigned long))
    #define ENV_SIZE (CFG_ENV_SIZE - ENV_HEADER_SIZE)
    
    typedef struct environment_s {
        unsigned long crc;            /* CRC32 over data bytes    */
        unsigned char    data[ENV_SIZE]; /* Environment data        */
    } env_t;
    
    env_t environment __PPCENV__ = { //将environment的数据段属性更改为代码段
        1,     
        "this is in environment!
    "
    };

    4、environment.lds

    SECTIONS {
        . = 0x00000000;
    .
    = ALIGN(4); .text : { start.o (.text); . = env_offset; environment.o(.text); *(.text) }
    .
    = ALIGN(4); .rodata : { *(.rodata) }
    .
    = ALIGN(4); .data : { *(.data) }
    .
    = ALIGN(4); .bss : { *(.bss) } }

    五、测试结果

    Disassembly of section .text:
    
    00000000 <_start>:
           0:    eb0017fe     bl    6000 <main>
    
    00000004 <halt_loop>:
           4:    eafffffe     b    4 <halt_loop>
        ...
    
    00004000 <environment>:
        4000:    00000001     andeq    r0, r0, r1
        4004:    73696874     cmnvc    r9, #7602176    ; 0x740000
        4008:    20736920     rsbcss    r6, r3, r0, lsr #18
        400c:    65206e69     strvs    r6, [r0, #-3689]!
        4010:    7269766e     rsbvc    r7, r9, #115343360    ; 0x6e00000
        4014:    656d6e6f     strvsb    r6, [sp, #-3695]!
        4018:    0a21746e     beq    8611d8 <BSS+0x85b1b8>
        ...
    
    00006000 <main>:
        6000:    e1a0c00d     mov    ip, sp
        6004:    e92dd800     stmdb    sp!, {fp, ip, lr, pc}
        6008:    e24cb004     sub    fp, ip, #4    ; 0x4
        600c:    e3a03000     mov    r3, #0    ; 0x0
        6010:    e1a00003     mov    r0, r3
        6014:    e89da800     ldmia    sp, {fp, sp, pc}
    Disassembly of section .rodata:
    
    00006018 <RODATA>:
        6018:    00000005     andeq    r0, r0, r5
    Disassembly of section .data:
    
    0000601c <DATA>:
        601c:    00000005     andeq    r0, r0, r5
    Disassembly of section .bss:
    
    00006020 <BSS>:
        6020:    00000000     andeq    r0, r0, r0
    Disassembly of section .comment:

    参考:attribute 用法 section 部分

  • 相关阅读:
    禁止WebBrowser控件弹出对话框
    c#禁止Webbrowser控件的弹出脚本错误对话框
    Spread 常用属性
    没有ID的验证码图片,调用方法将图片保存到本地
    C#网页表单自动填写实现原理
    LInqWhere
    加密与解密数据库中数据
    DataAdapter批量处理数据
    OperateXMLDateSet
    jquery json
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3518576.html
Copyright © 2011-2022 走看看