首页 > 解决方案 > x86_64 程序集中写入节 .data 的分段错误:

问题描述

为什么会出现分段错误?

我用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

标签: assemblysegmentation-faultx86-64

解决方案


section .data:
section .text:

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

还:

mov rdx, 14

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


推荐阅读