美文网首页
链接脚本简笔记

链接脚本简笔记

作者: 大亮x | 来源:发表于2020-06-27 16:30 被阅读0次

    我们在链接代码的时候使用以下语句,就可以将所有的文件链接到以0x87800000为起始地址的地方。

    arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^
    

    但是在很多时候我们需要将一些文件链接到指定的区域,这是后就需要使用链接脚本了。

    首先看一段代码:

    imxul.lds:
    SECTIONS{
      . = 0X87800000;
      .text :
      {
        start.o
        main.o
        *(.text)
      }
      .rodata ALIGN(4) : {*(.rodata*)}
      .data ALIGN(4) : { *(.data) }
      __bss_start = .;
      .bss ALIGN(4) : { *(.bss) *(COMMON) }
      __bss_end = .;
    }
    

    有了这个之后我们就可以这样链接

    arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^
    

    语法分解

    1、基本框架:SECTIONS{}

    每一个链接脚本必须有的

    2、特殊符号 “.”

    “.” 在链接脚本里面叫做定位计数器, 默认的定位计数器为 0。我们要求代码链接到以 0X10000000 为起始地址的地方,因此这一行给“.”赋值。
    同时我们要特别注意:“.”与“=”之间有一个空格,不然会报错。

     . = 0X10000000;
    

    3、段名与段的内容

    .text 即是段名,后面跟的冒号“:”是语法要求,大括号“{ }”内的文件就是要链接在.text的文件。*(.text) 中的符号 “ * ” 是通配符。代表所有输入文件的.text段都放到“.text”中。

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

    4、字节对齐ALIGN

    ALIGN(4)对 .rodata这个段的起始地址进行4字节对齐。

     .rodata ALIGN(4) : {*(.rodata*)}
    

    链接脚本里的段

    我们一般编译出来的代码都包含在 text、data、bss 和 rodata 这四个段内

    text

    通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定。

    bss

    存放定义了但是没有被初始化的变量。

    data

    存放数据。

    rodata (read only data)

    存放只读数据(const)。rodata内的变量存放在ROM中,运行时直接读取ROM内存,无需要加载到RAM内存中

    相关文章

      网友评论

          本文标题:链接脚本简笔记

          本文链接:https://www.haomeiwen.com/subject/ibtvfktx.html