编译裸机程序以及交叉工具链

Posted 郭润

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译裸机程序以及交叉工具链相关的知识,希望对你有一定的参考价值。

把链接器脚本led.lds、源文件led.S以及Makefile给出

1、arm-linux-gcc -g -c led.S -o led.o 编译不链接且包含调试信息

2、arm-linux-ld -Tled.lds -o led.elf led.o 使用链接器脚本led.lds来进行链接

3、arm-linux-objcopy -O binary led.elf led.bin 将elf格式转换为bin

4、将生成的.bin文件烧写到开发板。

 

交叉工具链

1、交叉编译器

arm-linux-gcc -static hello.c -o hello

2、交叉链接器

arm-linux-ld -Tled.lds -o led.elf led.o

3、elf文件工具

arm-linux-readelf -a led.elf 其中-a是查看全部信息:包括大小端、运行平台等

arm-linux-readelf -d led查看led文件运行时所需要的库

4、反汇编器

arm-linux-objdump -D -S hello > dump

注意:gcc寻找头文件是在/usr/include/stdio.h。而arm-linux-gcc 头文件:/usr/local/arm/4.3.2/bin/

5、文件格式转换器

arm-linux-objcopy -O binary led.elf led.bin

 

注意:arm-linux-gcc 与arm-linux-ld生成的文件都是.elf格式的,不能直接运行于ARM上。

Makefile文件的构成‘

规则:用于说明如何生成目标文件

targets : prerequisites

    command(要使用TAB空格键)

以上 组成一个规则

伪目标使用关键字:

.PHONY:clean----表明clean为伪目标。

最终目标:如果用户没有指定执行某一条规则,make会默认执行makefile中的第一条规则,而这条规则中的目标称之为最终目标。

make +目标名字:会产生出生成的目标----执行单独规则。

---变量

使用变量前:

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)

    gcc app1.o $(obj) -o app1

app2:app2.o $(obj)

    gcc app2.o $(obj) -o app2

可以直接使用系统已经默认好的变量

$^:代表所有的依赖文件

[email protected]:表示目标

$<:代表第一个依赖文件

通用规则

%.o:%.S

arm-linux-gcc -g -o [email protected] -c $^

去回显:在命令前加上@符号(makefile文件里写)

make命令默认使用makefile或Makefile,而工程文件都不是二者时,使用make -f 文件名

以上是关于编译裸机程序以及交叉工具链的主要内容,如果未能解决你的问题,请参考以下文章

裸机实验预备---在虚拟机中搭建嵌入式开发环境

1.裸机开发环境的体验(Redhat 6.4 + vbox)

2.交叉工具链

ok6410[000] 搭建裸机开发环境

ARM开发工具软件命令具体解释---嵌入式回归第三篇

_Embedded-System专栏文章导航与优秀笔记整理(2021.08.08更新)