文章目錄
  1. 1. 一、基础编译选项
    1. 1.1. 1.1 单源文件的编译
    2. 1.2. 1.2 多源文件的编译
    3. 1.3. 1.3 库文件的链接
  2. 2. 二、output file
    1. 2.1. 2.1 asm文件
    2. 2.2. 2.2 lst文件
    3. 2.3. 2.3 rst文件
    4. 2.4. 2.4 sym文件
    5. 2.5. 2.5 rel文件
    6. 2.6. 2.6 map文件
    7. 2.7. 2.7 mem文件
  3. 3. 总结

一、基础编译选项

1.1 单源文件的编译

假设目前有一个源文件led.c,可以用如下命令进行编译。

1
$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,只编译不链接。

1
2
3
4
$sdcc -c key.c
$sdcc -c display.c
$sdcc -c uart.c
$sdcc main.c key.rel display.rel uart.rel

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

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

1.3 库文件的链接

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

1
$sdcc -c uart.c crc.lib

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

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

使用sdcclib命令,可以将对象文件链接成lib文件。

用sdcclib -s和 sdcclib -m可以查看lib文件的符号表和函数表。

1
2
3
4
5
$sdcclib led.lib led.rel
$sdcclib project.lib led.rel display.rel key.rel

$sdcclib -s led.lib
$sdcclib -m projext.lib

二、output file

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

1
2
$ls
led.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和堆栈的使用情况。

总结

  • 单源文件的工程可以使用sdcc source.c来编译。
  • 多元文件的工程可以将源码编译成rel文件,再统一链接。
  • sdcc编译成功后会生成许多文件。
  • lst rst rel sym文件用于编译过程,如果编译没有出现问题,可以不用去看这些文件。
  • asm用于显示源文件的汇编代码,在解决一些优化及疑难问题时要去查看该文件。
  • map和mem文件可以帮助我们分析该项目对单片机存储资源的占用情况。
文章目錄
  1. 1. 一、基础编译选项
    1. 1.1. 1.1 单源文件的编译
    2. 1.2. 1.2 多源文件的编译
    3. 1.3. 1.3 库文件的链接
  2. 2. 二、output file
    1. 2.1. 2.1 asm文件
    2. 2.2. 2.2 lst文件
    3. 2.3. 2.3 rst文件
    4. 2.4. 2.4 sym文件
    5. 2.5. 2.5 rel文件
    6. 2.6. 2.6 map文件
    7. 2.7. 2.7 mem文件
  3. 3. 总结