文章目录
前言
这是使用的开发板是基于百问网的STM32MP157开发板进行测试。
交叉编译工具集的介绍
在我们安装交叉编译链的同时,也安装了我们的交叉编译工具集。也就是一些非常实用的编译工具(指令)可以帮助我们开发和调试。
如下
下面我们就对这些常用的工具集来进行介绍
将开发板进入到U-Boot模式
我这里是使用STM32MP157开发板是在开发板上电后一直按空格键进入U-Boot模式
readelf
在操作系统上,一个可执行文件不仅仅是我们编译的程序代码集合,而是至少由两部分组成,
- 文件头信息
- 程序正文
而不同的操作系统的头信息也自然是不同的,
Linux是ELF头,Windows是PE头。
readelf的功能就是读取Linux中文件的ELF头部的信息。
这里写一个测试程序
hello.c
生成一个x86平台和ARM平台的可执行文件
readelf测试
x86的Linux文件
arm的Linux文件
从上可以看出,两者的ELF头部信息是一样的,这正是Linux下可执行文件的ELF头部信息。
所以下面的arm架构的文件也可以直接使用
readelf -h build
因为只是读文件的头部信息。
验证
前16个字节完全一样。但是ELF头的大小是
64字节,也就是上面打印的信息,包括入口地址,头大小,大端小端等。
size(GNU工具)
功能;size的功能就是读取我们可执行程序中的代码段,数据段,未初始化数据段等的大小
bss段就是未初始化或初始化为0的全局变量。data段就是全局变量且初始化,初始化值不为0.
dec = text + data + bss:就是前面几个段的大小之和。
nm
功能:查看可执行程序的符号表
T:全局函数标签 main
D:全局变量区
d:被static修饰的标签,在本文件有效的标签
t:被static修饰的函数标签
strip
strip功能:剔除可执行文件中的符号表
剔除符号表以后会影响文件的执行吗?
这里以build_x86为例
显然并不影响程序的执行,因为符号表只是给人看的,并不会影响程序的正文内容。
strings
功能:查看可执行文件的常量字符串,就是双引号括起来的
objdump
功能:反汇编,查看可执行程序的汇编代码
objcopy
功能:将我们的代码的某些段(代码段,数据段)按照相应的格式拷贝到内存的某个地址。
用于去除一些无用信息(头部ELF信息等)
addr2line
功能:在调试中将我们第几行和哪一行出错显示出来。(一般不用)