(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 addapt install一起安装。

然后我在编程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这样的调用取决于体系结构、操作系统等。

当我尝试在WSL映像上运行它时,它返回Segmentation fault

四处搜索,我知道分段错误可能是关于程序没有退出执行,就像一个节没有ret语句一样。(在这种情况下,int $0x80应该足以激活内核并通过调用ax寄存器上设置的值1返回/退出(

我认为这是因为我试图在64位机器上编译和运行32位ASM代码。但是,我用ssh连接到了一个pubunix服务器,它也是一个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和文件,这就像备份整个图像一样(

相关内容

  • 没有找到相关文章

最新更新