.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
这里有什么问题?
BTW,是否可以将入口点设为除main
和_start
之外的其他名称?
答案 0 :(得分: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
答案 1 :(得分:1)
您可以通过将选项传递给链接器来设置入口点
http://sca.uwaterloo.ca/coldfire/gcc-doc/docs/ld_24.html
要使用gcc执行此操作,您可以执行类似...
的操作gcc all_my_other_gcc_commands -Wl,-e,start_symbol
main是不同的,它不是编译应用程序的入口点,尽管它是从入口点调用的函数。如果你正在编译C或C ++代码,那么入口点本身就是像glibc源代码树中的Start.S一样定义的,并且与平台有关。如果你是直接编程编程,我不知道究竟是什么。