交叉编译器和Makefile

交叉编译器

交叉编译器介绍

嵌入式开发一般都是在x86平台下开发,而编译出来的软件要在arm平台上跑,所以需要交叉编译器,交叉的意思就是在一个架构上编译出另一个架构的代码。arm平台一般资源有限,不适合做开发。

arm交叉编译工具链

1.1 arm-none-eabi
即 ARM architecture,no vendor,not target an operaTIng system,complies with the ARM EABI 是不支持操作系统的,自然无法使用那些跟操作系统关系密切的函数,比如 fork(2)。该工具链使用的是 newlib 这个专用于嵌入式系统的 C 库。

主要用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot,kernel,不适用编译 Linux 应用 ApplicaTIon),一般适合 ARM7,Cortex-M 和 Cortex-R 内核架构的芯片开发使用,所以不支持与操作系统关系密切的函数。
常用编译器:arm-none-eabi-gcc ,arm-none-eabi-g++

1.2 arm-none-linux-gnueabi-gcc
即 ARM architecture, no vendor, creates binaries that run on the Linux operaTIng system, and uses the GNU EABI
主要用于编译基于 ARM 架构的 Linux 系统,可用于编译 ARM 架构的 u-boot,Linux 内核,Linux 应用等。arm-none-linux-gnueabi 基于 GCC,使用 Glibc 库,经过 Codesourcery 公司优化过推出的编译器。arm-none-linux-gnueabi-xxx 交叉编译工具的浮点运算非常优秀。一般 ARM9,ARM11,Cortex-A 内核架构芯片,支持 Linux 操作系统的会用到这个工具链。

1.3 arm-eabi-gcc
用于 Android ARM 的编译器。

1.4 armcc
ARM 公司推出的编译工具,功能和 arm-none-eabi 类似,可以编译裸机程序(u-boot,kernel),但是无法编译 Linux 应用程序。armcc 一般和 ARM 开发工具集成在一起(即打造成 IDE),例如 Keil MDK,ADS,RVDS 和 DS-5 中的编译器都是集成 armcc 工具链,所以集成 armcc 编译器都是收费的。

1.5 ABI 和 EABI
在编译工具链的命名中总能看到 eabi,这到底是什么意思呢。

ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。

EABI: 嵌入式 ABI。嵌入式应用二进制接口指定了文件格式,数据类型,寄存器使用,堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。

区别: ABI 应用于标准计算机,EABI 应用于是嵌入式计算机(如ARM,MIPS 等)。

原文链接:交叉编译器详解

交叉编译器安装

安装arm-none-eabi

sudo apt-get install gcc-arm-none-eabi

安装成功 arm-none-eabi-gcc -v 获取版本正常。

编译过程

请添加图片描述
1.预处理:预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多

arm-none-eabi-gcc -E main.c -o main.i

2.编译:将预处理之后的程序转换为特定的汇编代码 (assembly code) 的过程。

arm-none-eabi-gcc -S main.i -o main.s

3.汇编:汇编过程将上一步的汇编代码转成机器码(machine code),这一步产生的文件叫 目标文件 ,是二进制格式

main.o

arm-none-eabi-gcc -c main.s -o main.o

startup_stm32f10x_md.o

arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m3 -g -Wa,--warn -o startup_stm32f10x_md.o startup_stm32f10x_md.s

4.链接:链接过程将多个目标文件以及所需的库文件( .so 等)链接成最终可执行文件(executable file)

arm-none-eabi-gcc -o test.elf main.o startup_stm32f10x_md.o -mthumb -mcpu=cortex-m3 -T stm32_flash.ld -specs=nosys.specs -static -Wl,-cref,-u,Reset_Handler -Wl,-Map=test.map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group

5.生成hex文件:此工具将链接器生成的文件转化为 .bin/.hex 等烧写的格式,用以下载进入单片机,命令如下

arm-none-eabi-objcopy test.elf -Oihex test.hex

6.反汇编:将二进制可执行文件反向转换为汇编代码

arm-none-eabi-objdump -D -S test.elf > test.dis

Makefile

参考链接Makefile

  • 51
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值