[英]How does 32-bit system call table entry point maps to SYSCALL_DEFINE in x86_64
[英]Programming Assembly in (WSL2) x86_64 Unix can't make 32-bit syscall?
我正在尝试在 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
这样的调用取决于架构、操作系统等。
当我尝试在 WSL 图像上运行它时,它返回Segmentation fault
。
四处搜索我必须知道分段错误可能与程序未退出执行有关,例如当一个部分没有ret
语句时。 (在这种情况下, int $0x80
应该足以激活 kernel 并通过调用在 ax 寄存器上设置的值 1 返回/退出)
我认为这是因为我试图在 64 位机器上编译和运行 32 位 ASM 代码。 但是,我做了一个 ssh 连接到一个酒吧 unix 服务器,这也是一个 Ubuntu x86_64,相同的代码可以毫无问题地运行。
这是 WSL2 的限制吗? 或者这个 pubnix 是否安装或配置了一些东西来接受 32 位代码而没有任何额外的标志?
WSL2 确实支持 32 位库和系统调用。
因此,这是在 Windows 上编程汇编的好方法,无需双引导和汇编仿真器。
但是假设由于安装了 WSL2,它也在被使用是错误的。
如果您已经安装了 WSL2,则可以将 WSL1 图像转换为 WSL2,或者将 WSL 版本设置为您希望在创建/导入下一个图像时使用的版本 (WSL2)。
(就我而言,Docker Desktop for Windows 自动为我安装了 WSL2)
wsl -l -v
wsl --set-default-version 2
每次创建新图像或导入时,它都会设置为 WSL2。 如果你想 go 回到 WSL1 你可以wsl --set-default-version 1
。
现在您可以像往常一样创建新图像。
wsl --set-version image_name 2
(转换图像可能需要很长时间)
wsl --export current-image image-backup.tar
mkdir new-folder
wsl --import newimg new-folder image-backup.tar
(导出和导入将保留您的 $HOME 和文件,就像备份整个图像一样)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.