• u-boot.lds 链接脚本分析(hi3515)


    目录:/u-boot_hi3515/board/hi3515v100

     

    OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //输出可执行文件是elf格式,32位ARM指令,小端
    OUTPUT_ARCH(arm)      //输出可执行文件的运行环境,是 arm 平台的
    ENTRY(_start)       //指定输出可执行文件的起始代码段为_start(在start.S中定义)
    SECTIONS          //section 命令用来设置段
    {
       . = 0x00000000;  //将当前地址定位到 0x00000000 处,操作符用来表示当前地址
       . = ALIGN(4);    //代码以4字节对齐
       .text          // 定义 .text 段
       {

         //段由start.o,libhi3515v100.a,dlmalloc.o,console.o,nand_boot.o等中的.text段所有段组成
         cpu/arm926ejs/start.o (.text)  //代码的第一个代码部分

         board/hi3515v100/libhi3515v100.a (.text)
         common/dlmalloc.o (.text)
         common/console.o (.text)
         common/nand_boot.o (.text)
         drivers/mtd/libmtd.a (.text)
         drivers/mtd/nand/libnand.a (.text)
         lib_generic/libgeneric.a (.text)
         cpu/arm926ejs/libarm926ejs.a (.text)
         cpu/arm926ejs/hi3515v100/libhi3515v100.a (.text)
         lib_arm/libarm.a (.text)
         drivers/serial/libserial.a (.text)
       }
       . = ALIGN(4);
       .rodata : { *(.rodata) }  //指定.rodata段(只读数据段)由所有输入文件的.rodata段组成
       . = ALIGN(4);
       .data : { *(.data) }    //指定.data段(读/写数据段)由所有输入文件的.rodata段组成

       . = ALIGN(4);
       .got : { *(.got) }      //.got段由所有输入文件的. got段组成(got段式是uboot自定义的一个段, 非标准段)
       . = ALIGN(4);
       .text1 :                //指定其他代码段
       {
         *(.text)
       }
       . = ALIGN(4);
       . = .;                //指定定位器为当前值(即为该语句相对段首偏移)
       __u_boot_cmd_start = .;  //__u_boot_cmd_start的值被设置为了当前地址
       .u_boot_cmd : { *(.u_boot_cmd) }  //.u_boot_cmd段由所有文件的.u_boot_cmd段组成
       __u_boot_cmd_end = .;             //__u_boot_cmd_end变量的值被赋值为了当前地址
       __img_end = .;

       . = _start + 0x100000;    //指定定位器为开始地址+0x100000(偏移)处
       . = ALIGN(32);           //定位器当前地址,32位对齐
       __bss_start = .;      //把__bss_start赋值为当前位置,即bss段的开始位置
        .bss1 (NOLOAD) : {*(.bss)}  //.bss段由所有输入文件的.bss段组成
        _end = .;                 //把_end赋值为当前位置,即bss段的结束位置
    }


    a.out 的头部根据 unix 版本的不同而略有变化, BSD 中的格式如下

           int   a_magic ;        // 幻数

           int    a_text;                        // 文本段的大小

           int   a_data;                       // 初始化的数据段的大小

           int   a_bss;                         // 未初始化的数据段的大小

           int  a_syms;                     // 符号表的大小

           int   a_entry;                     // 入口点

           int   a_trsize;                     // 文本重定位段的大小

           int   a_drsize;                    // 数据重定位段的大小

    text section:    存放程序代码

    Data section:   存放数据

    Bss section :   存放未初始化的数据,在镜像文件中,是不为 bss 段分配空间的,所以如果你开一个很大的全局的未初始化的数组,镜像文件的大小不会相应的变大。而只是在加载器将镜像加载进内存时,才会为 bss 段分配空间

    链接器:把各个目标文件的各种段进行重新组合.


  • 相关阅读:
    菜鸟看懂算法以后之一:头痛的64次左移
    C语言通过指针数组和二维数组读取文件
    C++中构造函数调用构造函数
    bnuoj53075 外挂使用拒绝
    [CodeForces]String Reconstruction
    BNU-2017.7.4排位赛2总结
    BNU-2017.7.5排位赛3总结
    BNU-2017.7.3排位赛1总结
    微软大楼设计方案(困难)
    最长公共子序列针对小字符集的算法
  • 原文地址:https://www.cnblogs.com/alan666/p/8312179.html
Copyright © 2020-2023  润新知