在介绍armlink的运用办法之前,先介绍要涉及到的一些术语。
1)映像文件(image):
是指一个可履行文件,在履行的时分被加载到处理器中。一个映像文件有多个线程。它是ELF(Executableandlinkingformat)格局的。段(Section):描绘映像文件的代码或数据块。
2)RO
是Read-on
3)RW
是Read-write.的简写办法。
4)ZI
是Zero-initialized的简写办法。
5)输入段(inputsection)
它包含着代码,初始化数据或描绘了在应用程序运转之前必需求初始化为0的一段内存。
6)输出段(outputsection)
它包含了一系列具有相同的RO,RW或ZI特点的输入段。
7)域(Regions)
在一个映像文件中,一个域包含了1至3个输出段。多个域安排在一同,就构成了终究的映像文件。
8)ReadOn
它是指一个段,在这个段中代码和只读数据的地址在运转时分能够改动。
9)ReadWritePositionIndependent(RWPI)
它是指一个段,在该段中的可读/写的数据地址在运转期间能够改动。
10)加载时地址
是指映像文件坐落存储器(在该映像文件没有运转时)中的地址。
11)运转时地址
是指映像文件在运转时的地址。
二、指令语法
armlink[-help][-vsn][-partial][-outputfile][-elf][-reloc][-ro-baseaddress][-ropi][-rw-baseaddress][-rwpi][-split][-scatterfile][-debug|-nodebug][-remove?RO/RW/ZI/DBG]|-noremove][-entrylocation][-keepsection-id][-firstsection-id][-lastsection-id][-libpathpathlist][-scanlib|-noscanlib][-locals|-nolocals][-callgraph][-infotopics][-map][-symbols][-symdefsfile][-editfile][-xref][-xreffromobject(section)][-xreftoobject(section)][-errorsfile][-listfile][-verbose][-unmangled|-mangled][-matchcrossmangled][-viafile][-strict][-unresolvedsymbol][-MI|-LI|-BI][input-file-list]
上面各选项的意义分别为:
1)-help这个选项会列出在指令行中常用的一些选项操作。
2)-vsn这个选项显现出所用的armlink的版别信息。
3)-partial用这个选项创立的是部分链接的方针文件而不是可履行映像文件。
4)-outputfile这个选项指定了输出文件名,该文件或许是部分链接的方针文件,也或许是可履行映像文件。假如输出文件名没有特别指定的话,armlink将运用下面的默许:假如输出是一个可履行映像文件,则生成的输出文件名为__image.axf;假如输出是一个部分链接的方针文件,在生成的文件名为__object.o;假如没有指定输出文件的途径信息,则输出文件就在当时目录下生成。假如指定了途径信息,则所指定的途径成为输出文件的当时途径。
5)-elf这个选项生成ELF格局的映像文件,这也是armlink所支撑的仅有的一种输出格局,这是默许选项。
6)-reloc这个选项生成可重定址的映像。一个可重定址的映像具有动态的段,这个段中包含可重定址信息,运用这些信息能够在链接后,进行映像文件的从头定址;-reloc,-rw-base一同运用,可是假如没有-split选项,链接时会发生过错。
7)-ro-baseaddress这个选项将包含有RO(Read-On
8)-ropi这个选项使得包含有RO输出段的加载域和运转域是方位无关的。假如该选项没有运用,则相应的域被标记为肯定的。一般每一个只读特点的输入段有必要是只读方位无关的。假如运用了这个选项,armlink将会进行以下操作:查看各段之间的重定址是否有用;保证任何由armlink本身生成的代码是只读方位无关的。这儿期望读者留意的是,ARM东西直到armlink完成了对输入段的处理后,才能够决议终究的生成映像是否为只读方位无关的。这就意味着,即便为编译器和汇编器指定了ROPI选项,armlink也或许会发生ROPI过错信息。-
9)rw-baseaddress这个选项设置包含RW(Read/Write特点)输出段的域的运转时地址,该地址有必要是字对齐的。假如这个选项和-split选项一同运用,将设置包含RW输出段的域的加载和运转时地址都设置在address处。
10)-rwpi这个选项使得包含有RW和ZI(ZeroInitialization,初始化为0)特点的输出段的加载和运转时域为方位无关的。假如该选项没有运用,相应域标记为肯定的。这个选项要求-rw-base选项后有值,假如-rw-base没有指定的话,默许其值为0,即相当于-rw-base0。一般每一个可写的输入段有必要是可读/可写的方位无关的。假如运用了该选项,armlink会进行以下的操作:查看可读/可写特点的运转域的输入段是否设置了方位无关特点;查看在各段之间的重定址是否有用;生成根据静态寄存器sb的条目,这些在RO和RW域被复制和初始化的时分会用到。编译器并不会强制可写的数据必定要为方位无关的,这就是说,即便在为编译器和汇编器指定了RWPI选项,armlink也或许生成数据不是RWPI的信息。
11)-split这个选项将包含RO和RW特点的输出段的加载域,分割成2个加载域。一个是包含RO输出段的加载域,默许的加载地址为0x8000,可是能够用-ro-base选项设置其他的地址值,另一个加载域包含RW特点的输出段,由-rw-base选项指定加载地址,假如没有运用-rw-base选项的话,默许运用的是-rw-base0。
12)-scatterfile这个选项运用在file中包含的分组和定位信息来创立映像内存映射。留意,假如运用了该选项的话,必需求从头完成仓库初始化函数__user_initial_stackheap()。
13)-debug这个选项使输出文件包含调试信息,调试信息包含,调试输入段,符号和字符串表。这是默许的选项。
14)-nodebug这个选项使得在输出文件中不包含调试信息。生成的映像文件矮小,可是不能进行源码级的调试。armlink对在输入的方针文件和库函数中发现的任何调试输入段都不予处理,当加载映像文件到调试器中的时分,也不包含符号和字符串信息表。这个选项仅仅是对装载到调试器的映像文件的巨细有影响,可是对要下载到方针板上的二进制代码的巨细没有任何影响。假如用armlink进行部分链接生成方针文件而不是映像文件,则虽然在生成的方针文件中不含有调试输入段,可是会包含符号和字符串信息表。这儿特别请读者留意的是:假如要在链接完成后运用fromELF东西的话,不行运用-nodebug选项,这是因为假如生成的映像文件中不包含调试信息的话,则有下面的影响:fromELF不能将映像文件转换成其他格局的文件;fromELF不能生成有意义的反汇编列表。
在运用这个选项时分要留意,不要删去反常处理函数。运用-keep选项来标识反常处理函数,或用ENTRY伪指令标明是进口点。为了更准确的操控删去未运用的段,能够运用段特点约束符。能够运用以下的段特点约束符:
RO删去一切未运用的RO特点的段;
RW删去一切未运用的RW特点的段;
ZI删去一切未运用的ZI特点的段;
DBG删去一切未运用的DEBUG特点的段。
这些约束符呈现的次序是恣意的,可是它们必需求有”()”括住,多个约束符之间要用符号”/”进行距离。ADS软件中默许选项是-remove(RO/RW/ZI/DBG)。假如没有指定段特点约束符,则一切未运用的段都会被删去。因为-remove就等价于-remove(RO/RW/ZI/DBG)选项。
16)-noremove这个选项保存映像文件中一切未被运用的段。
17)-entrylocation这个选项指定映像文件中仅有的初始化进口点。一个映像文件能够包含多个进口点,运用这个指令界说的初始化进口点是存放在可履行文件的头部,以供加载程序加载时运用。当一个映像文件被装载时,ARM调试器运用这个进口点地址来初始化PC指针。初始化进口点有必要满意下面的条件:映像文件的进口点有必要坐落运转域内;运转域有必要对错掩盖的,而且有必要是固定域(就是说,加载域和运转域的地址相同)。
在这儿能够用以下的参数替代location参数:
1.进口点地址:这是一个数值,例如-entry0x0;
2.符号:该选项指定映像文件的进口点为该符号所代表的地址处,比方:
-entryint_handler表明程序进口点在符号int_handler地点处。假如该符号有多处界说存在,armlink将发生犯错信息。
-entryoffset+object(section):该选项指定在某个方针文件的段的内部的某个偏移量处为映像文件的进口地址,例如:-entry8+startup(startupseg)假如偏移量值为0,能够简写成object(section),假如输入段只要一个,则能够简化为object。
18)-keepsection-id运用该选项,能够指定保存一个输入段,这样的话,即便该输入段没有在映像文件中运用,也不会被删去。
参数section-id取下面一些格局:
1.symbol该选项指定界说symbol的输入段不会在删去未运用的段时被删去。假如映像文件中有多处symbol界说存在,则一切包含symbol界说的输入段都不会被删去。例如:-keepint_handler则一切界说int_handler的符号的段都会保存,而不被删去。为了保存一切含有以_handler结束的符号的段,能够运用如下的选项:-keep*_handler
2.object(section)这个选项指定了在删去未运用段时,保存方针文件中的section段。输入段和方针名是不区别巨细写的,例如,为了在方针文件vectors.o中保存vect段,运用:-keepvectors.o(vect)为了保存vectors.o中的一切以vec最初的段名,能够运用选项:-keepvectors.o(vec*)
3.object这个选项指定在删去未运用段时,保存该方针文件仅有的输入段。方针名是不区别巨细写的,假如运用这个选项的时分,方针文件中所含的输入段不止一个的话,armlink会给出犯错信息。比方,为了保存每一个以dsp最初的只含有仅有输入段的方针文件,能够运用如下的选项:-keepdsp*.o
19)-firstsection-id这个选项将被挑选的输入段放在运转域的开端。经过该选项,将包含复位和中断向量地址的段放置在映像文件的开端,能够用下面的参数替代section-id:
1.symbol挑选界说symbol的段。制止指定在多处界说的symbol,因为多个段不能一起放在映像文件的开端。
2.object(section)从方针文件中挑选段放在映像文件的开端方位。在方针文件和括号之间不答应存在空格,例如-firstinit.o(init)
3.object挑选只要一个输入段的方针文件。假如这个方针文件包含多个输入段,armlink会发生过错信息。用这个选项的比方如下:-firstinit.o这儿期望读者留意的是:运用-first不能改动在域中依照RO段放在开端,接着放置RW段,最终放置ZI段的根本特点排放次序。假如一个域含有RO段,则RW或ZI段就不能放在映像文件的最初。类似地,假如一个域有RO或RW段,则ZI段就不能放在文件最初。两个不同的段不能放在同一个运转时域的最初,所以运用该选项的时分只答应将一个段放在映像文件的最初。
20)-lastsection-id这个选项将所挑选的输入段放在运转域的最终。例如,用这个选项能够强制性的将包含校验和的输入段放置在RW段的最终。运用下面的参数能够替换section-id。
1.symbol挑选界说symbol的段放置在运转域的最终。不能指定一个有多处界说的symbol。运用该参数的比方如下:-lastchecksum
2.object(section)从方针文件中挑选section段。在方针文件和后边的括号间不能有空格,用该参数的比方为:-lastchecksum.o(check)
3.object挑选只要一个输入段的方针,假如该方针文件中有多个输入段,armlink会给出犯错信息。和-first选项相同,需求读者留意的是;运用-last选项不能改动在域中将RO段放在开端,接着放置RW段,最终放置ZI段的输出段根本的排放次序。假如一个域含有ZI段,则RW段不能放在最终,假如一个域含有RW或ZI段,则RO段不能放在最终。在同一个运转域中,两个不同的段不能一起放在域的最终方位。
21)-libpathpathlist这个选项为ARM规范的C和C++库指定了查找途径列表。留意,这个选项不会影响对用户库的查找途径。这个选项掩盖了环境变量ARMLIB所指定的途径。参数pathlist是一个以逗号分隔的多个途径列表,即为path1,path2,…pathn,这个途径列表仅仅用来查找要用到的ARM库函数。默许的,关于包含ARM库函数的默许途径是由环境变量ARMLIB所指定的。
22)-scanlib这个选项发动对默许库(规范ARMC和C++库)的扫描以解析引证的符号。这个选项是默许的设置。
23)-noscanlib该选项制止在链接时分扫描默许的库。
24)-locals这个选项辅导链接器在生成一个可履行映像文件的时分,将本地符号增加到输出符号信息表中。该选项是默许设置。
25)-nolocals这个选项辅导链接器在生成一个可履行映像文件的时分,不要将本地符号增加到输出符号信息表中。假如想减小输出符号表的巨细,能够运用该选项。
26)-callgraph该选项创立一个HTML格局的静态函数调用图。这个调用图给出了映像文件中一切函数的界说和引证信息。关于每一个函数它列出了:
1.函数编译时分的处理器状况(ARM状况仍是Thumb状况);
2.调用func函数的调集;
3.被func调用的函数的调集;
4.在映像文件中运用的func寻址的次数。
此外,调用图还标识了下面的函数:
1.被interworkingveneers所调用的函数;
2.在映像文件外部界说的函数;
3.答应未被界说的函数(以weak办法的引证);
静态调用图还供给了仓库运用信息,它显现出了:
1.每个函数所运用的仓库巨细;
2.在悉数的函数调用中,所用到的最大仓库巨细。
27)-infotopics这个选项打印出关于指定品种的信息,这儿的参数topics是指用逗号距离的类型标识符列表。类型标识符列表能够是下面所列出的恣意一个:
1.sizes为在映像文件中的每一个输入方针和库成员列出了代码和数据(这儿的数据包含,RO数据,RW数据,ZI数据和Debug数据)的巨细;
2.totals为输入方针文件和库,列出代码和数据(这儿的数据包含,RO数据,RW数据,ZI数据和Debug数据)总的巨细;
3.veneers给出由armlink生成的veneers的详细信息;
4.unused列出因为运用-remove选项而从映像文件中被删去的一切未运用段。留意:在信息类型标识符列表之间不能存在空格,比方能够输入-infosizes,totals可是不能是-infosizes,totals(即在逗号和totals之间有空格是不答应的)
28)-map这个选项创立映像文件的信息图。映像文件信息图包含映像文件中的每个加载域,运转域和输入段的巨细和地址,这儿的输入段还包含调试信息和链接器发生的输入段。
29)-symbols这个选项列出了链接的时分运用的每一个部分和大局符号。该符号还包含链接生成的符号。
30)-symdefsfile这个选项创立一个包含来自输出映像文件的大局符号界说的符号界说文件。默许的,一切的大局符号都写入到符号界说文件中。假如文件file现已存在,链接器将约束生成在已存在的symdefs文件中已列出的符号。假如文件file没有指明途径信息,链接器将在输出映像文件的途径查找文件。假如文件没有找到,就会在该目录下面创立文件。在链接另一个映像文件的时分,能够将符号界说文件作为链接的输入文件。
31)-editfile这个选项指定一个steering类型的文件,该文件包含用于修正输出文件中的符号信息表的指令。能够在steering文件中指定具有以下功用的指令:躲藏大局符号。运用该选项能够在方针文件中躲藏指定的大局符号。重命名大局符号。运用这个选项能够处理符号命名抵触的现象。
32)-xref该选项列出了在输入段间的一切穿插引证。
33)-xreffromobject(section)这个选项列出了从方针文件中的输入段对其他输入段的穿插引证。假如想知道某个指定的输入段中的引证状况,就能够运用该选项。
34)-xreftoobject(section)该选项列出了从其他输入段到方针文件输入段的引证。
35)-errorsfile运用该选项会将确诊信息从规范输出流重定向到文件file中。
36)-listfile该选项将-info,-map,-symbols,-xref,-xreffrom和–xrefto这几个选项的输出从头定向到文件file中。假如文件file没有指定途径信息,就会在输出途径创立该文件,该途径是输出映像文件地点的途径。
37)-verbose这个选项将有关链接操作的细节打印出来,包含所包含的方针文件和要用到的库。
38)-unmangled该选项指定链接器在由xref,-xreffrom,-xrefto,和-symbols所生成的确诊信息中显现出unmangledC++符号名。假如运用了这个选项,链接器将unmangleC++符号名以源码的办法显现出来。这个选项是默许的。
39)-mangled这个选项指定链接器显现由-xref,-xreffrom,-xrefto,和-symbols所发生的确诊信息中的mangledC++符号名。假如运用了该选项,链接器就不会unmangleC++符号名了。符号名是依照它们在方针符号表中显现的格局显现的。
40)-viafile该选项表明从文件file中读取输入文件名列表和链接器选项。在armlink指令行能够输入多个-via选项,当然,-via选项也能够不含在一个via文件中。
41)-strict这个选项告知链接器陈述或许导致过错而不是正告的条件。
42)-unresolvedsymbol这个选项将未被解析的符号指向大局符号symbol。Symbol有必要是已界说的大局符号,不然,symbol会当作一个未解析的符号,链接将以失利告终。这个选项在自上而下的开发中尤为有用,在这种状况下,经过将无法指向相应函数的引证指向一个伪函数的办法,能够测验一个部分完成的体系。该选项不会显现任何正告信息。
43)input-file-list这是一个以空格作为距离符的方针或库的列表。有一类特别的方针文件,即symdef文件,也能够包含在文件列表中,为生成的映像文件供给大局的symbol值。在输入文件列表中有两种运用库的办法。
1.指定要从库中提取并作为方针文件增加到映像文件中的特定的成员。
2.指定某库文件,链接器根据需求从其间提取成员。
armlink依照以下的次序处理输入文件列表:
1.无条件的增加方针文件
2.运用匹配形式从库中挑选成员加载到映像文件中去。例如运用下面的指令:armlinkmain.omylib(stdio.o)mylib(a*.o).将会无条件的把mylib库中一切的以字母a最初的方针文件和stdio.o在链接的时分链接到生成的映像文件中去。
3.增加为解析没有解析的引证的库到库文件列表。