快速定位到NDK安装目录
- 打开你的 .bash_profile
vim ~/.bash_profile
- 设置ndk的环境变量
ANDROID_HOME="/Users/xxxx/Library/Android/sdk"
export NDK=${PATH}:${ANDROID_HOME}/ndk/21.3.6528147
//这个就是你的快捷指令
alias ndk=alias ndk=${ANDROID_HOME}/ndk/21.3.6528147/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin
- 保存后,重启你的ternimal,就可以快速定位到你的ndk所在位置
ndk工具的介绍
工具 | 说明 | 用法 |
---|---|---|
aarch64-linux-android-addr2line | 用addr2line可以将函数地址解析为函数名 | ./aarch64-linux-android-addr2line -C -f -e /XXXX/Desktop/libbytebench.so 0000007994a1ee20 |
aarch64-linux-android-objdump | 把so进行反汇编 | ./aarch64-linux-android-objdump -j.text -l -C -S /xxx/xxxx/xxx.so > /xxxx/XX/xxxx.txt |
aarch64-linux-android-c++filt | Demagele c++ 符号 | |
aarch64-linux-android-nm | 查看定义的符号 | ./aarch64-linux-android-nm -D /Users/XXX/Desktop/libbytebench.so |
aarch64-linux-android-strings | 查看so中所有的字符串 | ./aarch64-linux-android-strings -a /Users/XXXX/Desktop/libbytebench.so |
一点点ARM指令的知识
寄存器:
- PC寄存器:通常被理解为程序当前执行的指令地址,但是在ARM中,pc的值实际是当前指令的地址:codeAddr+4(Thumb)或+8(ARM)
- LR寄存器:链接寄存器,cpu在执行BL/BLX时,将当前指令的下一条指令的地址写入LR寄存器
反汇编的格式:
使用objdump进行反汇编
- 第一列(237fec):当前指令在动态库中的相对便宜地址,记作codeAddr
- 第二列(f7ff fe80):当前指令的机器码,其中f7ff是高16位,是指令格式图中的前半部,fe80是低16位,是指令格式图中的后半部
- 第三列(bl):bl是跳转指令
- 第四列(237cf0 <__ZN3art6Thread25InstallImplicitProtectionEv>):要跳转的目标地址及其符号和符号偏移(目标地址相对符号的偏移位0时,不显示偏移值)