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文件可以帮助我们分析该项目对单片机存储资源的占用情况。
- sdcc man阅读笔记(二)——基础编译选项&output files
- sdcc man阅读笔记(三)——c51专用编译选项
- sdcc man阅读笔记(六)——中断
- sdcc man阅读笔记(一)——sdcc 的介绍与安装
- sdcc man阅读笔记(四)——存储类型关键字
- sdcc man阅读笔记(五)——mem文件与map文件
- c++教程(二十五:Input/output with files)
- Instant Contiki 安装笔记——SDCC和CC2530
- 黑马程序员—java基础学习--IO ( Input Output )流(二)
- Git 教程(一) 基本的 git 版本控制——根据 git man page 阅读笔记整理
- 阅读笔记(二)
- Go编译选项(笔记)
- SDCC Linux编译
- 文件输入输出(Input/Output with files)
- 鸟哥Linux私房菜(基础篇)——第五章:首次登入与在线求助 man page笔记
- 黑马程序员——IO(Input Output)流(二)
- 论文阅读笔记(二)
- javascript_core阅读笔记(二)
- ERROR 1146 (42S02): Table 'mysql.slow_log' doesn't exist
- 获取inflater 的三种方式
- 使用wrapper将java程序安装成windows服务(摘)
- 八数码问题
- C++ 初始化列表
- sdcc man阅读笔记(二)——基础编译选项&output files
- CentOS上安装GitLab
- runnable和thread的区别以及run和start的区别(多线程)
- 自定义eclipse一行显示字符串的数目
- MS Server, MySql,Oracle数据库的区别
- C# 文件正由另一进程使用,该进程无法访问该文件
- eclipse设置字体大小
- yum安装mongodb
- iOS图片AVMakeRectWithAspectRatioInsideRect妙用