嵌入式系统教学课件:链接定位脚本.docxVIP

嵌入式系统教学课件:链接定位脚本.docx

  1. 1、本文档共2页,可阅读全部内容。
  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文档。上传文档
查看更多
附录 B 链接定位脚本链接定位是系统级软件开发过程中必不可少的一部分,嵌入式软件开发均属于系统级开发,绝大部分嵌入式软件都涉及到链接定位脚本文件;链接定位脚本使得我们的目标代码组织更加灵活。1)链接定位脚本文件说明链接定位过程一般由链接器根据链接定位脚本完成,比较简单的系统可以通过设置链接器开关选项取代链接定位脚本;链接定位的关键是链接定位脚本的编写.我们从典型的目标文件结构开始,来介绍链接定位脚本文件的编写.下面是该系统一个目标文件的典型组织:??其中第二栏开始分别展示了该文件各个段(Sections)的属性:名称(Name),类型(Type),地址(Addr),偏移(Offs),大小(Size),固定单元大小(Es),标志(Flg),连接依赖(Lk),附加属性(Inf),字节对其宽度(Al). 地址部分(Addr)描述了这一段在目标系统中的地址,而偏移(Offs)则记载了该段在目标文件中的偏移,大小(size)表示该段的实际长度;比如上图中.Text段的地址为0x0c700000,偏移为0x008000,大小为0x00d950,说明该段位于文件的偏移0x008000处,它将被下载到目标板0x0c700000处.从段的分类来看,第7段以后的内容仅仅与调试有关,涉及到定位的也就是前面几段:.text,.data,.rodata,.bss,下面是一个具体的链接定位脚本文件: SECTIONS { . = 0x0c200000; /*赋当前地址,后续的代码将从该地址开始存放 */ .text : { (.text) } /*.text段表示代码段,从0x0c200000开始放置代码*/ Image_RW_Base= .; /* RW(可写数据)基址,实际上是在这里声明了一个全局符号,我们可以在程序中使用该符号,它等同于在代码中声明一个全局变量,但它的值由链接器指定,在这里=.表示该符号的值等于当前地址;下面的定义类似*/ .data : { (.data) } /*数据段, 保存已经初始化的全局数据 */ .rodata : { *(.rodata) } /*只读数据段, 保存已经初始化的全局只读数据*/ Image_ZI_Base= .; /*ZI基地址, 需要清零的区域 zero init*/ .bss : { *(.bss) } /*堆栈段,未初始化的全局变量也保存在此*/ __bss_start__ = .; /* bss的基地址*/ __bss_end__ = .; /* bss的结束地址*/ __EH_FRAME_BEGIN__ = .; /* FRAME开始地址(基地址)*/ __EH_FRAME_END__ = .; /* FRAME结束地址,gcc编译器使用 */ PROVIDE (__stack = .); /* 当前地址赋给栈,栈地址一般是可读写区最高处*/ end = .; /* 结束地址*/ _end = .; /* 结束地址*/ .debug_info 0 : { *(.debug_info) } /*调试信息*/ .debug_line 0 : { *(.debug_line) } /*调试信息*/ .debug_abbrev 0 : { *(.debug_abbrev)} /*调试信息*/ .debug_frame 0 : { *(.debug_frame) } /*调试信息*/ } text段是程序代码段,紧随其后的是几个符号定义,它们是由编译器在编译连接时自动计算的,当我们在链接定位文件中申明这些符号后,编译连接时,该符号的值会自动代入到源程序的引用中. data段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和我们的程序大小没有关系,但和程序使用到的全局变量,常量数量相关. bss的初始值也是由我们自己定义的连接定位文件所确定,我们应该将它定义在可读写的RAM区内,stack的顶部在可读写的RAM区的最后,我们可以非常灵活的定义其起点和大小,但对大部分情况来说,程序区在ROM或FLASH中,可读写区域在SRAM或DRAM中,我们可以考虑一下自己程序规模,函数调用规模,存储器组织,然后参照一个连接定位文件稍加修改就可以了.2)链接定位脚本修改实例SECTIONS { . = 0 /*将代码段起始地址修改到0*/ .text : { *(.text) } Image_RW_Base= .;.=0xc0000000 /*设置数据段从0xc0000000开始存放*/ .data : { *(.data) } .=0xd0000000 /*设置只读数据段从0xd0000000开始存放*/ .rodata : { *(.rodata) } Image_ZI_Base=

文档评论(0)

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

文档有任何问题,请私信留言,会第一时间解决。

版权声明书
用户编号:7043023136000000

1亿VIP精品文档

相关文档