2016-01-08 55 views
2

组装一个简单的64位hello世界程序后出现错误。 我使用下面的命令:虚拟机上的NASM Ubuntu:无法执行二进制文件可执行格式错误

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

错误:无法执行

我在64位的Ubuntu虚拟机执行这个二进制文件格式的exec错误。 我感谢您的帮助!

+1

你真的在使用'ld -o hello.o hello -m elf_x86_64'吗?看起来你想要'ld -o hello hello.o -m elf_x86_64' –

+0

你确定你已经安装了64位Ubuntu吗?也许你安装了32位Ubuntu? 'uname -a'表示什么? –

+0

嘿,我刚刚检查,两种方式即时获取相同的错误。 – user5444075

回答

5

错误:

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位操作系统无法直接运行64位应用程序。如果您需要生成并运行64位代码,则需要安装64位Ubuntu操作系统。

64位Ubuntu系统可以被配置成通过使用multilib的支持,以允许32位和64位代码开发。如果构建软件使用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位输出文件。该命令应该看起来像:

因为我们要输出我们现在使用 -o hello
nasm -f elf64 hello.asm -o hello.o  
ld -o hello hello.o -m elf_x86_64 
./hello 

通知的可执行文件,称为hello从名为hello.o的目标文件。

+1

,并且安装了64位版本的操作系统,他应该能够简单地依赖默认目标并使用'ld -o hello hello.o'作为链接命令,从而完全删除'-m elf_x86_64'。 –

+0

@ DavidC.Rankin你说的是真实的,但是保留它仍然有用,而且它会更清晰。你是正确的,如果OP选择的话,默认情况下会允许'-m elf_x86_64'被删除。 –

+1

绝对,根本没有争吵,因此得到赞扬。 –

-1

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

+0

嗨你是什么意思,我可能有32位一,是的,我尝试了很多二进制格式,而没有任何连接似乎工作。该程序也使用64位寄存器。感谢您对 – user5444075

+0

@ user5444075的帮助,您可以使用gas或yasm。他们似乎更好 –

+0

我会,但我的教授们支持nasm,并教导nasm加上我仍然是一个学习者!我想补充说,同一个程序正在我的朋友电脑上工作。我认为这可能是因为虚拟机发生的,也许? – user5444075

相关问题