NASM 在虚拟机 Ubuntu 上:无法执行二进制文件 exec 格式错误

NASM on Virtual Machine Ubuntu: Cannot execute binary file exec format error

我在组装一个简单的 64 位 hello world 程序后遇到错误。 我正在使用以下命令:

nasm -f elf64 hello.asm -o hello.o    successfull
ld -o hello.o hello -m elf_x86_64     successfull
./hello

错误:无法执行二进制文件exec格式错误

我正在 64 位 Ubuntu 虚拟机中执行此操作。 我感谢您的帮助!

你可能有32位的,再检查一遍。另外,正如帮助所说,还有更多二进制格式,请尝试以下操作:elfx32, elf32, elf.

错误:

error: Cannot execute binary file exec format error

表明您的系统无法理解您尝试的可执行文件运行。在我的评论中,我要求您 运行 uname -a 以便我可以找出您在虚拟机中使用的系统类型 运行。您给出的输出为:

Linux dell 3.16.0-50-generic #67~14.04.1-Ubuntu SMP Fri...i686 i686 i686 GNU/LINUX

i686 告诉我们这是 Ubuntu 的 32 位版本,而不是 64 位。如果输出包含 x86_64 那么您将使用 64 位 Ubuntu.

32 位 OS 不能直接 运行 64 位应用程序。如果需要生成 运行 64 位代码,则需要安装 64 位 Ubuntu OS.

64 位 Ubuntu 系统可以配置为允许使用 multilib 支持开发 32 位和 64 位代码。如果使用 C/C++(或只是 C 库)构建软件,将这些软件包安装在 Ubuntu:

上可能会有用
sudo apt-get install gcc-multilib g++-multilib

假设您确实安装了 64 位 OS,用于 link 可执行文件的命令似乎不正确。你有:

nasm -f elf64 hello.asm -o hello.o    
ld -o hello.o hello -m elf_x86_64 
./hello

NASM命令看起来没问题。这会将 hello.asm 组装成一个名为 hello.o 的 64 位目标文件。 LD 命令被告知从名为 hello 的文件生成一个名为 hello.o 的 64 位输出文件。命令应如下所示:

nasm -f elf64 hello.asm -o hello.o    
ld -o hello hello.o -m elf_x86_64 
./hello

请注意,我们现在使用 -o hello,因为我们要从名为 hello.o.

的目标文件中输出名为 hello 的可执行文件