linker与loader,x86与单片机

来源:互联网 发布:3d打印算法arduino 编辑:程序博客网 时间:2024/04/29 03:03

linker主要完成的工作:
        重定位:目标模块被创建时假设的目标地址都从0开始,linker把同名的section合并起来,然后为各个section规划run-time时刻的地址。linker假设run-time时刻的开始地址也是从0开始。
        符号解析:处理多个模块之间符号的引用。

loader主要完成的工作:
        程序加载:linker生成的可运行文件(如ELF, COFF)中,已经包含了各个section的运行地址、在文件中的位置(offset)和section的属性(read, write等)等信息,loader根据这些信息将各个段拷贝到指定的内存中准备运行。
        重定位:loader在加载时有可能进行再一次重定位,最终确定程序在run-time时刻的绝对地址。注意linker总是假设run-time空间是从0开始的。

x86与单片机之间linker和loader的不同:
        对于x86与mcu,linker的作用基本是一样的,但loader有较大不同。在x86中,loader就是从外存(如硬盘)中将可执行文件的各个段拷贝或map的内存中,但对于单片机有几点不同:一是很多都是裸机运行的,根本没有loader;二是很多情况下代码是直接在flash或rom中运行的,不需拷贝,只有已初始化数据段需要拷贝到ram中,未初始化数据段则清0;第三,elf和coff格式是有文件头的,文件最开头并非指令,而单片机一般是从0地址开始执行,所以在没有loader的情况下,elf或coff直接烧入flash或rom是无法运行的。

        没有了loader,那么loader该做的这些事由谁来做呢?答案是,对于第二点,编译器会加入startup代码来完成这些事情。例如PIC的编译器PICC,会在c代码中加入一段"run-time startup"代码,来完成拷贝数据和清零RAM的工作。这段代码在picc的source目录的picrt66x.as文件中。对于第三点,一般是由hex转换工具来将elf或coff转换成hex文件,hex转换工具相当于做了部分loading的工作,根据section的run-time地址来安排程序烧写在flash中的地址。当然比实际loading要简单,因为hex文件本身可以指定烧写的地址。这样一来,烧写到flash或rom中的程序,就是已经完成了一半loading的了。对于代码段,就是已经ready to run了,而对于数据段,就用前面第二点的方法来完成加载。

        对于TI的c6000系列,因为支持多种启动方式(ROM,HPI等),好象ccs并没有自动加入startup代码来做这些loader的工作,必须要自己写一段loader代码加入project中。
原创粉丝点击