Assembled program gives error: /a.out: cannot execute binary file: Exec format error

Assembled program gives error: /a.out: cannot execute binary file: Exec format error

我是 64 位 x86 编码的新手,但我是 运行宁 Ubuntu 14.04(值得信赖),我有一段非常简单的 64 位代码 assemble 使用 作为 。我得到的输出具有奇怪的权限和文件类型。

当我运行:

as file.s

我得到一个文件 a.out,权限为 770。

我在执行时遇到这个错误:

bash: ./a.out: cannot execute binary file: Exec format error

当我运行:

file ./a.out 

我得到:

./a.out: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

我使用的汇编代码是:

.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    ,%rax     # System Call to execve
    movq    $.LC0, %rdi  # Pass program to execute
    movq    $.LC3, %rsi  # Pass command line arguments
    syscall

    movl    [=12=], %eax
    popq    %rbp
    ret

您想 assemble 使用 GNU 汇编器 (AS) 程序,然后使用链接器生成最终的可执行文件。为此,您应该能够使用类似的东西:

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

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

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

然后您可以 运行 它:

./file