qemu缺ld.so的解决方法

解决运行在linux上用qemu运行arm或mips等架构的程序时报找不到ld错误的方法。

当然,解决这种问题的前提是你本地有安装相应的lib。

可以搜索一下apt search libc6-ARCH

比如可以通过下面两条来安装mips和arm的lib

1
2
$ sudo apt install libc6-mipsel-cross
$ sudo apt install libc6-armel-cross

安装好后应该还是会说找不到ld,下面就是解决这个问题的两种办法。

方法1

qemu有一个参数是是-L

1
-L path       QEMU_LD_PREFIX    set the elf interpreter prefix to 'path'

通过这个我们可以指定lib所在的位置,进入/usr可以看到arm和mips库所在的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# veritas @ ubuntu in /usr [13:17:14] 
$ la
总用量 148K
drwxr-xr-x 5 root root 4.0K 7月 22 08:53 arm-linux-gnueabi #arm
drwxr-xr-x 3 root root 4.0K 7月 26 13:04 arm-linux-gnueabihf
drwxr-xr-x 2 root root 68K 7月 25 16:02 bin
drwxr-xr-x 2 root root 4.0K 3月 18 21:40 games
drwxr-xr-x 47 root root 4.0K 7月 25 16:02 include
drwxr-xr-x 152 root root 12K 7月 22 08:50 lib
drwxr-xr-x 3 root root 4.0K 7月 1 20:40 lib32
drwxr-xr-x 3 root root 4.0K 7月 1 20:40 libx32
drwxr-xr-x 11 root root 4.0K 5月 2 21:26 local
drwxr-xr-x 3 root root 4.0K 3月 1 02:35 locale
drwxr-xr-x 7 root root 4.0K 5月 25 14:32 mipsel-linux-gnu #mips
drwxr-xr-x 2 root root 12K 7月 8 15:26 sbin
drwxr-xr-x 316 root root 12K 7月 25 16:00 share
drwxr-xr-x 8 root root 4.0K 7月 8 15:43 src

假设我们手头有一个arm小端的程序,我们就可以通过以下参数启动它。

1
qemu-arm -L /usr/arm-linux-gnueabi/ ./PROG_NAME

方法2

可以需要装一下qemu-user-binfmt

1
sudo apt install qemu-user-binfmt

然后

1
2
3
$ sudo mkdir /etc/qemu-binfmt
$ sudo ln -s /usr/mipsel-linux-gnu /etc/qemu-binfmt/mipsel
$ sudo ln -s /usr/arm-linux-gnueabi /etc/qemu-binfmt/arm

这样以后应该只需直接./PROG_NAME就可以启动相应的binary了。

Reference