如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
HYPERLINK"http://www.cnblogs.com/cbs-soft/archive/2010/01/08/1642388.html"ARM-GCC-LD脚本从以前的经验,链接脚本是嵌入式开发,单片机开发相当重要的一个东西。它完成的工作是做PC机软件的同志们不用关心的,但是也是很复杂的一项工作。总结来看链接脚本要告诉连接器1:输出什么2:输入是什么,那么obj文件3:要用什么库,库放在什么地方4:内存分布地址5:提供启动代码一些全局地址变量一般来说链接脚本需要搞清楚这几样事情后才能编写,那arm-gcc-ld的脚本也一定要实现这些功能。对于大多数的链接器来说,对于简单的项目不需要脚本,只是使用命令参数就可以完成了。MEMORY:它是用来补充SECTIONS命令的,用来描述目标CPU中可用的内存区域。它是可选的,如果没有这个命令,LD会认为SECTIONS描述的相邻的内存块之间有足够可用的内存。其实很容易理解但是却很少用(我没用过,嘿嘿),在SECTIONS中每个段的分布都没有考虑ARM能够寻址的地址中,ROM,RAM,FLASH是不是连续的。如果不是连续的怎么办?MEMORY就是设置各个区的起始位置,大小,属性的命令,在一个脚本中只能有一个。举一个例子:如果你的板子有两段存储,而且很遗憾的是不是连续的,一段是从0x0开始,大小为256K,另一段是从0x40000000开始的大小为4M,你可以在脚本中写入如下的代码来描述你的板子的内存信息。1MEMORY2{3rom(rx):ORIGIN=0,LENGTH=256K4ram(!rx):org=0x40000000,l=4M5}很显然下面的一句用了简略标签,这并不重要,重要的是怎样使用它,不过在那之前还是想再仔细研究下MEMORY命令的细节。MEMORY命令的语法是:MEMORY{name(attr):ORIGIN=origin,LENGTH=len...}name:一个用户定义的名字,Linker将在内部使用它,所以别把它和SECTIONS里用到的文件名,段名等搞重复了,它要求是独一无二的。attr:如同它的名字一样,这是内存段的属性描述。`R'Read-onlysections.`W'Read/writesections.`X'Sectionscontainingexecutablecode.`A'Allocatedsections.`I'Initializedsections.`L'SameasI.`!'Invertthesenseofanyofthefollowingattributes.别怪我懒,确实不想再打一遍这个的翻译,而且很久没用英文的俺翻译的估计也不好。总体来说,它是属性就行了。ORIGIN:这是起始地址LENGTH:段长由此可见上面那段实例显示ROM和RAM的明确位置,而且还显示了他们的只能,一个存代码,一个除了存代码什么都可以。接着就是老问题了,怎么用这个。如果仅仅是规定我的板子有什么特点又不用的话那就是脱了裤子放屁,多此一举。这个问题留在SECTIONS命令中回顾。SECTIONS:它是脚本文件中最重要的元素,不可缺省。它的作用就是用来描述输出文件的布局。SECTIONS命令的语法:SECTIONS{...secnamestartBLOCK(align)(NOLOAD):AT(ldadr){contents}>region:phdr=fill...}这么多的参数中,只有secname和contents是必须的,其他都是可选的参数。也就说它的最简单的格式就是:SECTIONS{...secname:{contents}...}但是注意:secname前后的两个空格是必须的,否则就是不合法输入。secname定义了段名,其实最开始就忽略了一个重要的因素,arm-gcc-ld脚本需要描述输入和输出,而表面上一看却看不出来什么是输入什么事输入,其实secname和contents就是描述这两个信息的参数。secname是输出文件的段,即输出文件有哪些段,而contents就是描述输出文件的这个段从哪些文件里抽取而来。明确这个了就不难理解为什么SECTIONS命令什么都可以不要就是不能没有这两个参数了。secname:定义段,但是别以为定义的段一定要是教科书上写的.data,.text这些科班的必须品,你甚至可以创建一个段来放一个美女的图片。contents:它的语法开始复杂起来了,但是你可以简单的把输入文件写到代码中:.data:{main.oled.o}但是结果被列的目标文件中所有的代码都被链接到.data中去了,显然不大符合我们的要求啊。那么还有一种