本文主要是介绍objdump,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1 objdump
- 1.1 反汇编
- 1.2 查看目标文件中的详细段信息
1 objdump
1.1 反汇编
反汇编文件: objdump -d func.o
。
反汇编文件,并查看汇编到源码的映射: objdump -S func.o
。编译时需要给出-g,即需要调试信息。另外需要注意,这个时候我们是不能将源文件也就是func.c删除的,否则将不能显示汇编语句对应的C代码。
我们还可以使用-M选项,用来指明CPU架构(跟汇编风格有关),比如objdump -d -M intel -S main.o
。
1.2 查看目标文件中的详细段信息
查看目标文件中的详细段信息: objdump -h test.out
。
objdump -h的输出说明:
可执行程序是如何加载到内存中的?
三个重要的概念:虚存地址(VMA)、加载地址(LMA)、运行地址
桌面环境 :test.out(可执行文件),执行test.out会为其创建一个进程。首先会分配虚存,然后将相应的段加载到段所对应的虚存地址,这个虚存地址是在编译时确定的。这个虚存地址也就是加载目标地址,是终点的地址,简称加载地址。 最后执行应用程序。运行地址是指实地址。
嵌入式环境:源代码交叉编译得到test.bin,然后烧写到device的flash中。当flash为nandflash时,由于nand flash 只能存储代码不能执行代码,所以需要将代码从flash加载到ram中。 从flash的地址将代码拷贝到ram中,这个地址就叫加载地址,指的是起点。vma不等于lma ,这里的运行地址为实地址;当flash为norflash时, 代码可以直接在norflash中执行, 加载地址就是运行地址,虚存地址可能没有。
上面对于虚存地址(VMA)、加载地址(LMA)、运行地址得理解估计是错得,等后面厉害了,再来更新相关的概念吧!
参考资料:
- 嵌入式操作系统原理课
这篇关于objdump的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!