DSP编程技巧之13-揭开编译器神秘面纱之链接器的基本选项
时间:07-25 10:40 阅读:1183次
*温馨提示:点击图片可以放大观看高清大图
简介:在我们对DSP编程的时候,相信没有人会把所有的代码都放在同一个源文件里面:光各种寄存器的初始化代码就有几百上千行了,再加上我们自己书写的代码,想想假如一个.c文件里面有一万行,该如何管理、调试呢?所以要按照功能、寄存器分类等进行划分,这样一个工程就包含了很多的头文件、源程序等等,每个源程序经过编译、汇编之后都会产生单独的目标文件。因为对于程序的任何一点修改,都需要编译器进行编译······
在我们对DSP编程的时候,相信没有人会把所有的代码都放在同一个源文件里面:光各种寄存器的初始化代码就有几百上千行了,再加上我们自己书写的代码,想想假如一个.c文件里面有一万行,该如何管理、调试呢?所以要按照功能、寄存器分类等进行划分,这样一个工程就包含了很多的头文件、源程序等等,每个源程序经过编译、汇编之后都会产生单独的目标文件。因为对于程序的任何一点修改,都需要编译器进行编译,如果每次都把所有的程序进行重新编译的话,是对时间和资源的极大浪费:特别是那些基于Eclipse的编译环境,因为基于Java这样的技术,本身就很慢,如果一次编译的文件很多,编译过程是非常痛苦的等待,甚至经常怀疑编译环境是不是已经挂掉了?所以为了提高效率,我们可以使用增量编译技术只对有修改的文件进行重新编译和汇编,而没有修改的则不需要更新目标文件。但是因为编译器和汇编器对每个源文件是单独汇编的,它们并不知道某个模块中的数据和程序相对于另一个模块而言,具体位置在哪里,所以接下来我们就需要使用链接器把所有的目标文件给“拼接”起来,最终生成一个可以独立运行的文件,即可执行文件。它的功能包括三个主要的步骤:
(1)将代码和数据放入“假想”中的内存:链接器基于.cmd文件中对存储器地址的划分,按照不同的段把代码和数据分别装入对应的地址中;当然这完全是在电脑上完成的,不需要实际的DSP和RAM“出面”。
(2)为数据和指令分配内存地址:最简单的例子,为函数中断的入口制定一个地址,这样在进中断的时候,程序指针直接跳转到中断入口的地址就行了。
(3)修改内部和外部的引用:链接器使用每个目标文件中的重定位信息和符号表,来解析某个目标文件中未定义的符号,因为它有可能是在别的目标文件中定义的。
为了更好地理解链接器的行为,我们就需要了解一下它的配置选项。链接器的配置选项也很多,但是和程序优化的那些选项相比,其含义要更容易理解一些。表1是链接器的最基本选项,定义了链接器正常工作所必须的参数。
链接器的文件搜索选项则是链接器用来寻找文件时使用的,例如查找某个和FPU运行有关的浮点库函数,如表2所示。