Assembly 汇编程序出错:/a.out:无法执行二进制文件:Exec格式错误
我不熟悉64位x86的编码,但我运行的是Ubuntu14.04(trusty),我有一段非常简单的64位代码,我用它来组装。我得到的输出具有奇怪的权限和文件类型 当我跑步时:Assembly 汇编程序出错:/a.out:无法执行二进制文件:Exec格式错误,assembly,x86,ubuntu-14.04,x86-64,gnu-assembler,Assembly,X86,Ubuntu 14.04,X86 64,Gnu Assembler,我不熟悉64位x86的编码,但我运行的是Ubuntu14.04(trusty),我有一段非常简单的64位代码,我用它来组装。我得到的输出具有奇怪的权限和文件类型 当我跑步时: as file.s file ./a.out 我得到一个具有770权限的文件a.out 当我执行它时,我得到了这个错误: bash:./a.out:无法执行二进制文件:Exec格式错误 当我跑步时: as file.s file ./a.out 我得到: ./a.out:ELF 64位LSB可重定位,x86-6
as file.s
file ./a.out
我得到一个具有770权限的文件a.out
当我执行它时,我得到了这个错误:
bash:./a.out:无法执行二进制文件:Exec格式错误
当我跑步时:
as file.s
file ./a.out
我得到:
./a.out:ELF 64位LSB可重定位,x86-64,版本1(SYSV),未剥离
我使用的汇编代码是:
.section .data
.LC0:
.string "/bin/sh"
.LC1:
.string "/bin/sh"
.LC3:
.quad .LC1, 0
.text
.globl _start
_start:
.LFB0:
pushq %rbp
movq %rsp, %rbp
movq $59,%rax # System Call to execve
movq $.LC0, %rdi # Pass program to execute
movq $.LC3, %rsi # Pass command line arguments
syscall
movl $0, %eax
popq %rbp
ret
您希望首先使用GNU汇编程序(AS)组装程序,然后使用链接器生成最终的可执行文件。要做到这一点,您应该能够使用以下方法:
as file.s -o file.o
ld file.o -o file
第一个命令告诉汇编程序使用-o
选项输出一个名为file.o
的ELF64对象。第二个命令使用-o
选项将file.o
链接到名为file
的64位ELF可执行文件
64位系统上的典型默认行为是汇编器和链接器生成64位对象和可执行文件
然后,您可以使用以下工具运行它:
./file
谢谢,我假设,因为它生成了一个它试图链接的a.out文件,当您没有提供具体名称时,gas用于生成一个.o文件。我曾尝试在没有选项的情况下在a.out上运行ld,类似地,这也不起作用(我猜是因为它试图读取和写入同一个文件)。无论如何,谢谢你的回答。