经典链接脚本_必看的.pdfVIP

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
连接脚本的基本命令是 SECTIONS 命令,它描述了输出文件的“映射图” :输出文件中各段、各文件怎么放置。一个SECTIONS 命令内 部包含一个或多个段,段(SECTIONS )是连接脚本的基本单元,它表示输入文件中的某部分怎么放置。 完整的连接脚本格式如下,它的核心部分是段(SECTIONS ): SECTIONS{ secname start ALIGN(align) (NOLOAD):AT(ldadr) { contents } region :phdr=fill } secname 和contents 是必须的,前者用来命名这个段,后者用来确定代码中的什么部分放在这个段中。 start 是这个段的重定位地址,也称为运行地址。如果代码中有位置相关的指令,程序在运行时,这个段必须放在这个地址上。 ALIGN(align) :虽然start 指定了运行地址,但是仍可以指定对齐的要求,这个对齐的地址才是真正的运行地址。 (NOLOAD):用来告诉加载器,在运行时不用加载这个段。显然,这个选项只有在有操作系统的情况下才有意义。 AT(ldadr) :指定这个段在编译出来的映像文件中的地址——加载地址。如果不使用这个选项,则加载地址等于运行地址。通过这个选项, 可以控制各段分别保存输出文件中不同的位置,便于把文件保存到单板上:A 段放在A 处,B 段放在 B 处,运行前再把A 、B 段分别读 出来组装成一个完整的执行程序。 后面的三个选项在例子中没有使用到,所以不作介绍。 @$(LD) -Tbin.lds -o $(OBJ_DIR)/rom_elf $(addprefix $(OBJ_DIR)/,$(notdir $^)) 以上使用了连接脚本bin.lds 来设置可执行文件rom_elf 的地址信息,bin.lds 的内容如下: SECTIONS { . = 0 .init : AT(0){ /home/txgcwm/weidongshan/arm_sources/code/obj/2440start.o /home/txgcwm/weidongshan/arm_sources/code/obj/init.o /home/txgcwm/weidongshan/arm_sources/code/obj/nand.o} . = 0 .text : AT(4096) { *(.text) } .rodata ALIGN(4) : AT((LOADADDR(.text)+SIZEOF(.text)+3)~(0x03)) {*(.rodata*)} .data ALIGN(4) : AT((LOADADDR(.rodata)+SIZEOF(.rodata)+3)~(0x03)) { *(.data) } __bss_start = .; .bss ALIGN(4) : { *(.bss) *(COMMON) } __bss_end = .; } 以上已经有了整体的介绍,下面介绍一下注意点: a.第4 行中的地址需要正确的填写,否则连接不能正常通过,或者生成的bin 不能执行; b.一般启动代码的加载地址为0 (存在Nand flash 上的地址)。从nand flash 启动时,这些代码被复制到steppingstone 后就可以直接运 行了。arm 的steppingstone 只有4k,所以这部分代码我们要严格控制住; c.第6、7 行表示其余的代码的运行地址为0加载的地址设为4096 ,表示代码将存在nand flash 地址4096 处; d.(LOADADDR(...)表示某段的加载地址,SIZEOF(...)表示某段的大小。虽然前面指明了 ALIGN(4)让它们的运行地址为 4 字节对齐,为 了使各段之间加载地址的相对偏移值等于运行地址的相对偏移量,需要将AT (...)中的值也设为4 字节对齐:先加上3,然后与~(0x03) 进行与操作。 以上提到了下面这句话(通过这个选项,可以控制各段分别保存输出文件中不同的位置,便于把文件保存到单板上:A 段放在 A 处,B 段放在B 处,运行前再把A 、B 段分别读出来组装成一个完整的执行程序),给出启动代码中例子,便于大家的理解,代码如下: Reset: ldr sp, =4096 @ 设置栈指针,以下都是C

您可能关注的文档

文档评论(0)

JuanHuang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档