ARM 汇编代码2


ARM 汇编代码2

1.so文件信息(16进制工具分析是elf)

Elf文件查看工具 readelf –执行环境linux

​ -a 显示so文件所有信息
-h ELF文件头
-l Program header,动态加载时需要的信息
-S Secton header, 静态加载分析时所需要的信息
-e 同样头信息,elf header,section header, programheader
-s 显示符号表
-d 显示动态节
一般地,可以使用readelf工具来获得so的详细信息。

2.So Helper

​ 可以用来快速获取so的一些基本信息,提供较弱的汇编功能。

3.SO 的加载顺序

​ Soloaded -Init_array -JNI_onload -其他奇怪的函数 -fini_array

4.堆栈

​ 堆栈用于保存函数中的临时变量,以及某些寄存器的值,退出的时候用堆栈的数据用来还原运行环境,如寄存器等等。
另外堆栈也要平衡原理,函数进入之前注册多少堆栈空间,退出时需要释放多少堆栈空间。
堆栈中——:函数中定义的临时变量,
内存段中的数据保存:全局变量

1
2
3
4
5
6
7
堆栈的申请与撤销:
申请: PUSH {R7,LR}
SUB SP, SP, #0x18 ;申请0x18的空间
ADD R7, SP, #0
撤销: ADDS R7,#0x18
MOV SP, R7 ;释放0x18的空间
POP {R7.PC}

5.函数参数传递

​ Arm遵循ATPCS规则,前四个承诺书R0-R3,其他使用寄存器。

备注:—–
函数加载的时候的重定位(ps):
绝对装入方式只能将目标模块装入到内存中事先指定的位置。在多道程序环境下,编译程序不可能预知所编译的目标模块应放在内存的何处,因此,绝对装入方式只适用于单道程序环境。在多道程序环境下,所得到的目标模块的起始地址通常是从 0 开始的,程序中的其它地址也都是相对于起始地址计算的。此时应采用可重定位装入方式,根据内存的当前情况,将装入模块装入到内存的适当位置。 值得注意的是, 在采用可重定位装入程序将装入模块装入内存后, 会使装入模块中的所有逻辑地址与实际装入内存的物理地址不同例如,在用户程序的1000 号单元处有一条指令 LOAD 1,2500,该指令的功能是将 2500 单元中的整数 365 取至寄存器 1。但若将该用户程序装入到内存的 10000~15000号单元而不进行地址变换, 则在执行 11000号单元中的指令时,它将仍从 2500 号单元中把数据取至寄存器而导致数据错误。由图 4-3可见,正确的方法应该是将取数指令中的地址 2500 修改成 12500,即把指令中的相对地址 2500 与本程序在内存中的起始地址 10000 相加,才得到正确的物理地址 12500。除了数据地址应修改外,指令地址也须做同样的修改,即将指令的相对地址1000与起始地址10000相加,得到绝对地址11000。通常是把在装入时对目标程序中指令和数据的修改过程称为重定位。又因为地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. ARM 汇编代码2
    1. 1.1. 1.so文件信息(16进制工具分析是elf)
    2. 1.2. 2.So Helper
    3. 1.3. 3.SO 的加载顺序
    4. 1.4. 4.堆栈
    5. 1.5. 5.函数参数传递
,