WSL 2是否真的支持32位程序?实测遇执行格式错误
解决WSL2 Debian/Ubuntu下32位ELF程序无法运行的
Exec format error问题 我之前也踩过这个一模一样的坑!明明按步骤装了32位运行时和编译工具,运行编译出来的程序却一直报错,折腾了半天才搞明白问题出在哪。
问题根源
虽然有些资料说WSL2支持32位ELF程序,但默认情况下WSL2的内核并没有加载i386架构的兼容模块——就算你装了32位的用户态库,内核识别不了32位二进制格式,自然就会抛出Exec format error。另外这个特性需要WSL2内核版本在5.15及以上,先确认下你的内核版本:
uname -r
如果版本低于5.15,先在Windows终端里升级WSL:
wsl --update
解决步骤
- 补全32位运行时依赖
你之前已经加了i386架构,但还需要安装核心的32位系统库:
sudo apt install libc6:i386 libncurses5:i386 libstdc++6:i386
- 配置WSL2自动加载兼容模块
创建或编辑WSL发行版内的/etc/wsl.conf文件:
sudo nano /etc/wsl.conf
添加以下内容,让WSL每次启动时自动加载必要模块:
[boot] command = modprobe binfmt_misc && modprobe i386
保存退出后,在Windows终端里重启WSL:
wsl --shutdown
之后重新打开你的WSL发行版。
- 重新编译运行程序
现在再编译32位程序:
gcc helloworld.c -m32
运行./a.out应该就能正常输出内容了!
额外测试方案
如果配置后还是不行,可以手动加载模块测试:
sudo modprobe binfmt_misc sudo modprobe i386
然后直接运行程序,要是能成功,说明是wsl.conf的配置没生效,检查下拼写有没有错误。
内容的提问来源于stack exchange,提问作者PaleNeutron
相关产品推荐
相关产品推荐

