我试图理解为什么在程序集级别上执行系统调用时as
的行为与nasm
不同。因为我是个贪得无厌的惩罚者,所以我用的是Intel语法。这是我的程序:
.intel_syntax noprefix
.section .rodata
.LC0:
.string "Hello world!\n"
.text
.globl _start
.type _start, @function
_start:
mov edx, 13
mov ecx, OFFSET FLAT:.LC0
mov eax, 4
int 0x80
ret
我用
as -o prog.o prog.s
组装并与ld -s -o prog prog.o
链接。但当我运行它时,我得到:
$ ./prog
Hello world!
Segmentation fault (core dumped)
GDB在这里不是特别有用。当我打开
stepi
时,它会显示ret
。这令人费解,因为Cannot access memory at address 0x1
的值是:(gdb) info registers esp
info registers esp
esp 0xbffff660 0xbffff660
为什么这个程序是segfault?
最佳答案
因为它从来没有正确地退出。_start
没有父堆栈帧,因此从它返回将导致崩溃。
您可以从main
返回,为您使用标准库的_start
实现调用exit
,但如果您正在编写自己的_start
,则需要自己调用exit
,因为没有要返回的父堆栈帧。
关于linux - 使用GNU汇编程序进行系统调用时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47169310/