x86_64 汇编中的分段错误,代码位于 .text 节中:(节名称中带有冒号)

pro*_*fpv 1 assembly x86-64 nasm segmentation-fault

为什么会出现分段错误?

我用的nasm -f elf64 t.asm -o t.o ld 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
Run Code Online (Sandbox Code Playgroud)

Nat*_*dge 6

section .data:
section .text:
Run Code Online (Sandbox Code Playgroud)

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

还:

mov rdx, 14
Run Code Online (Sandbox Code Playgroud)

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

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