链接脚本分析

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

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

原文地址:https://www.cnblogs.com/amanlikethis/p/3344519.html