• ARM 反汇编工具objdump的使用简介


    一、反汇编的原理 & 为什么要反汇编

    arm-linux-objdump -D led.elf > led_elf.dis
    
    -D, --disassemble-all    Display assembler contents of all sections
    
    • 1
    • 2
    • 3

    objdump 是 gcc 工具链中的反汇编工具,作用是由编译链接好的 elf 格式的可执行程序反过来得到汇编源代码.

    -D 表示反汇编,> 左边的是 elf 的可执行程序(反汇编时的原材料),> 右边的是反汇编生成的反汇编程序。

    反汇编的原因有以下:

    1. 逆向破解。
    2. 调试程序时,反汇编代码可以帮助我们理解程序(我们学习时使用 objdump 主要目的是这个),尤其是在理解链接脚本、链接地址等概念时。
    3. 把 C 语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解 C 语言和汇编语言之间的对应关系。非常有助于深入理解 C 语言。

    二、反汇编文件的格式和看法

    (汇编 assembly 反汇编 dissembly)
    标号地址、标号名字、指令地址、指令机器码、指令机器码反汇编到的指令
    扩展:ARM汇编中用地址池方式来实现非法立即数

    1. 初识指令地址

    下载烧录执行的 bin 文件,内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址,这个地址是连接的时候 ld 给指定的(ld根据我们写的链接脚本来指定)。

    在这里插入图片描述


    2. 展望:反汇编工具帮助我们分析链接脚本

    反汇编的时候,得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定连接脚本来让链接器给我们链接合适的地址。

    但是有时候我们写的链接脚本有误(或者我们不知道这个链接脚本会怎么样),这时候可以通过看反汇编文件来分析这个链接脚本的效果,看是不是我们想要的,如果不是可以改了再看。

    root@ubuntu:/home/aston/workspace/git_xxx# arm-linux-ld --help | grep "Set address"
                                  Set address of named section
      -Tbss ADDRESS               Set address of .bss section
      -Tdata ADDRESS              Set address of .data section
      -Ttext ADDRESS              Set address of .text section
      -Ttext-segment ADDRESS      Set address of text segment
    root@ubuntu:/home/aston/workspace/git_xxx# cat Makefile 
    led.bin: led.o 
    	arm-linux-ld -Ttext 0x0 -o led.elf $^
    	arm-linux-objcopy -O binary led.elf led.bin
    	arm-linux-objdump -D led.elf > led_elf.dis
    	gcc mkv210_image.c -o mkx210
    	./mkx210 led.bin 210.bin
    	
    %.o : %.S
    	arm-linux-gcc -o $@ $< -c
    
    %.o : %.c
    	arm-linux-gcc -o $@ $< -c 
    
    clean:
    	rm *.o *.elf *.bin *.dis mkx210 -f
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    arm-linux-ld -Ttext 0x0 -o led.elf $^命令中的 -Ttext 指定代码段的起始地址,我们可以指定 0 地址,或者其他地址也行。

    在这里插入图片描述

    在这里插入图片描述


    源自朱有鹏老师.

  • 相关阅读:
    软考系统架构师知识点集锦五:系统可靠性分析与设计
    字符串左旋解法和子字符串判断法
    LeetCode-772. Basic Calculator III
    线程基础(一)
    No6-6.从零搭建spring-cloud-alibaba微服务框架,添加用户鉴权逻辑,动态数据权限(使用AOP实现)等(六,no6-6)
    高忆管理:突破22万亿!五大保险巨头总资产创历史新高
    [MAUI 项目实战] 音乐播放器(一):概述与架构
    也谈一下 30+ 程序员的出路
    编程2016 1
    SpringBoot 配置文件这样加密,才足够安全!
  • 原文地址:https://blog.csdn.net/weixin_42109053/article/details/128167431