嵌入式学习-uboot-lesson1-链接器脚本基础知识

1.链接器脚本的作用

链接脚本的作用是描述输入文件中的各个段(数据段,代码段,堆,栈,bss)如何被映射到输出文件中,并控制输出文件的内存排布

2.链接器脚本的组成
一个可执行程序通常是由:代码段,数据段,bss段构成的。同样,在用于链接这个程序的链接器脚本中,就会反应出这几个段的信息。

3.编程实例
一个链接器脚本主要分为几个方面:
段,起始链接地址,对齐设置,变量的使用

3.1 段信息
主要为代码段,数据段,bss段

SECTIONS{    //SECTIONS 固定格式
        .text: //代码段
        {
        *(.text)  //所有文件的代码
        }

        .data:  //数据段
        {
        *(.data)  //所有文件的数据段
        }        

        .bss:  //
        {
        *(.bss)  //
        }        
}

3.2设置链接地址

SECTIONS{    //SECTIONS 固定格式
        .= 0x50008000;     //. 代表当前位置,也就是起始位置

        .text: //代码段
        {
        *(.text)  //所有文件的代码
        }

        .data:  //数据段
        {
        *(.data)  //所有文件的数据段
        }        

        .bss:  //
        {
        *(.bss)  //
        }        
}

3.3对齐设置
arm处理器在访问的时候,是采用4字节的方式访问的,所以在存取数据的时候字节用4字节对齐,可以提高效率

SECTIONS{    //SECTIONS 固定格式
        . = 0x50008000;     //. 代表当前位置,也就是起始位置
        . = ALIGN(4);       //当前地址做到4字节对齐
        .text: //代码段
        {
        *(.text)  //所有文件的代码
        }

        . = ALIGN(4);       //数据段也要做到4字节对齐
        .data:  //数据段
        {
        *(.data)  //所有文件的数据段
        }        

        . = ALIGN(4);       //bss端也要做到4字节对齐
        .bss:  //
        {
        *(.bss)  //
        }        
}

3.4使用变量

SECTIONS{    //SECTIONS 固定格式
        . = 0x50008000;     //. 代表当前位置,也就是起始位置
        . = ALIGN(4);       //当前地址做到4字节对齐
        .text: //代码段
        {
        *(.text)  //所有文件的代码
        }

        . = ALIGN(4);       //数据段也要做到4字节对齐
        .data:  //数据段
        {
        *(.data)  //所有文件的数据段
        }        

        . = ALIGN(4);       //bss端也要做到4字节对齐
        bss_start = .;      //bss_start为自定义的变量,将当前地址赋给bss_start
        .bss:  //
        {
        *(.bss)  //
        }    
        bss_end = .;      //假设.的地址为100 则bss_start为100 bss段总长度为200 则bss_end地址为300
}

3.5设置代码段的首文件

SECTIONS{    //SECTIONS 固定格式
        . = 0x50008000;     //. 代表当前位置,也就是起始位置
        . = ALIGN(4);       //当前地址做到4字节对齐
        .text: //代码段
        {
        start.o(.text)      //首文件,即start.s
        *(.text)  //所有文件的代码
        }

        . = ALIGN(4);       //数据段也要做到4字节对齐
        .data:  //数据段
        {
        *(.data)  //所有文件的数据段
        }        

        . = ALIGN(4);       //bss端也要做到4字节对齐
        bss_start = .;      //bss_start为自定义的变量,将当前地址赋给bss_start
        .bss:  //
        {
        *(.bss)  //
        }    
        bss_end = .;      //假设.为100 则bss_start为100 bss段长度为200 则bss_end为300
}

菜鸟一枚,如有错误,欢迎指教。。。

你可能感兴趣的:(脚本,嵌入式)