.text
    .globl _start
_start:
     pushq %rbp
     movq %rsp,%rbp
     movq $2, %rax
     leaveq
     retq

我正在使用-nostdlib进行编译:
[root@ test]# gcc -nostdlib -Wall minimal.S &&./a.out
Segmentation fault

怎么了

顺便说一句,是否可以将入口点设置为main_start以外的其他名称?

最佳答案

如@jaquadro所述,您可以在命令行上指定链接器的入口点(或使用链接脚本):gcc -Wall -Wextra -nostdlib -Wl,-eMyEntry minimal.S && ./a.out
程序出现段错误的原因是,由于您未使用标准库,因此无处可返回(retq)。而是使用正确的syscall调用exit(在本例中为60,将其放入rax中,将第一个(也是唯一的)参数放入rdi中。

例子:

。文本
.globl MyEntry
我的条目:
#使用Syscall 60(退出)以错误代码42退出
movq $ 60,%rax
movq $ 42,%rdi
系统调用

Related question on how to perform syscalls on x86_64

关于gcc - 如何使用gcc编译入口点不是主要的程序集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6563663/

10-11 22:43
查看更多