zoukankan      html  css  js  c++  java
  • 解决WSL在执行32位程序时报错“Exec format error”的问题

    当你尝试在WSL上运行32位的程序时,shell将会报错:cannot execute binary file: Exec format error. 这是因为WSL目前暂不支持32位的ELF可执行文件。有人请求在WSL中添加该支持,微软的回复是在做了咕咕咕。但是,没有官方支持和不能用是两回事,StackOverflow上的一个workaround很好地解决了这个问题。原理简而言之,就是利用一个解释器(QEMU)来将32位程序转译成64位程序执行。这个方法在Ubuntu-WSL上的步骤如下:

    1. 安装qemu-user-static:
      sudo apt install qemu-user-static
    2. 设置binfmts:
      sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic 'x7fELFx01x01x01x03x00x00x00x00x00x00x00x00x03x00x03x00x01x00x00x00' --mask 'xffxffxffxffxffxffxffxfcxffxffxffxffxffxffxffxffxf8xffxffxffxffxffxffxff'
    3. 重启binfmt服务:
      sudo service binfmt-support start
    4. 启用 i386 架构相关的包:
      sudo dpkg --add-architecture i386
      sudo apt update sudo apt
      install gcc:i386

    这在Ubuntu-WSL上被证明可以工作得很好。但是,对于Arch-WSL,事情变得略微麻烦了,因为Arch-WSL没有模拟systemd的功能,所以无法像支持systemd的系统一样使用systemd内嵌的binfmt服务,而需要另外安装binfmt-support的包,该包只有AUR提供(以yay作为AUR包管理器为例): yay -S binfmt-support

    另外,qemu在Arch上也只有AUR提供: yay -S qemu-user-static

    该包依赖于glib2-static,我在安装时,glib2-static的编译过程因为test不通过而失败,只好在PKGBUILD中手动注释掉test的步骤,然后makepkg -sri进行编译安装。 安装完成后,每次启动系统都要执行

    sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic 'x7fELFx01x01x01x03x00x00x00x00x00x00x00x00x03x00x03x00x01x00x00x00' --mask 'xffxffxffxffxffxffxffxfcxffxffxffxffxffxffxffxffxf8xffxffxffxffxffxffxff'

    添加支持,这很不方便。可以通过将这一命令添加到/etc/profile中来在每次登录时自动执行这一过程。该命令需要以superuser身份执行,如果你没有设置为sudo所有命令免除密码的话,需要用visudo修改sudoer文件,添加

    %USERNAME% ALL=(ALL) NOPASSWD:/usr/bin/update-binfmts

    避免在执行update-binfmts时需要密码。注意将%USERNAME%替换成你的用户名,同时命令必须以绝对路径形式列出,否则sudoer文件不能生效。

  • 相关阅读:
    【转】CNN卷积神经网络_ GoogLeNet 之 Inception(V1-V4)
    【转】Caffe的solver文件配置
    python 从filelist.txt中拷贝文件到另一文件夹中
    【转】fscanf 跳过空格,读取一行
    caffe配置NCCL
    caffe实现多任务学习
    mysql 2
    mysql 1
    mysql
    jQuery
  • 原文地址:https://www.cnblogs.com/Excr/p/12296525.html
Copyright © 2011-2022 走看看