• 链接器脚本


       参考:《程序员的自我修养:链接、装载与库

     

     

     

        什么是链接脚本?链接脚本就是程序链接时的参考文件,其主要目的是描述如何把输入文件中的段(SECTION)映射到输出文件中,并控制输出文件的存储布局。链接脚本的基本命令式SECTIONS命令,一个SECTIONS命令内部包含一个或多个段,段(SECTION)是链接脚本的基本单元,它表示输入文件中的某个段是如何放置的。

    链接脚本的标准格式如下:

    SECTIONS

    {

      sections-command

      sections-command

    }

    下面我们配合link.lds进行具体讲解:

    SECTIONS

    {

      . = 0xD0024000;

      .text : { start.o * (.text)

    }

    .data : {

    * (.data)

    }

    bss_start = .;

    .bss : {

    * (.bss)

    }

    bss_end = .;

    }

       在链接脚本中,单独的点号(.)代表了当前位,. = 0xD0024000; 表示程序的链接地址是0xD0024000;

       link.lds中的.text 、 .data 、 .bss分别是text段、data段、bss段的段名(这些段名并不是固定的,是可以随便起的)。.text段包含的内容是start.o和其余代码中所有的text段;.data段包含的内容是代码中所有的data段;.bss段包含的内容是代码中所有的bss段。

    bss_start和bss_end保存的是bss段的起始地址和结束地址,在start.S中会被用到。

    下面解释一下什么是data、text、bss段:

        1) data段:数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

        2) text段:代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

        3) bss段:指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。当我们的程序有全局变量是,它是放在bss段的,由于全局变量默认初始值都是0,所有我们需要手动清bss段。

    1脚本构成

    1.1 链接器脚本基本构成-

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

    创建链接器脚本-段信息

                         clip_image002

    1.2 设置起始链接地址

    ( . = 0x0; "."表示当前位置)

                      clip_image003   clip_image005

    如上图所示,查看用上图的链接器脚本(左图)生成的elf文件的反汇编文件(右图),可以看到代码的起始地址是00000000

             clip_image007 clip_image009

    如上图所示,查看用上图的链接器脚本(左图)生成的elf文件的反汇编文件(右图),可以看到代码的起始地址是30008000

    注:地址变化的影响在后续讲解。

    1.3 对齐设置

        字节对齐可以提高效率;当代码起始地址不是4字节对齐的,就需要通过. = ALIGN(4):对当前地址4字节对齐。

    分别对当前地址、.text段、.data段和.bss段地址4字节对齐

                                       clip_image011

    1.4 使用变量

    bss_start = . ; 记录bss段首当前地址,保存下来

    bss_end = . ; 记录bss段尾当前地址,保存下来

    这些地址保存下来,可以在程序中使用

                                             clip_image013

    1.5 设置代码段首文件

    哪个代码段排在代码的最前面呢?

    指明start.o排在最前面,运行程序首先执行start.o,主要是CPU上电要完成初始化;

                                clip_image015

  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/LoTGu/p/5906161.html
Copyright © 2020-2023  润新知