1、反汇编的原理&为什么要反汇编
arm-linux-objdump -D led.elf > led_elf.dis
objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf(操作系统上的可执行文件)格式的可执行程序反过来得到汇编源代码。
-D(objdump 后面可以带不同参数实现不同功能)表示反 > 左边的是elf的可执行程序(反汇编的原材料), >右边的是反汇编生成的汇编程序。
反汇编的原因有以下:
(1)、逆向破解。
(2)、调试程序时,反汇编代码可以帮助我们理解程序,尤其是在理解链接脚本、链接地址等概念时。
(3)、把C语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解C语言和汇编语言之间的对应关系。非常有助于深入理解C语言。
2、反汇编文件格式和看法
(汇编 assembly 反汇编 dissembly 大部分汇编文件以.s作为后缀)
打开反汇编后的dis文件如下图,这时要对应我们的elf(是二进制文件要用WinHex.exe软件打开)格式文件进行分析(因为elf格式还没有去掉符号,标号等,而当用arm-linux-objcopy -o binary led.elf led.bin)生成的可烧录文件已经去掉了符号等。
我们要理解:标号地址、标号名称、指令地址、指令机器码、指令机器码反汇编到的指令
扩展:ARM汇编中用地址池的方式来实现非法立即数(PC里放的地址要有提前量)
3、初识指令地址
我们下载烧录执行的bin文件,内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址,这个地址是链接的时候ldMakefile中(arm-linux-ld -Ttext 0x0 -o led.elf $^)给指定的(也可以在链接脚本中指定)
4、展望:反汇编工具帮助我们分析链接脚本
反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定链接脚本来让链接器给我们链接合适的地址。
但是我们有时候写的链接脚本有误(或者我们不知道这个链接脚本会怎么样),这时候可以通过看反汇编文件来分析这个链接脚本的效果,看是不是我们想要的,如果不是可以改了再看。
下图是反汇编文件:
来源:CSDN
作者:qq_41680432
链接:https://blog.csdn.net/qq_41680432/article/details/104253772