【问题标题】:Segmentation fault in x86_64 assembly writing into section .data:x86_64 程序集中写入节 .data 的分段错误:
【发布时间】:2024-01-19 14:49:01
【问题描述】:

为什么会出现分段错误?

我使用nasm -f elf64 t.asm -o t.old t.o -o t在linux上编译。

我已经做了所有我能想到的。

section .data:
  variable_int db 1
  variable_string db "yaaaa", 10
section .text:
  global _start
_start:
  mov rax, 1
  mov rdi, 1
  mov rsi, variable_string
  mov rdx, 14
  syscall
  mov rax, 60
  mov rdi, 0
  syscall

【问题讨论】:

  • 我在尝试运行您的程序时没有遇到段错误,但是您的 write 系统调用的长度参数大于 variable_string 处的字符串长度。

标签: assembly segmentation-fault x86-64


【解决方案1】:
section .data:
section .text:

省略冒号。节指令不是标签,冒号被解析为节名的一部分。这会导致您的数据被放入一个名为.data: 的部分中,而链接器期望一个名为.data 的部分没有冒号。这可能会导致该部分被赋予错误的权限(例如,不可执行的 .text: 部分)。

还有:

mov rdx, 14

这个参数是要写入的数据的长度,你的字符串不是14字节长的;它只有 6 个。这可能会导致写入额外的垃圾(可能是也可能不是可见字符),或者如果遇到未映射的内存,可能会导致系统调用失败。

【讨论】:

  • 有趣的事实:在当前的 Linux 上,运行到未映射页面的长度不会返回 -EFAULT,除非其中有 0 个有效字节。它将字节写入未映射的页面并返回它可以复制的字节数。 (我忘记了我是否在页面末尾附近使用过像这样的非常小的缓冲区进行测试;我已经在页面开头附近开始使用 ~4k 大小进行了测试。)
最近更新 更多