Assembly 汇编程序出错:/a.out:无法执行二进制文件:Exec格式错误

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

我不熟悉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-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,类似地,这也不起作用(我猜是因为它试图读取和写入同一个文件)。无论如何,谢谢你的回答。