链接器和链接器的配置 2015
http://blog./uid-28300844-id-4886541.html 2.1 EWARM 4.xx的链接器XLINK及其配置文件.xcl XLINK链接器可以把IAR汇编器或编译器所产生的可重定位的UBROF目标文件转换成针对目标处理器的机器码。XLINK一般通过外部链接器命令文件 (*.xcl)来配置,当然也可以在命令行中直接在xlink命令之后输入链接选项,或者也可以在XLINK_ENVPAR环境变量中设置链接选项。下面 介绍XCL文件中常用的链接选项,以便在版本迁移之前,确切地了解XCL文件的含义。 2.2 XLINK选项 下面介绍几个XCL文件中常见的链接器配置选项。更详细的内容请查阅XLINK的参考手册:IAR Linker and Library Tools Reference Guide。 -D -Dsymbol=value 作用: 使用-D选项可以定义一些 纯粹的符号,一般用于声明常数。 参数: symbol是未在其它地 方定义过的外部符号,value是symbol所代表的值。例如: 就定义了2个标识了ROM 起始和结束地址的符号,这样以后关于ROM地址的配置都可以直接使用这2个符号,使得配置文件的可读性增强。 -Z -Z [@] [(SPLIT-)type] segments [=|#] range [, range] … 作用: 使用-Z命令的目的是规定 segments在存储空间中占据的位置和区间。如果链接器发现某个segment没有使用-Z,-b或者-P中的任何一个命令进行定义,则会报错。 参数: @ 使用@参数,表示为segments分配空间时不考虑任何已经被使用的地址空间。这适用于当某些segments的地址空间需要发生重叠的情形。 type 参数type规定了segments的存储类型,默认为UNTYPED。表1列举了IAR的ARM C/C++编译器所支持的segments类型。 -Q -Q segment = initializer_segment 作用: 自动设置segment的 拷贝初始化。链接器会产生一个新的initializer_segment(如CODE_ID),其内容与segment(如 CODE_I)完全一致。相关的符号表和调试信息都会和segment相关联(如CODE_I)。initializer_segment的 内容(通常在ROM中)必须在初始化阶段被复制到segment(通常在RAM中)。 -c -cprocessor 作用: 规定目标处理器的类型。如 -carm。
2.3 EWARM 5.xx的链接器ILINK及其配置文件.icf EWARM 5.xx中的链接器称为ILINK。ILINK可以从ELF/DWARF格式的目标文件中提取代码和数据,并生成可执行映像。在EWARM 4.xx中,基本的代码和数据链接单元是segment,而对于ELF/DWARF格式而言,基本链接单元是section。ILINK根据ILINK Configuration File(*.icf)来分配这些sections。由于XLINK与ILINK是两个完全不同的链接器,所以XCL和ICF也是两种完全不同的配置文 件。下面简要介绍ICF文件的格式和内容,以协助用户完成版本迁移。 2.4 ICF格式浅析
sections在地址空 间中的存放是由ILINK链接器来实现的,而ILINK链接器是按照用户在ICF文件中的规定来放置sections的,所以理解ICF文件的内容尤其重 要。
一个标准的ICF文件可包 括下面这些内容: 1. 可编址的存储空间(memory) 2. 不同的存储器地址区域(region) 3. 不同的地址块(block) 4. Section的初始化与否 5. Section在存储空间中的放置
下面介绍了几条ICF文件 中常见的指令,详细内容请参考ILINK相关说明文档(EWARM_DevelopmentGuide.pdf): define [ exported ] symbol name = expr; 作用: 指定某个符号的值。 参数: exported 导出该symbol,使其对可执行镜像可用 name 符号名 expr 符号值 举例: define symbol RAM_START_ADDRESS = 0x40000000; define symbol RAM_END_ADDRESS = 0x4000FFFF; define memory name with size = expr [, unit-size]; 作用: 定义一个可编址的存储地址 空间(memory)。 参数: name memory的名称 expr 地址空间的大小 unit-size expr的单位,可以是位(unitbitsize),缺省是字节(unitbytesize) 举例: define memory MEM with size = 4G; define region name = region-expr; 作用: 定义一个存储地址区域 (region)。一个区域可由一个或多个范围组成,每个范围内陆址必须连续,但几个范围之间不必是连续的。 参数: name region的名称 region-expr memory:[from expr { to expr | size expr}],可以定义起止范围,也可以定义起 始地址和region的大小 举例: define region ROM = MEM:[from 0x0 size 0x10000]; define region ROM = MEM:[from 0x0 to 0xFFFF];
define block name[ with param, param... ] { extended-selectors }; 作用: 定义一个地址块 (block);它可以是个空块,比如栈、堆;也可以包含一系列sections。 参数: name block的名称 param 可以是: size = expr (块的大小) maximum size = expr (块大小的上限) alignment = expr (最小对齐字节数) fixed order (按照固定顺序放置sections) extended-selector [ first | last ] { section-selector | block name | overlay name } first 最先存放 last 最后存放 section-selector [ section-attribute ][ section sectionname ][object filename ] section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ] sectionname section的名称 filename 目标文件的名称 即可以按照section 的属性,名称及其所在目标文件的名称这三个过滤条件中,任意选取一个条件,或选取多个条件进行组合,来圈定所要求的sections。 name block或overlay的名称 举例: define block HEAP with size = 0x1000, alignment = 4 { }; define block MYBLOCK1 = { section mysection1, section mysection2, readwrite }; define block MYBLOCK2 = { readonly object myfile2.o }; initialize { by copy | manually } [ with param, param... ] { section-selectors }; 作用: 初始化sections。 参数: by copy 在程序启动时自动执行初始化。 manually 在程序启动时不自动执行初始化。 param 可以是: packing = { none | compress1 | compress2 | auto } copy routine = functionname packing表示是否压 缩数据,缺省是auto。 functionname 表示是否使用自己的拷贝函数来取代缺省函数。 section-selector 同上 举例: initialize by copy { rw };
do not initialize { section-selectors }; 作用: 规定在程序启动时不需要初 始化的sections。一般用于__no_init声明的变量段(.noinit)。 参数: section-selector 同上 举例: do not initialize { .noinit }; place at { address memory[: expr] | start of region_expr | end of region_expr } { extended-selectors }; 作用: 把一系列sections 和blocks放置在某个具体的地址,或者一个region的开始或者结束处。 参数: memory memory的名称 expr 地址值,该地址必须在memory所定义的范围内 region_expr region的名称 extended-selector 同上 举例: place at start of ROM { section .cstart }; place at end of ROM { section .checksum }; place at address MEM:0x0 { section .intvec }; place in region-expr { extended-selectors }; 作用: 把一系列sections 和blocks放置在某个region中。sections和blocks将按任意顺序放置。 参数: region-expr region的名称 extended-selector 同上 举例: place in ROM { readonly }; /* all readonly sections */ place in RAM { readwrite }; /* all readwrite sections */ place in RAM { block HEAP, block CSTACK, block IRQ_STACK }; place in ROM { section .text object myfile.o }; /* the .text section of myfile.o */ place in ROM { readonly object myfile.o }; /* all read-only sections of myfile.o */ place in ROM { readonly data object myfile.o }; /* all read-only data sections myfile.o */ |
|