-mangled
这个选项指定链接器显示由-xref,-xreffrom,-xrefto,和-symbols所产生的诊断信息中的mangled C++符号名。如果使用了该选项,链接器就不会unmangle C++符号名了。符号名是按照它们在目标符号表中显示的格式显示的。
-via file
该选项表示从文件file中读取输入文件名列表和链接器选项。
在armlink命令行可以输入多个-via选项,当然,-via选项也能够不含在一个via文件中。
-strict
这个选项告诉链接器报告可能导致错误而不是警告的条件。
-unresolved symbol
这个选项将未被解析的符号指向全局符号symbol。Symbol必须是已定义的全局符号,否则,symbol会当作一个未解析的符号,链接将以失败告终。这个选项在自上而下的开发中尤为有用,在这种情况下,通过将无法指向相应函数的引用指向一个伪函数的方法,可以测试一个部分实现的系统。
该选项不会显示任何警告信息。
input-file-list
这是一个以空格作为间隔符的目标或库的列表。
有一类特殊的目标文件,即symdef文件,也可以包含在文件列表中,为生成的映像文件提供全局的symbol值。
在输入文件列表中有两种使用库的方法。
1. 指定要从库中提取并作为目标文件添加到映像文件中的特定的成员。
2. 指定某库文件,链接器根据需要从其中提取成员。
armlink按照以下的顺序处理输入文件列表:
1. 无条件的添加目标文件
2. 使用匹配模式从库中选择成员加载到映像文件中去。例如使用下面的命令:
armlink main.o mylib(stdio.o) mylib(a*.o).
将会无条件的把mylib库中所有的以字母a开头的目标文件和stdio.o在链接的时候链接到生成的映像文件中去。
3. 添加为解析尚未解析的引用的库到库文件列表。
8.1.2 ARM运行时库
本小节为读者介绍一下ARM C/C++库方面的相关内容。
8.1.2.1 运行时库类型和建立选项
ADS提供以下的运行时库来支持被编译的C和C++代码:
ANSI C库函数:
这个C函数库是由以下几部分组成:
1. 在ISO C标准中定义的函数;
2. 在semihosted环境下(semihosting是针对ARM目标机的一种机制,它能够根据应用程序代码的输入/输出请求,与运行有调试功能的主机通讯。这种技术允许主机为通常没有输入和输出功能的目标硬件提供主机资源)用来实现C库函数的与目标相关的函数;
3. 被C和C++编译器所调用的支持函数。
ARM C 库提供了额外的一些部件支持C++,并为不同的结构体系和处理器编译代码。
C++库函数:
C++库函数包含由ISO C++库标准定义的函数。C++库依赖于相应的C库实现与特定目标相关的部分,在C++库的内部本身是不包含与目标相关的部分。这个库是由以下几部分组成的:
1. 版本为2.01.01的Rogue Wave Standard C++库;
2. C++编译器使用的支持函数;
3. Rogue Wave库所不支持的其他的C++函数。
正如上面所说,ANSI C库使用标准的ARM semihosted 环境提供例如,文件输入/输出的功能。Semihosting是由已定义的软件中断(Software Interrupt)操作来实现的。在大多数的情况下,semihosting SWI是被库函数内部的代码所触发,用于调试的代理程序处理SWI异常。调试代理程序为主机提供所需要的通信。Semihosted被ARMulator ,Angel和Multi-ICE所支持。用户可以使用在ADS软件中的ARM开发工具去开发用户应用程序,然后在ARMulator或在一个开发板上运行和调试该程序。
用户可以把C库中的与目标相关的函数作为自己应用程序中的一部分,重新进行代码的实现。这就为用户带来了极大的方便,用户可以根据自己的执行环境,适当的裁剪C库函数。
除此之外,用户还可以针对自己的应用程序的要求,对与目标无关的库函数进行适当的裁剪。
在C库中有很多函数是独立于其他函数的,并且与目标硬件没有任何依赖关系。对于这类函数,用户可以很容易地从汇编代码中使用它们。
在建立自己的用户应用程序的时候,用户必须指定一些最基本的操作选项。例如:
字节顺序,是大端模式(big endian:字数据的高字节存放在低地址,低字节存放在高地址),还是小端模式(little endian:字数据的高字节存放在高地址,低字节存放在低地址);
浮点支持:可能是FPA,VFP,软件浮点处理或不支持浮点运算;
堆栈限制:是否检查堆栈溢出;
位置无关(PID):数据是从与位置无关的代码还是从与位置相关的代码中读/写,代码是位置无关的只读代码还是位置相关的的只读代码。
当用户对汇编程序,C程序或C++程序进行链接的时候,链接器会根据在建立时所指定的选项,选择适当的C或C++运行时库的类型。选项各种不同组合都有一个相应的ANSI C库类型。
8.1.2.2 库路径结构
库路径是在ADS软件安装路径的lib目录下的两个子目录。假设,ADS软件安装在e:\arm\adsv1_2目录,则在e:\arm\adsv1_2\lib目录下的两个子目录armlib和cpplib是ARM的库所在的路径。
armlib
这个子目录包含了ARM C 库,浮点代数运算库,数学库等各类库函数。与这些库相应的头文件在e:\arm\adsv1_2\include目录中。
cpplib
这个子目录包含了Rogue Wave C++库和C++支持函数库。Rogue Wave C++库和C++支持函数库合在一起被称为ARM C++库。与这些库相应的头文件安装在e:\arm\adsv1_2\include目录下。
环境变量ARMLIB必须被设置成指向库路径。另外一种指定ARM C和ARM C++库路径的方法是,在链接的时候使用操作选项-libpath directory(directory代表库所在的路径),来指明要装载的库的路径。
无需对armlib和cpplib这两个库路径分开指明,链接器会自动从用户所指明的库路径中找出这两个子目录。
这里需要让读者特别注意的以下几点:
1. ARM C库函数是以二进制格式提供的;
2. ARM 库函数禁止修改。如果读者想对库函数创建新的实现的话,可以把这个新的函数编译成目标文件,然后在链接的时候把它包含进来。这样在链接的时候,使用的是新的函数实现而不是原来的库函数。
3. 通常情况下,为了创建依赖于目标的应用程序,在ANSI C库中只有很少的几个函数需要实现重建。
4. Rogue Wave Standard C++函数库的源代码不是免费发布的,可以从Rogue Wave Software Inc.,或ARM公司通过支付许可证费用来获得源文件。