zoukankan      html  css  js  c++  java
  • 链接器脚本

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

     

     

     

        什么是链接脚本?链接脚本就是程序链接时的参考文件,其主要目的是描述如何把输入文件中的段(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

  • 相关阅读:
    linux学习(三)输入输出重定向和管道功能、cat命令、more命令
    linux基础学习(二)ls命令以及文件访问权限例(-rw-r-r--)
    c语言的全排列
    linux基础学习(一)常用命令:date、pwd、cd、cal、who、wc等等
    用linux编译并运行c文件
    安装linux虚拟机
    安装quickLook插件以及解决如何不能读取offic问题
    java:数据结构(四)二叉查找树以及树的三种遍历
    java:数据结构复习(三)链表队列
    数据结构java学习(三)循环队列
  • 原文地址:https://www.cnblogs.com/LoTGu/p/5906161.html
Copyright © 2011-2022 走看看