我有一个a.asm
文件,如下所示:
section .text
global _start
_start:
push rbp ; save rbp
mov rbp, rsp ; rbp is caller's stack
mov rsp, rbp ; restore caller's stack frame
pop rbp
mov rax, 0
ret ; TODO: remove segmentation fault
使用nasm
调用nasm -f elf64 -o a.o a.asm
,然后通过调用.o
链接ld -o a a.o
文件会导致可执行文件,从而导致分段错误。
我想做什么?
最初,最后一次调用是gcc -m64 -o a a.o
(其中一个.asm
文件的条目符号重命名为main
而不是_start
,因为ld
无法识别{{1 }}作为开始符号),并且输出文件占用了大量空间。我不确定main
在门后做什么,由gcc生成的输出文件是否正常运行。
gcc
中制作可执行文件,它比gcc生成的可执行文件相对精简并且不存在段错误? (编辑:@Jester评论我们应该使用出口syscall来返回。Linux 64-bit x86 64 Assembly Exit Syscall Number是60。.asm
操作应替换为以下代码。详细信息可以找到here。) ret