![在 rasbian 上模拟 x86](https://linux22.com/image/187993/%E5%9C%A8%20rasbian%20%E4%B8%8A%E6%A8%A1%E6%8B%9F%20x86.png)
我想在运行 rasbian 的 Raspberry Pi 上运行 Starbound 服务器。
该服务器是为了在 x86 架构上运行而构建的,因此我的目标是模拟 x86 架构来运行该服务器。
编辑:box86 不运行 64 位 x86 二进制文件
为此,我尝试使用盒子86。
它允许运行 x86 程序(steamcmd 是允许我下载服务器的程序)。但运行服务器导致bash: ./program: cannot execute binary file: Exec format error
这很奇怪,因为 box86 遇到时应该模拟 x86 程序。
我尝试使用 qemu 来模拟服务器。
sudo apt install qemu-user qemu-system qemu
sudo qemu-x86_64 starbound_server
导致
/lib64/ld-linux-x86-64.so.2: No such file or directory
好像缺少一些动态库。
我认为这些库将随 qemu 一起提供,因此我尝试使用参数-L
来指定不同的 ld- 文件。但该程序似乎只查看 /lib64 文件夹。
我的最后一次尝试是使用 x86 系统中的 lib 文件创建此文件夹。但这导致
ERROR: ld.so: object '/usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.
为了解决这个问题,人们建议更改/etc/ld.so.preload
为删除对 的引用libarmmem
,但该文件在 rasbian 系统上不存在。
我想知道是否有更好的方法来模拟x86程序?
如果没有,在哪里可以找到合适的库来填充 /lib64 文件夹?
这是我从 readelf 获得的一些信息。
machine: Advanced Micro Devices X86-64
type: EXEC
class: ELF64
共享库
[libpthread.so.0]
[libdl.so.2]
librt.so.1]
[libm.so.6]
[libc.so.6]
[ld-linux-x86-64.so.2]
答案1
感谢斯蒂芬·基特的评论。
使用chroot
和本教程解决了问题。
使用 64 位 debian 创建目录。
apt install binutils debootstrap
mkdir my-directory
debootstrap --arch amd64 stretch my-directory http://deb.debian.org/debian
然后安装qemu
到环境中。
chroot my-directory
apt install qemu qemu-system
然后随时运行程序
chroot my-directory
qemu-x86_64 my_x86_programm
答案2
我刚刚使用 QEMU 5.2 遇到了这个问题,并且需要一个无需 chroot 即可工作的解决方案。我发现如果我在 /some_path 中安装了 x86_64 库(libc、ld-linux-x86_64.so.2 等),我可以这样做:
ln -s . /some_path/lib64
然后可以使用:
qemu-static-x86_64 -L /some_path <command to run>
我还必须设置:
LD_LIBRARY_PATH=/some_path
但这可能是由于我的特定环境造成的。
另外,由于我使用的是 Centos7,其中 qemu-user 不可用(对于 aarch64),我能够从以下位置获取 debian qemu-user-static .debhttps://packages.debian.org/sid/main/qemu-user-static并使用
ar x <deb file>
tar -xf data.tar.xz
然后使用生成的 qemu-static* 二进制文件,因为它们是静态链接的。当然,我确实必须安装 x86_64 库。
答案3
只是想法,因为我还没有尝试过。
/lib64/ld-linux-x86-64.so.2: No such file or directory
是由于没有安装库造成的。
您将需要添加外部架构的库。
在 debian 中,有一个多架构包(如果我没记错的话)可以管理这个。外部架构可以从 Debian 存储库中获取:与您的操作系统获取其他软件包的位置相同。
您可能需要使用 chroot / mount 命名空间,以避免库混淆。