我试图理解为什么在程序集级别上执行系统调用时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/

10-11 16:33