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

时间:2016-02-13 17:40:41

标签: assembly x86 ubuntu-14.04 x86-64 gas

我是编码64位x86的新手,但我正在运行Ubuntu 14.04(可靠),我有一个非常简单的64位代码,我使用作为组装。我得到的输出具有奇怪的权限和文件类型。

当我跑步时:

as file.s

我获得了一个拥有770权限的文件a.out

执行时出现此错误:

  

bash:./ a.out:无法执行二进制文件:exec格式错误

当我跑步时:

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

1 个答案:

答案 0 :(得分:1)

您希望首先使用GNU Assembler( AS )组装程序,然后使用链接器生成最终的可执行文件。要做到这一点,你应该可以使用类似的东西:

as file.s -o file.o
ld file.o -o file

第一个命令告诉汇编器使用file.o选项输出名为-o ELF64 对象。第二个命令使用file.o选项将file链接到名为-o的64位ELF可执行文件。

64位系统上的典型默认行为是汇编器和链接器生成64位对象和可执行文件。

然后您可以使用以下命令运行它:

./file