为什么我没有得到分段错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我没有得到分段错误?相关的知识,希望对你有一定的参考价值。

我是汇编编程和使用简单示例和gdb进行实验的新手。这是我写的程序:

1.asm

section .text
    global _start
    extern _print_func

_start:
    push str
    movzx rdx, byte [str_len]
    push dx ;  <---  typo here, should be rdx
    call _print_func

    mov rax, 60
    syscall

section .data
    str: db 'Some data',0x0A,0x0D
    str_len: db $ - str

2.asm

section .text
    global _print_func

_print_func:
    pop rbx
    pop rdx
    pop rsi
    mov rax, 0x01
    mov rdi, 0x01
    syscall
    push rbx
    ret

section .data
    str: db 'Some string',0x0A,0x0D
    str_len: db $ - str

编译后,链接(与ld)并运行程序它只是打印没有。所以我在syscall之前检查了寄存器的内容。

(gdb) info registers 
rax            0x1      1
rbx            0x4000c5 4194501
rcx            0x0      0
rdx            0x6000e4000b     412331802635  ; <-- obviously wrong
rsi            0x10000  65536
rdi            0x1      1
rbp            0x0      0x0
rsp            0x7fffffffdcc6   0x7fffffffdcc6

所以系统调用应该尝试从412331802635开始读取0x10000字节,我认为这应该导致Segmentation Fault,因为程序不允许访问所有字节。

但它默默无声地打印出来。为什么?为什么没有提出Segmantation Fault?这是某种未定义的行为吗?我在Ubuntu 16.04 LTS下使用intel core i5

答案

sys_write不会引发段错,它只返回一个-EFAULT错误代码。你应该在rax结束后在syscall看到。另见man 2 write

以上是关于为什么我没有得到分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 Python 分段错误?

为啥在访问二级指针时出现分段错误错误? C语言

为啥我得到以下程序的分段错误?

QApplication 执行分段故障错误

为啥我的代码结果显示分段错误(核心转储)?

c++ 我想 concat char 但我得到一个分段错误