sdcc man阅读笔记(二)——基础编译选项&output files

来源:互联网 发布:低头族数据统计 编辑:程序博客网 时间:2024/06/06 09:57

一、基础编译选项

1.1 单源文件的编译

假设目前有一个源文件led.c,用来控制开发板做流水灯循环,可以用如下命令进行编译。

$sdcc led.c

编译完之后发现目录下好多生成的编译文件。其中led.rel是类似gcc中的led.o这样用于链接的对象文件,有所不同的是,led.rel中并不包含链接用的汇编代码,它包含在led.lst中。而led.ihx是用来烧写的hex文件,它的格式是intel hex规范。实际用于烧写的文件格式要根据烧写工具来定制,这一点之后再研究。

1.2 多源文件的编译

在另外一个项目中,共有4个源文件。key.c用来控制矩阵键盘,display.c用来操作点阵屏,uart.c用来实现串行通信,而main.c用来统一调用其他源文件里的函数。这几个源文件编译的方法是先将源文件编译成库,然后再统一链接。使用编译选项 -c 表示complier only,只编译不链接。

$sdcc -c key.c$sdcc -c display.c$sdcc -c uart.c$sdcc main.c key.rel display.rel uart.rel

当然也可以将最后一条命令这样做,统一编译成库在写makefile时会更方便。

$sdcc -c main.c$sdcc main.rel key.rel display.rel uart.rel

1.3 库文件的链接

在上述的项目里,uart.c的其中一个函数用到了crc校验,它的函数原型在另外的crc.lib库文件中,编译的时候要额外链接该库文件。

$sdcc -c uart.c crc.lib

如果库文件不在当前目录要用 -L 选项制定目录

$sdcc -c uart.c -L /usr/crc.lib

将对象文件链接成目标文件,使用sdcclib命令。用sdcclib -s和 sdcclib -m可以查看lib文件的符号表和函数表。

$sdcclib led.lib led.rel$sdcclib project.lib led.rel display.rel key.rel

二、output file

使用sdcc led.c后发现目录下一大堆编译生成的文件,来看看这些文件都是用来做什么的。

$lsled.asm led.lst led.rst led.sym led.rel led.map led.mem

2.1 asm文件

由complier创建,是c源码文件编译成汇编后的结果。在分析一些具体问题的时候,可能会需要去查看编译出来的汇编指令。

2.2 lst文件

由assembler创建,我对比了同一个源文件生成的lst文件和asm文件,两者差不多。不同的是lst在行首有每一行的相对地址,而asm则没有,但asm有用标示符来标示一些用于跳转的地址,方便我们查看。

2.3 rst文件

由linker创建,它和lst的文件的区别是,lst行首的相对地址变更成了链接时使用的地址,将一些栈区与堆区的地址加入了文件,使原文件的指令地址发生了偏移。

2.4 sym文件

由assembler创建,该文件包含的是当前源文件的符号表。

2.5 rel文件

由assembler创建,该文件被用于链接。

2.6 map文件

由linker创建,该文件包含有最终生成的目标文件的地址图,标明了所有函数在最终目标文件里的位置,以及是从哪个模块链接过来的。

2.7 mem文件

该文件里显示目标文件运行时RAM和堆栈的使用情况。

2.8 output file 小结

sdcc会生成一大堆output文件。

lst rst rel sym文件用于编译过程,如果编译没有出现问题,可以不用去看这些文件。

asm用于显示源文件的汇编代码,在解决一些优化及疑难问题时要去查看该文件。

map和mem文件可以帮助我们分析该项目对单片机存储资源的占用情况。

0 0
原创粉丝点击