Running && Debugging x64 ELF on Arm mac

Running && Debugging x64 ELF on Arm mac

需求:在 Apple silicon 的 mac 中调试 x64 的 ELF 程序。

0. 方案分析

两种方案:

  1. qemu 运行 x64 的 Linux 系统,直接在 x64 的 Linux 中调试;
  2. 运行 arm64 的 Linux 虚拟机,虚拟机中安装 qemu-user 进行调试。

方案 1 很方便,但qemu转译速度极慢,我难以忍受其卡顿。

方案 2 配置环境较复杂,但速度、性能令人满意。

本文介绍方案2的环境搭配流程。

1. 安装虚拟机

Ubuntu官网 下载arm64的Ubuntu20.04镜像。注意选择 ARM desktop image。

下载后,使用 Parallels Desktop 虚拟机安装。

2. 配置软件源

首先,dpkg 添加 amd64 架构:

1
sudo dpkg --add-architecture amd64

由于 arm64 Ubuntu 使用的软件源是 ports.ubuntu.com 域名,里面只有非x64架构的包:

1
2
3
4
5
[DIR]	binary-arm64/	2020-04-23 17:33	-
[DIR] binary-armhf/ 2020-04-23 17:33 -
[DIR] binary-ppc64el/ 2020-04-23 17:33 -
[DIR] binary-riscv64/ 2020-04-23 17:33 -
[DIR] binary-s390x/ 2020-04-23 17:33

为了让 apt 能下载到 amd64 架构的软件包,需要分别指定 arm64 和amd64 架构的软件源地址。

/etc/apt/sources.list 修改为如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
deb [arch=arm64] http://cn.ports.ubuntu.com/ubuntu-ports/ focal main restricted
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal main restricted


deb [arch=arm64] http://cn.ports.ubuntu.com/ubuntu-ports/ focal-updates main restricted
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal-updates main restricted



deb [arch=arm64] http://cn.ports.ubuntu.com/ubuntu-ports/ focal universe
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal universe


deb [arch=arm64] http://cn.ports.ubuntu.com/ubuntu-ports/ focal-updates universe
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal-updates universe



deb [arch=arm64] http://cn.ports.ubuntu.com/ubuntu-ports/ focal multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal multiverse

deb [arch=arm64] http://cn.ports.ubuntu.com/ubuntu-ports/ focal-updates multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal-updates multiverse




deb [arch=arm64] http://cn.ports.ubuntu.com/ubuntu-ports/ focal-backports main restricted universe multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse


deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-security main restricted
deb [arch=amd64] http://security.ubuntu.com/ubuntu/ focal-security main restricted

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-security universe
deb [arch=amd64] http://security.ubuntu.com/ubuntu/ focal-security universe

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-security multiverse
deb [arch=amd64] http://security.ubuntu.com/ubuntu/ focal-security multiverse

除此之外,如果 /etc/apt/sources.list.d 目录下有list文件,也需要分别指定arm64和amd64两种架构的地址。

例如:

1
2
3
➜  sources.list.d cat proposed.list
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-proposed main restricted
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal-proposed main restricted

配置完成后,运行 sudo apt updatesudo apt upgrade 更新一下软件源。

3. 安装qemu

源码编译安装qemu:
参考 https://www.qemu.org/download/#source

1
2
3
4
5
wget https://download.qemu.org/qemu-6.1.0.tar.xz
tar xvJf qemu-6.1.0.tar.xz
cd qemu-6.1.0
./configure
make

4. 安装调试、库环境

安装 gdb-multiarch,调试不同架构的程序;
安装 g++-x86-64-linux-gnu,来安装x64架构的库:

1
2
sudo apt install gdb-multiarch
sudo apt install g++-x86-64-linux-gnu

5:运行与调试

使用 qemu-x86_64 运行、调试程序,需要使用 -L 选项指定 amd64 的库目录。


运行:

1
qemu-x86_64 -L /usr/lib/x86_64-linux-gnu YOUR_PROG

调试:使用-g指定端口

1
qemu-x86_64 -L /usr/lib/x86_64-linux-gnu -g 1234 YOUR_PROG

在另一个窗口中,运行 gdb-multiarch,输入 target remote 127.1:1234 即可开始调试。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!