当前位置:网站首页>嵌入式系统移植【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边栏推荐
- Redis 事务学习有感
- Has the live broadcast function of the multi merchant system been used? 666 for used friends!
- 使用同一个接口实现不同登录的方式
- The author believes that the development logic of the meta universe and the Internet is quite different in Chengdu
- Three things programmers want to do most | comics
- php数组下标是不是只能从0开始
- Codeforces round 809 (Div. 2) (Questions C and D1)
- RN underlying principle -- 1. Component and purecomponent analysis
- Qt+vtk+pcl pictures are converted to grayscale images and displayed with grayscale as the Y axis
- Worthington纯化酶制剂助力新生儿心肌细胞分离系统研究
猜你喜欢
随机推荐
Qt+VTK+PCL图片转灰度图且以灰度为Y轴显示
Experiment 5 JPEG
LeetCode 第26天
PNY file to picture
RequestContextHolder
TensorRT的插件实战(1)
php数组下标是不是只能从0开始
算法面试高频题解指南【一】
Worthington羟基类固醇脱氢酶技术说明及测定方案
PIP update a package
Experiment 2 YUV
Google Earth engine app - a complete map legend app (land use classification of western United States)
树以及二叉树的常用性质以及遍历
Change this point to understand
Matlab保存数据到csv文件的方法分享
开发者分享|MindSpore Lite 体验,一键实现图像分割
数的三次方根
Live broadcast preview | live broadcast Seminar on open source security governance models and tools
C voice realizes TCP client and TCP server, and QT call test
[day 31] given an integer n, find the base and exponent of each prime factor | basic theorem of arithmetic









