当前位置:网站首页>嵌入式系统移植【5】——交叉编译工具链
嵌入式系统移植【5】——交叉编译工具链
2022-07-22 22:24:00 【imysy_22_】
此前我们学习了Linux的移植方式,但其中Linux内核、设备树和根文件系统的文件都是直接提供给我们的,后续我们将学习“uImage”、“exynos4412-fs4412.dtb”和“ramdisk.img”的由来。
编译原理
首先,我们再来回顾一下编译的原理,编译原理如果搞不明白,后续的学习将会很困难。

机器码(二进制):
CPU能直接识别的语言,不同的机器码代表不同的运算指令。处理器能够识别哪些机器码是由处理器的硬件设计所决定的,不同的处理器机器码不同,所以机器码不可移植。最原始的程序就是机器码。
汇编:
所谓汇编语言,就是机器码的符号化,说白了就是用一个符号一 一对应地代替一个机器码。不同的处理器汇编也不一样,即汇编语言也不可移植。
C语言:
在编译时我们可以使用不同的编译器将C源码编译成不同架构处理器的汇编,所以C语言可以移植。
在Ubuntu下,最常使用的编译器就是GCC。

交叉编译
交叉编译其实是个很大的范畴,在我们这里的交叉编译是指程序的编译和运行不在同一台机器上

注:需要在提前Ubuntu上装一个ARM的编译器。
交叉编译工具链
1) 官网获取(不推荐,需要自己进行复杂配置与编译)
http://ftp.gnu.org/gnu/gcc/
2) BSP板级开发支持包(厂商所提供的配置好的,推荐)
samsung、全志...
1) 交叉编译工具
gcc/readelf/size/nm/strip/objcopy/objdump/addr2line

2) 库
ARM架构的库

ELF文件格式
ELF格式是Linux平台上应用最广泛的二进制工业标准之一
我们在linux生成的可执行性文件就是ELF格式。ELF格式的文件内包含了很多个段不同的段存储了不同的信息;因为ELF格式的文件要通过Linux系统的加载和管理才能运行,所以除了最基本的代码段和数据段之外,其中还存储了很多其它的信息,如符号表、调试信息等。

ELF文件相关命令:
file
file + 文件名 查看文件的详细信息
readelf
readelf -h + 文件名 列出elf文件的头部信息
readelf -a + 文件名 列出elf文件的所有信息
BIN文件格式

BIN文件一般是直接运行在CPU之上的可执行文件,文件内只包含了CPU能够直接识别和运行的指令和数据,不包含其它系统相关的信息。
交叉编译工具链常用工具
size 列出目标文件每一段的大小以及总体的大小
size + 文件名
汇编指令所生成的机器码在text段;已初始化的变量在data段;初始化的变量存在bass段。


nm 列出目标文件中的符号表(标示符)
nm + 文件名

注:可以用nm命令看库中的函数
strip 丢弃目标文件中的符号(瘦身命令)
strip + 文件名
符号表对程序的执行来说没有任何意义,删去符号表,减小所需的内存空间。
![]()
注:对于嵌入式开发,这个命令很重要
①file + 文件名命令可以看出文件是否已被执行过strip命令。
②arm-none-linux-gnueabi-gcc编译可执行文件的要用arm-none-linux-gnueabi-strip瘦身。
objdump 从目标文件中显示信息
eg:
objdump -d + 文件名 将目标文件反汇编(机器码->汇编)
注:虽然可以用机器码反推出汇编,但不能用汇编反推出C语言,因为C语言与汇编指令并不是一一对应的
objcopy 对目标文件进行复制和转换
eg:
objcopy --gap-fill=0xff -O binary a.out a.bin
将目标文件转换为bin格式,用于在裸机上运行程序。原理是将目标文件的代码段和数据段copy出来生成bin格式的文件。
拓展:裸机开发生成.bin格式目标文件的Makefile代码参考
led.bin:led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:
rm -rf *.o led.bin led.elf led.dis边栏推荐
- 昇思易点通 | 经典卷积神经网络的深度学习解析
- C#中C/S端如何实现WebService服务
- 实验三 LZW
- Solution to the second game of 2022 Hangzhou Electric Multi school league
- 张宇高数30讲总结
- How to open the file in keil is the real path in the 109th blog of fledgling Xiao Li
- 原生js实现dom的获取及操作
- Google Earth Engine APP——一个完整的地图图例APP(美国西部土地利用分类)
- 1.10 API and string
- ProSci LAG3抗体:改善体外研究,助力癌症免疫治疗
猜你喜欢

轻松带你走进turtle绘图的大门

读书笔记->统计学】12-02 置信区间的构建-t分布概念简介

Fault tolerant processing with hystrix

来,滑动到下一个小姐姐
![[reading notes > statistics] 12-01 construction of confidence interval - Introduction to the concept of confidence interval](/img/27/0431eeedbffdba1bdf4bb015082219.png)
[reading notes > statistics] 12-01 construction of confidence interval - Introduction to the concept of confidence interval

Fledgling Xiao Li's 108th blog binary print

93.(leaflet篇)leaflet态势标绘-进攻方向修改

Niuke Xiaobai month race 53

数据脱敏的场景与价值【总结】

数据库基础及安装
随机推荐
Redis 事务学习有感
Storage structure and method of graph (I)
Example analysis of SQL error reporting and blind injection
pip更新一个package
Yolov5 post-processing code of cpu/gpu (CUDA) version
高精度移相(MCP41xx)程序stm32F103,F407通用,更改引脚即可(SPI软件模拟通信)
挖财和启牛都是干什么的开户安全吗?
互联网流量编排方案
开发者分享|MindSpore Lite 体验,一键实现图像分割
It can't be true? Nailing has been downloaded. Don't you know you can play like this?
General, special and hidden attributes of the file (instance generates animation)
MSG | 开源与结缘,昇思携梦前行!
This is not a true sense of the meta universe, which should have its own distinctive characteristics and unique development logic
Etcdv3 · watch operation implementation and relevant key instructions
Go 语言的 RSA 用秘钥解析JSEncrypt.js 这个库加密的密文失败
Celebrity interview | various strange current situations in the open source community -- night sky Book Chen Zili tison
[reading notes > statistics] 12-01 construction of confidence interval - Introduction to the concept of confidence interval
Spark疑难杂症排查-Premature EOF: no length prefix available
Can PHP split arrays
Building a sylixos environment in VMWare