将NASM生成的目标文件(x86_64)与ld链接:二进制文件会导致分段错误

时间:2019-12-26 13:37:50

标签: gcc assembly segmentation-fault nasm ld

我有一个a.asm文件,如下所示:

    section .text
    global  _start  
_start:
    push    rbp         ; save rbp
    mov     rbp, rsp    ; rbp is caller's stack

    mov     rsp, rbp    ; restore caller's stack frame
    pop     rbp
    mov     rax, 0
    ret                 ; TODO: remove segmentation fault

使用nasm调用nasm -f elf64 -o a.o a.asm,然后通过调用.o链接ld -o a a.o文件会导致可执行文件,从而导致分段错误。

我想做什么? 最初,最后一次调用是gcc -m64 -o a a.o(其中一个.asm文件的条目符号重命名为main而不是_start,因为ld无法识别{{1 }}作为开始符号),并且输出文件占用了大量空间。我不确定main在门后做什么,由gcc生成的输出文件是否正常运行。

  • gcc生成的可执行文件和ld生成的可执行文件有什么区别?
  • 如何从gcc中制作可执行文件,它比gcc生成的可执行文件相对精简并且不存在段错误? (编辑:@Jester评论我们应该使用出口syscall来返回。Linux 64-bit x86 64 Assembly Exit Syscall Number是60。.asm操作应替换为以下代码。详细信息可以找到here。)
ret
  • 您是否想提出一些在线资源,以更详细地讨论gcc-ld组装链接过程?我对组装和链接的工作方式缺乏了解。

0 个答案:

没有答案