.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/