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

    链接三要素:链接顺序,链接地址,加载地址

    1.连接顺序的问题

      倘若没有链接脚本,例如:arm-linux-ld –Ttext 0x00000000 -o nand_elf $^,那么链接顺序就是$^的顺序,即makefile中依赖的顺序。

      倘若有链接脚本,则会按照链接脚本的规则进行链接。例如:
    SECTIONS {
      firtst   0x00000000 : {head.o init.o nand.o}
      second  x30000000 : AT(4096){ main.o}
    }
    这个规则中定义了两个大段,first和second。
    first的链接顺序为head.o init.o nand.o. Second的链接顺序为main.o。

    2.链接地址的问题

      先说明一下链接地址的概念,链接地址是程序实际运行的地址。通常程序中有位置无关代码和位置有关代码。位置无关代码是对于链接地址无要求,可以在不是它链接地址的地方运行;但是位置有关代码,必须在链接地址运行。也就是说当运行位置有关代码时,程序必须事先在链接地址上,如果没有在,通常需要COPY到那个位置或者利用MMU映射一下。

      下边以一个例子来说明一下链接脚本中链接地址的问题。
     SECTIONS {
      firtst   0x00000000 : {head.o}
      second 0x00000200 : AT(300) {init.o}
      third  0x00000400 : AT(500) {nand.o}
      fourth  0x30000000 : AT(3096) { main.o}
    }
    四个部分:first、second、third、foutth,它们的链接地址分别是0x00000000、0x00000200、0x00000400、0x30000000。

    3.加载地址

      加载地址指的是程序编译后的存放地址,通常存放在ROM、FLASH中,所以就是指这段程序在ROM、FLASH中的存放位置。还是以上边的连接脚本为例。

     SECTIONS {
      firtst   0x00000000 : {head.o}
      second 0x00000200 : AT(300) {init.o}
      third  0x00000400 : AT(500) {nand.o}
      fourth  0x30000000 : AT(3096) { main.o}
    }

    它们的存放地址分别是0、300、500、3096。

    链接:GNU linker manual

  • 相关阅读:
    tp5的 LayUI分页样式实现
    BSBuDeJie_05
    WCF 程序入门
    iOS Xcode 调试技巧
    Visual Studio 2015 如何将全英界面转成中文
    BSBuDeJie_04
    BSBuDeJie_03
    BSBuDeJie_02
    BSBuDeJie_01
    iOS 一些琐碎的知识点
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3344519.html
Copyright © 2011-2022 走看看