裸机开发流程
1.编写裸机程序;
2.调试裸机程序;
3.生成2进制映像(编译、链接、格式转换);
4.烧写/运行2进制映像。
嵌入式开发模型——交叉开发
在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。
常用交叉工具
1、交叉编译器,arm-linux-gcc;
2、交叉链接器,arm-linux-ld;
3、交叉转换器,arm-linux-readelf;
4、交叉ELF文件工具,arm-linux-objdump;
5、交叉反汇编器,arm-linux-objcopy。
Makefile用途
使用GNU Make工具来管理工程是每个Linux工程师必须掌握的技能。
Make能够使整个程序的编译、链接只需要一个命令(make)就可以完成。
Make的工作主要依赖于一个叫为Makefile的文件。Makefile文件描述了整个程序的编译,链接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译,如何最后产生我们想要得可执行文件。
makefile由规则和变量构成。
Makefile中最重要的组成部分是“规则”。
规则:用于说明如何生成目标文件,规则的格式如下:
targets:prerequisites
command
目标 依赖 命令
特别提醒:命令需要使用[TAB]健空格
led.bin:led.o
arm-linux-ld -Tled.lds -o led.elf led.o
Makefile中把那些只包含命令,没有任何依赖的目标称为“为目标”(phony targets).
.PHONY:clean
clean:
rm -f hello main.o func.o
“.PHONY”将“clean”目标声明为伪目标。
Makefile构成——最终目标
1、当一个makefile中有多条规则时,如何单独执行某条规则?
2、如果用户没有指定执行某一条规则,make会默认执行makefile中的第1条规则,而这条规则中的目标称为:最终目标。
Makefile规则——变量
使用变量前:
app1:app1.o func1.o func2.o
gcc app1.o func1.o func2.o -o app1
app2:app2.o func1.o func2.o
gcc app2.o func1.o func2.o -o app2
使用变量后
obj=func1.o func2.o
app1:app1.o
(obj)gccapp1.o
(obj) -o appl
app2:app2.o
(obj)gccapp2.o
(obj) -o app2
Makefile规则——变量
在makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量。
:代表所有的依赖文件
@:代表目标
<:代表第一个依赖文件使用前led.o:led.Sarm−linux−gcc−g−oled.o−cled.S使用后:led.o:led.Sarm−linux−gcc−g−o
<script type="math/tex" id="MathJax-Element-456"><:代表第一个依赖文件 使用前 led.o :led.S arm-linux-gcc -g -o led.o -c led.S 使用后: led.o :led.S arm-linux-gcc -g -o </script>@ -c $^
Makefile中“#”字符后的内容被视作注释
“`
hello:hello.c
@gcc hello.c -o hello
@:取消回显
make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:
make -f 文件名
链接器脚本——段
一个可执行程序通常是由:代码段,数据段,bss段构成的。同样,在用于链接这个程序的链接器脚本中,就会反应出这几个段的信息。
创建链接器脚本———段信息
1、基本构成:段
2、设置起始链接地址
3、对齐设置
4、使用变量
5、设置代码段首文件