嵌入式开发之Linux系统移植5-交叉编译工具链
1.交叉编译
1.1.编译原理
-
机器码(二进制)是处理器能直接识别的语言,不同的机器码代表不同的运算指令,处理器能够识别哪些机器码是由处理器的硬件设计所决定的,不同的处理器机器码不同,所以机器码不可移植
-
汇编语言是机器码的符号化,即汇编就是用一个符号来代替一条机器码,所以不同的处理器汇编也不一样,即汇编语言也不可移植
-
C语言在编译时我们可以使用不同的编译器将C源码编译成不同架构处理器的汇编,所以C语言可以移植
1.2.GCC编译过程
- 程序的编译和运行不在同一台机器上
Ubuntu上进行编辑和编译,开发板上运行。
1.3.交叉编译工具链
- 交叉编译工具链的获取:
- 官网获取(不推荐,需要自己进行复杂配置与编译)
http://ftp.gnu.org/gnu/gcc/ - BSP板级开发支持包(推荐)
samsung、全志…
- 官网获取(不推荐,需要自己进行复杂配置与编译)
- 交叉编译工具链的内容
- 交叉编译工具
gcc/readelf/size/nm/strip/objcopy/objdump/addr2line - 库
ARM架构的库
- 交叉编译工具
2.ELF文件格式
2.1.ELF文件格式
- ELF
ELF格式是Linux平台上应用最广泛的二进制工业标准之一
ELF格式的文件内包含了很多个段不同的段存储了不同的信息;因为ELF格式的文件要通过Linux系统的加载和管理才能运行,所以除了最基本的代码段和数据段之外,其中还存储了很多其它的信息,如符号表、调试信息等
2.2.ELF文件相关命令
-
file
file + 文件名 查看文件的详细信息 -
readelf
readelf -h + 文件名 列出elf文件的头部信息
readelf -a + 文件名 列出elf文件的所有信息
2.3.BIN文件格式
- BIN
BIN文件一般是直接运行在CPU之上
的可执行文件,文件内只包含了CPU能够直接识别和运行的指令和数据,不包含其它系统相关的信息
3.交叉编译工具链常用工具
-
size 列出目标文件每一段的大小以及总体的大小
size + 文件名 -
nm 列出目标文件中的符号表(标示符)
nm + 文件名 -
strip 丢弃目标文件中的符号
strip + 文件名
注:对于嵌入式开发,这个命令很重要 -
objdump 从目标文件中显示信息
eg:
objdump -d + 文件名 将目标文件反汇编(机器码->汇编) -
objcopy 对目标文件进行复制和转换
eg:
objcopy --gap-fill=0xff -O binary a.out a.bin
将目标文件转换为bin格式
4.解交叉编译工具链的安装方法与使用
4.1.安装交叉编译工具链
- 在 ubuntu 下打开一个终端并进入到家目录 cd ~
- 在家目录下创建“Linux_4412/toolchain”目录用于存放交叉编译工具链
$ mkdir -p Linux_4412/toolchain
$ cd Linux_4412/toolchain/
- 将资料中“1.交叉编译工具链”下的 gcc-4.6.4.tar 拷贝到该目录下,并解压
$ tar xvf gcc-4.6.4.tar.xz
4.2.将交叉编译工具链添加到全局环境变量使其全局可用
- 打开家目录下的配置文件“.bashrc” 重启配置文件使配置生效
$ cd ~
$ vi .bashrc
$ source ~/.bashrc
如图在配置文件的最后一行添加如下内容,将交叉编译工具链的安装路径添加到了全 局环境变量中,然后保存退出 注:每个人 ubuntu 所使用的用户名可能不同,所以家目录的路径可能有差异,这里根 据自己的实际情况进行设置
- 执行以下命令
$ arm-none-linux-gnueabi-gcc -v
- 注:若使用的是 ubuntu 16.04 或更高的版本(64 位 ubuntu),需要安装 32 位库
$ sudo apt-get install lib32z1 lib32ncurses5
- 点赞
- 收藏
- 关注作者
评论(0)