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

时间:2011-07-03 15:08:21

标签: gcc assembly x86-64

.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之外的其他名称?

2 个答案:

答案 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

Related question on how to perform syscalls on x86_64

答案 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一样定义的,并且与平台有关。如果你是直接编程编程,我不知道究竟是什么。