zoukankan      html  css  js  c++  java
  • 反汇编Dis解析


    title: 反汇编Dis解析
    tags: ARM
    date: 2018-10-21 18:02:58

    反汇编dis解析

    关于段,反汇编文件中包含了代码段,数据段,bss段,comm段和注释段.

    COMM段BSS段

    对于全局变量来说,如果初始化了不为0的值,那么该全局变量则被保存在data段,如果初始化的值为0,那么将其保存在bss段,如果没有初始化,则将其保存在common段,等到链接时再将其放入到BSS段。关于第三点不同编译器行为会不同,有的编译器会把没有初始化的全局变量直接放到BSS段。

    参考 链接脚本.md

    Disassembly of section .text:
    Disassembly of section .data:
    Disassembly of section .rodata:  // 只读数据段(const全局变量)
    Disassembly of section .bss:	 //(初始值为0,无初始值的全局变量)
    Disassembly of section .comment:
    

    COMM段BSS段

    这两个段并不在bin文件中保存,可以查看反汇编的代码前面的标号与bin的大小对比.所以实际上bss段代码的实现要自己写的.

    注释段

    这个在反汇编文件的最下方,类似如下,其实他是字符串的asc编码,复制到winhex中查看一下即可

    00000000 <.comment>:
       0:	43434700 	cmpmi	r3, #0	; 0x0
       4:	4728203a 	undefined
       8:	2029554e 	eorcs	r5, r9, lr, asr #10
       c:	2e342e33 	mrccs	14, 1, r2, cr4, cr3, {1}
      10:	47000035 	smladxmi	r0, r5, r0, r0
      14:	203a4343 	eorcss	r4, sl, r3, asr #6
      18:	554e4728 	strplb	r4, [lr, #-1832]
      1c:	2e332029 	cdpcs	0, 3, cr2, cr3, cr9, {1}
      20:	00352e34 	eoreqs	r2, r5, r4, lsr lr
      24:	43434700 	cmpmi	r3, #0	; 0x0
      28:	4728203a 	undefined
      2c:	2029554e 	eorcs	r5, r9, lr, asr #10
      30:	2e342e33 	mrccs	14, 1, r2, cr4, cr3, {1}
      34:	47000035 	smladxmi	r0, r5, r0, r0
      38:	203a4343 	eorcss	r4, sl, r3, asr #6
      3c:	554e4728 	strplb	r4, [lr, #-1832]
      40:	2e332029 	cdpcs	0, 3, cr2, cr3, cr9, {1}
      44:	00352e34 	eoreqs	r2, r5, r4, lsr lr
    

    注意使用hex格式复制,显示的是gcc的版本,这里是直接列复制的,实际的需要按地址排序,小端模式

    mark

    mark

    Bl指令

    反汇编的Bl指令中的地址,并不是实际的跳转地址,他只是起到方便查看的作用,实际跳转的地址是pc指针的偏移量

    3000005c:	eb000106 	bl	30000478 <sdram_init> 
    
    30000060:	e3a01000 	mov	r1, #0	; 0x0
    30000064:	e59f204c 	ldr	r2, [pc, #76]	; 300000b8 <.text+0xb8>
    30000068:	e59f304c 	ldr	r3, [pc, #76]	; 300000bc <.text+0xbc>
    
     
    这里的bl	30000478不是跳转到30000478,这个时候sdram并未初始化;
    为了验证,我们做另一个实验,修改连接脚本sdram.lds, 链接地址改为0x32000478,编译,查看反汇编:
    
     
    3000005c:	eb000106 	bl	30000478 <sdram_init> 
    
    30000060:	e3a01000 	mov	r1, #0	; 0x0
    30000064:	e59f204c 	ldr	r2, [pc, #76]	; 300000b8 <.text+0xb8>
    30000068:	e59f304c 	ldr	r3, [pc, #76]	; 300000bc <.text+0xbc>
    

    可以看到现在变成了bl 30000478,但两个的机器码eb000106都是一样的,机器码一样,执行的内容肯定都是一样的。 因此这里并不是跳转到显示的地址,而是跳转到: pc + offset,这个由链接器决定。

    假设程序从0x30000000执行,当前指令地址:0x3000005c ,那么就是跳到0x30000478;如果程序从0运行,当前指令地址:0x5c 调到:0x00000478

    跳转到某个地址并不是由bl指令所决定,而是由当前pc值决定。反汇编显示这个值只是为了方便读代码。

    重点: 反汇编文件里, B或BL 某个值,只是起到方便查看的作用,并不是真的跳转。

  • 相关阅读:
    activemq 高可用集群部署
    rabbitmq单机部署、集群部署、haproxy+keepalived 的高可用负载均衡环境搭建
    redis 单机部署、集群部署(主从同步+哨兵)
    zookeeper 单机部署、伪集群部署、集群部署
    IDEA 中调试 dubbo 出现 <dubbo:reference interface="" /> interface not allow null! 异常
    centos 安装 subversion1.8及更高版本
    mysql 两主一从环境搭建
    mysql 一主多从环境搭建
    springboot + post 中文乱码
    android:inputType参数类型说明
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/10023599.html
Copyright © 2011-2022 走看看