在 Windows 10 上尝试(并失败)在 64 位 Ubuntu 上 运行 Hello World 32 位 C++ 程序
Trying (and failing) to run Hello World 32-bit C++ program on 64-bit Ubuntu on Windows 10
我通过以下方式从头开始在 Windows 10 上配置了我的新 Ubuntu:
# apt-get update
# apt-get install build-essential
# # Am able to compile now using "g++ -Wall -o Hello-World Hello-World.cpp", the binary is working.
# # To check versions, and that both packages were indeed installed
# gcc -v
# make -v
# apt-get install g++-multilib
# # This also installs gcc-multilib as a dependency
# # Now able to compile using "g++ -m32 -Wall -o Hello-World Hello-World.cpp
# # However the binary Hello-World can't be run. Error message "bash: ./Hello-World: cannot execute binary file: Exec format error
# apt-get install lib32gcc1 lib32stdc++6
# # Those two packages are at this time already both installed and well
# dpkg --add-architecture i386
# apt-get update
# apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
# # Still getting the same error when wanting to ./Hello-World
我想我还缺少一个 xyz:i386 library
,我只是无法自己弄清楚还缺少哪个。此外,我不确定这是否是 "Ubuntu on Windows" 特定的事情,或者如果在普通 Ubuntu 64 位 OS 上以相同的方式进行处理时是否也会发生这种情况。你有什么建议吗?
为了完成,这是 Hello-World.cpp
文件的内容:
#include <iostream>
using namespace std;
int main (int argc, char **argv)
{
cout << "Hellobaby" << endl;
return 0;
}
我认为你没有安装所有与 g++ 相关的依赖项。执行下面提到的命令来安装依赖项。
sudo apt-get install g++
在我看来,Sam Varshavchik 是对的,Ubuntu on Windows 目前不支持 32 位架构的程序。我在 VirtualBox 上安装了一个虚拟 Ubuntu 64 位,并且在那里 - 使用与我最初 post 中描述的完全相同的命令 - 程序编译并运行。
感谢大家的评论
QEMU 和 binfmt 支持点亮方式:)
https://github.com/microsoft/wsl/issues/2468#issuecomment-374904520
在阅读了 WSL 和 Windows 进程之间的 WSLInterop 使用 binfmt 之后,我正在修补 QEMU 以尝试一些 ARM 开发,并且偶然发现了如何获得 32 位支持。
需要 "Fall Creators Update"、1709、内部版本 16299 或更新版本
安装 qemu 和 binfmt 配置:
sudo apt install qemu-user-static
sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
每次启动 WSL 时都需要重新激活 binfmt 支持:
sudo service binfmt-support start
启用 i386 架构包:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install g++:i386
试试看:
$ file /usr/bin/g++-5
/usr/bin/g++-5: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=9835ed3e5b1c8707591630e314ba4030a571deec, stripped
$ /usr/bin/g++-5 --version
g++-5 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -m32 -Wall helloworld.cpp -o helloworld
$ ./helloworld
Hello, world!
$ file helloworld
helloworld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=65905fae78b837162a29d618b4ce63d300c62cb6, not stripped
为了证明它确实有效,请禁用 i386 支持并重试:
$ sudo service binfmt-support stop
* Disabling additional executable binary formats binfmt-support [ OK ]
$ ./helloworld
-bash: ./helloworld: cannot execute binary file: Exec format error
我通过以下方式从头开始在 Windows 10 上配置了我的新 Ubuntu:
# apt-get update
# apt-get install build-essential
# # Am able to compile now using "g++ -Wall -o Hello-World Hello-World.cpp", the binary is working.
# # To check versions, and that both packages were indeed installed
# gcc -v
# make -v
# apt-get install g++-multilib
# # This also installs gcc-multilib as a dependency
# # Now able to compile using "g++ -m32 -Wall -o Hello-World Hello-World.cpp
# # However the binary Hello-World can't be run. Error message "bash: ./Hello-World: cannot execute binary file: Exec format error
# apt-get install lib32gcc1 lib32stdc++6
# # Those two packages are at this time already both installed and well
# dpkg --add-architecture i386
# apt-get update
# apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
# # Still getting the same error when wanting to ./Hello-World
我想我还缺少一个 xyz:i386 library
,我只是无法自己弄清楚还缺少哪个。此外,我不确定这是否是 "Ubuntu on Windows" 特定的事情,或者如果在普通 Ubuntu 64 位 OS 上以相同的方式进行处理时是否也会发生这种情况。你有什么建议吗?
为了完成,这是 Hello-World.cpp
文件的内容:
#include <iostream>
using namespace std;
int main (int argc, char **argv)
{
cout << "Hellobaby" << endl;
return 0;
}
我认为你没有安装所有与 g++ 相关的依赖项。执行下面提到的命令来安装依赖项。
sudo apt-get install g++
在我看来,Sam Varshavchik 是对的,Ubuntu on Windows 目前不支持 32 位架构的程序。我在 VirtualBox 上安装了一个虚拟 Ubuntu 64 位,并且在那里 - 使用与我最初 post 中描述的完全相同的命令 - 程序编译并运行。
感谢大家的评论
QEMU 和 binfmt 支持点亮方式:)
https://github.com/microsoft/wsl/issues/2468#issuecomment-374904520
在阅读了 WSL 和 Windows 进程之间的 WSLInterop 使用 binfmt 之后,我正在修补 QEMU 以尝试一些 ARM 开发,并且偶然发现了如何获得 32 位支持。
需要 "Fall Creators Update"、1709、内部版本 16299 或更新版本
安装 qemu 和 binfmt 配置:
sudo apt install qemu-user-static
sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
每次启动 WSL 时都需要重新激活 binfmt 支持:
sudo service binfmt-support start
启用 i386 架构包:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install g++:i386
试试看:
$ file /usr/bin/g++-5
/usr/bin/g++-5: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=9835ed3e5b1c8707591630e314ba4030a571deec, stripped
$ /usr/bin/g++-5 --version
g++-5 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -m32 -Wall helloworld.cpp -o helloworld
$ ./helloworld
Hello, world!
$ file helloworld
helloworld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=65905fae78b837162a29d618b4ce63d300c62cb6, not stripped
为了证明它确实有效,请禁用 i386 支持并重试:
$ sudo service binfmt-support stop
* Disabling additional executable binary formats binfmt-support [ OK ]
$ ./helloworld
-bash: ./helloworld: cannot execute binary file: Exec format error