linux - (WSL2) x86_64 Unix 中的编程汇编不能进行 32 位系统调用?
问题描述
我正在尝试在 Windows 上设置程序集编程环境。我确实安装了 Linux,但出于好奇,以及学习 WSL 的目的,我试图让它在 Windows 10 上通过 WSL2 运行。
我尝试设置 Alpine 和 Ubuntu(基础),只安装以下工具:
bash bash-doc bash-completion
util-linux pciutils usbutils coreutils binutils findutils grep
它是使用apk add
或安装的apt install
。
然后我从Programming Ground Up中编写了以下示例:
.section .data
.section .text
.globl _start
_start:
movl $1, %eax
movl $0, %ebx
int $0x80
我在没有任何花哨的标志的情况下进行了编译和链接,就像书中示例中的最小值一样。
as exit.s -o exit.o
ld exit.o -o exit
我知道这些调用int $0x80
取决于架构、操作系统等。
Segmentation fault
当我尝试在 WSL 图像上运行它时它会返回。
四处搜索我必须知道分段错误可能与程序未退出执行有关,例如当一个部分没有ret
语句时。(在这种情况下,int $0x80
应该足以激活内核并通过调用设置在 ax 寄存器上的值 1 来返回/退出)
我认为这是因为我试图在 64 位机器上编译和运行 32 位 ASM 代码。但是,我做了一个 ssh 连接到一个 pub unix 服务器,它也是一个 Ubuntu x86_64,同样的代码可以毫无问题地运行。
这是 WSL2 的限制吗?或者这个 pubnix 是否安装或配置了一些东西来接受 32 位代码而没有任何额外的标志?
解决方案
WSL2 确实支持 32 位库和系统调用。
因此,这是一种在 Windows 上编程汇编的好方法,无需双引导和汇编仿真器。
但是假设由于安装了 WSL2,它也在被使用是错误的。
- 如果您没有安装 WSL2,则需要安装它。
如果您已经安装了 WSL2,则可以将 WSL1 图像转换为 WSL2,或者将 WSL 版本设置为您希望在创建/导入下一个图像时使用的版本 (WSL2)。
(就我而言,Docker Desktop for Windows 自动为我安装了 WSL2)
- 您可以使用以下方法检查您的图像是 WSL1 还是 WSL2:
wsl -l -v
- 您可以通过设置要使用的 WSL2 来创建 WSL2 图像。
wsl --set-default-version 2
每次创建新图像或导入时,它都会设置为 WSL2。如果你想回到 WSL1,你可以wsl --set-default-version 1
。
现在您可以像往常一样创建新图像。
- 如果您的图像已经是版本 1,您可以使用以下命令将其转换为版本 2:
wsl --set-version image_name 2
(转换图像可能需要很长时间)
- 相反,您可以导出当前图像,然后将其作为 WSL2 版本再次导入/创建,因此您可以在需要时保留这两个版本。
wsl --export current-image image-backup.tar
mkdir new-folder
wsl --import newimg new-folder image-backup.tar
(导出和导入将保留您的 $HOME 和文件,就像备份整个图像一样)
推荐阅读
- ruby-on-rails - 如何设置默认标题?
- python - Python - 将 csv 文件上传到 Dropbox
- postgresql - PostgreSQL Upsert DO 更新
- python - 无法将 padded_batch tf.data.Dataset 传递给 tf.estimator
- python - 向量不能被写入,也不能将 WRITEABLE 标志设置为 True
- regex - 使用正则表达式获取字符串中的空格数
- c# - 模态中的多个视图
- php - 解析现有帖子的 Wordpress 方法
- powershell - Powershell 总是以“管理员身份”打开
- arrays - 可变数组/列表内存大小