如何用gcc编译入口点不是主要的汇编?

Je *_*Rog 4 assembly gcc x86-64

.text
    .globl _start
_start:
     pushq %rbp
     movq %rsp,%rbp
     movq $2, %rax
     leaveq
     retq
Run Code Online (Sandbox Code Playgroud)

我正在编译-nostdlib:

[root@ test]# gcc -nostdlib -Wall minimal.S &&./a.out 
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

顺便说一句,是否有可能使其他名称的入口点main_start

use*_*653 5

正如@jaquadro所提到的,您可以在命令行上指定链接器的入口点(或使用链接脚本): gcc -Wall -Wextra -nostdlib -Wl,-eMyEntry minimal.S && ./a.out

您的程序段错误的原因是,由于您没有使用标准库,因此无处可返回(retq).而是使用正确的系统调用调用exit(在这种情况下,它是60,放入rax,第一个(也是唯一的)参数放入rdi.

例:

.text
.globl MyEntry
MyEntry:
    # Use Syscall 60 (exit) to exit with error code 42
    movq $60, %rax
    movq $42, %rdi
    syscall

有关如何在x86_64上执行系统调用的相关问题