Linux 使用Qemu用户模式运行ARM64二进制文件时出现问题

Linux 使用Qemu用户模式运行ARM64二进制文件时出现问题,linux,qemu,musl,Linux,Qemu,Musl,我正在尝试使用Qemu用户模式在我的Kali Linux机器上运行ARM64二进制文件。这是二进制文件 ~$ file arm_binary arm_binary: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-aarch64.so.1, Go BuildID=kuiME-kEtOrjYr0NtuSC/F9nT4PAOBdJwNF6rCo

我正在尝试使用Qemu用户模式在我的Kali Linux机器上运行ARM64二进制文件。这是二进制文件

~$ file arm_binary
arm_binary: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-aarch64.so.1, Go BuildID=kuiME-kEtOrjYr0NtuSC/F9nT4PAOBdJwNF6rCoCc/7l0D-CmOuZoubD_SqInN/JtxNTIAPCIxt045aNaaC, not stripped
我可以看到它是一个Go程序,是使用
musl
编译的,所以我安装了
musl:arm64
libc6-dev-arm64-cross
,以及
gcc-aarch64-linux-gnu
来自
apt

但是,每次我尝试运行它时,都会出现所有这些
错误重新定位:未找到符号
错误

~$ unset LD_LIBRARY_PATH; LD_DEBUG=libs QEMU_STRACE=1 qemu-aarch64-static -L /usr/aarch64-linux-musl/ arm_binary
Error relocating /lib/aarch64-linux-musl/libgps.so: __fdelt_chk: symbol not found180208 writev(2,0x55007ff7a8,0x2) = 81
180208 writev(2,0x55007ff8a8,0x2) = 0

180208 writev(2,0x55007ff788,0x2) = 1
Error relocating /lib/aarch64-linux-musl/libgps.so: __fprintf_chk: symbol not found180208 writev(2,0x55007ff7a8,0x2) = 83
180208 writev(2,0x55007ff8a8,0x2) = 0

180208 writev(2,0x55007ff788,0x2) = 1
Error relocating /lib/aarch64-linux-musl/libgps.so: __snprintf_chk: symbol not found180208 writev(2,0x55007ff7a8,0x2) = 84
180208 writev(2,0x55007ff8a8,0x2) = 0

180208 writev(2,0x55007ff788,0x2) = 1
Error relocating /lib/aarch64-linux-musl/libgps.so: __syslog_chk: symbol not found180208 writev(2,0x55007ff7a8,0x2) = 82
180208 writev(2,0x55007ff8a8,0x2) = 0

还有很多错误,但我忽略了。我有
libgps.so
和所有其他文件,二进制文件可能无法重新定位。有人知道可能是什么问题吗?

错误告诉您libgps.so需要其他库中的u fdelt\u chk、u fprintf\u chk等符号,但没有提供它们


在这种情况下,谷歌搜索表明这些函数uuu fdelt_chk、uu fprintf_chk等应该由libc提供(glibc拥有它们,musl可能提供它们以实现向后兼容性,也可能不提供)。库libgps.so可能与一个更新或不同的libc版本相关联,而不是与sysroot中的版本相关联。

这是有道理的。你知道有没有一个好方法可以让我找出哪个库会有这些依赖项吗?那就是libc。我不知道libgps.so是从哪里来的,但我认为关键是要确保从同一个地方获得一组完整一致的库,而不是混搭。