【问题标题】:NASM on Virtual Machine Ubuntu: Cannot execute binary file exec format error虚拟机 Ubuntu 上的 NASM:无法执行二进制文件 exec 格式错误
【发布时间】:2016-04-13 07:50:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你真的在使用ld -o hello.o hello -m elf_x86_64吗?看起来你想要ld -o hello hello.o -m elf_x86_64
  • 您确定安装的是 64 位 Ubuntu 吗?也许您安装了 32 位 Ubuntu? uname -a 显示什么?
  • 嘿,我刚刚检查过,两种方式我都遇到了同样的错误。
  • Linux dell 3.16.0-50-generic #67~14.04.1-Ubuntu SMP Fri...i686 i686 i686 GNU/LINUX uname -a
  • 请执行uname -a 命令并告诉我们它的输出。同样在执行ld 命令之前执行rm hello 以确保您没有垃圾文件。你的版本不应该工作。 ld -o hello.o hello 表示从文件hello 创建一个名为hello.o 的输出文件。这是不正确的,除非你有一个名为hello 的伪造文件,否则应该抛出错误。

标签: assembly virtual-machine nasm x86-64 ld


【解决方案1】:

错误:

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

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

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

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

32 位操作系统无法直接运行 64 位应用程序。如果您需要生成和运行 64 位代码,则需要安装 64 位 Ubuntu 操作系统。

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

sudo apt-get install gcc-multilib g++-multilib

假设您确实安装了 64 位操作系统,用于链接可执行文件的命令显示不正确。你有:

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 的可执行文件。

【讨论】:

  • 并且安装了 64 位版本的操作系统,他应该能够简单地依赖默认目标并使用 ld -o hello hello.o 作为链接命令,完全删除 -m elf_x86_64
  • @DavidC.Rankin 你说的是真的,但把它留在里面仍然有效,而且它更清楚。您是正确的,如果 OP 如此选择,默认值将允许删除 -m elf_x86_64
【解决方案2】:

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

【讨论】:

  • 嗨,你的意思是我可能有 32 位,是的,我尝试了许多二进制格式,而链接似乎没有任何效果。该程序还使用 64 位寄存器。感谢您的帮助
  • @user5444075 你可以只使用gas或yasm。他们似乎更好
  • 我会,但我的教授支持 nasm,并在 nasm 上教授所有内容,而且我仍然是一名学习者!我想补充一点,同样的程序正在我朋友的电脑上运行。我认为这可能是因为虚拟机而发生的,也许吧??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多