assembly - 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
解决方案
section .data:
section .text:
省略冒号。节指令不是标签,冒号被解析为节名的一部分。这会导致您的数据被放在一个名为的部分中,.data:
而链接器期望一个.data
没有冒号的部分。这可能会导致该部分被赋予错误的权限(例如,一个.text:
不可执行的部分)。
还:
mov rdx, 14
这个参数是要写入的数据的长度,你的字符串不是14字节长的;它只有 6 个。这可能会导致写入额外的垃圾(可能是也可能不是可见字符),或者如果遇到未映射的内存,则可能导致系统调用失败。
推荐阅读
- javascript - 下拉菜单不会打开 Javascript
- recursion - Groovy 的 trampoline() 使递归执行更慢 - 为什么?
- angular - 光滑的网格不以角度显示选项卡内的数据
- angular - Angular 8 启用常春藤错误 - FirebaseModule 的 NgModule.importss 中位置 0 的值不是参考:[object Object]
- java - Hibernate namedquery 抛出 ORA-00979: not a GROUP BY 表达式
- tensorflow - 使用 keras-rl 进行强化学习时出现内存错误
- android - 通过在 Listview 中单击来配对并连接到蓝牙设备
- excel - 仅在 Excel 中为最后一列到最后一行和最后一行到最后一列的单元格着色
- sql - Bigquery 查询失败“查询执行期间资源超出:用于查询的表元数据太大”
- linux - 拆分命令添加“?” 在文件名的末尾