x86_64 程序集写入段 .data 中的分段错误:
Segmentation fault in x86_64 assembly writing into section .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
section .data:
section .text:
省略冒号。部分指令不是标签,冒号被解析为部分名称的一部分。这会导致您的数据被放入一个名为 .data:
的部分,而链接器期望一个名为 .data
的部分没有冒号。这可能会导致该部分被赋予错误的权限(例如,不可执行的 .text:
部分)。
还有:
mov rdx, 14
这个参数是要写入数据的长度,你的字符串不是14字节长;它只有 6。这可能会导致写入额外的垃圾(可能是也可能不是可见字符),或者如果遇到未映射的内存,系统调用可能会失败。
为什么会出现分段错误?
我正在使用 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
section .data:
section .text:
省略冒号。部分指令不是标签,冒号被解析为部分名称的一部分。这会导致您的数据被放入一个名为 .data:
的部分,而链接器期望一个名为 .data
的部分没有冒号。这可能会导致该部分被赋予错误的权限(例如,不可执行的 .text:
部分)。
还有:
mov rdx, 14
这个参数是要写入数据的长度,你的字符串不是14字节长;它只有 6。这可能会导致写入额外的垃圾(可能是也可能不是可见字符),或者如果遇到未映射的内存,系统调用可能会失败。