本文中所介紹的方法目前只測試了單個的demo,並無拿大型的項目作測試,可是應該是大同小異。這裏介紹兩種方法,一種是有獨立的ARM硬件,另外一種是依靠qemu
實現的模擬化,其實其本質都是同樣的。若是是大型項目的話最好仍是建議有一個原生的環境,畢竟模擬環境一般會遇到一些意外的事。linux
環境準備ubuntu
- ubuntu 20.04
這裏個人物理機是ubuntu,虛擬機同樣的。首先須要安裝一下qemu的環境和編譯ARM彙編機器碼的交叉gcc編譯器,其安裝命令以下bash
luna@ubuntu:~$ sudo apt update -y && sudo apt upgrade -y luna@ubuntu:~$ sudo apt install qemu-user qemu-user-static gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu binutils-aarch64-linux-gnu-dbg build-essential
而後咱們編寫一個測試代碼,來驗證編譯和執行的效果架構
#include <stdio.h> int main(void) { printf("hello\n"); return 0; }
而後在編譯的時候添加一個-static
選項,不然在程序執行時會出現動態連接庫找不到的狀況ssh
luna@ubuntu:~/study/c$ aarch64-linux-gnu-gcc -static -o test test.c
而後執行查看結果測試
luna@ubuntu:~/study/c$ ./test hello
到目前爲止執行是沒有什麼問題了,接下來就是調試的問題,調試咱們須要安裝一下gdb的多架構支持版本,在ubuntu中只須要執行一下命令ui
sudo apt-get update && apt install gdb-multiarch -y
而後就是調試的設置了插件
這裏因爲本地執行調試的話會出現問題,因此只能選擇遠程調試的方式,調試步驟以下,首先用qemu運行被調試程序,指定gdb遠程調試端口爲1234
,文件名爲test
調試
luna@ubuntu:~/study/c$ qemu-aarch64 -L /usr/aarch64-linux-gnu/ -g 1234 ./test
而後在另一個終端中,咱們打開gdb-multiarch
,而後鍵入以下的指令連接到遠程目標code
pwndbg> target remote 127.0.0.1:1234 pwndbg> file ./test Reading symbols from ./test...
這樣就能夠經過源碼調試的方式來調試程序了,結果以下圖所示
剛纔的調試環境基本接近完美,可是,問題是如過目標程序是動態連接的呢?這在實際的測試中是個大問題,解決的辦法是在打開gdb之後指定一個路徑,以下
For AArch64: (gdb) set solib-search-path /usr/aarch64-linux-gnu/lib/
在搗鼓了模擬環境之後,忽然看到了以前淘汰的一個小米手機,恰好能夠拿來做爲ARM64的實際環境,首先須要安裝一個termux,安裝之後須要裝一下ssh,基本步驟以下(注意,是在termux中操做)
#安裝OpenSSH $ pkg install openssh #運行SSH Server $ sshd #設置密碼 $ passwd #得到Android IP $ ifconfig #PC端鏈接 $ ssh 用戶名@ip -p 8022
注意手機必須和PC在一個網段內,而後在其上安裝gcc
,gdb
$ pkg install gcc gdb
而後就能夠開心的調試了,
這裏的一個問題是不能安裝gdb的插件,若是不習慣的話能夠用以前的遠程調試來達到目的
#在手機端 gdbserver :1234 a.out #PC端 pwndbg> target remote 192.168.0.100:1234