NASM x86_64添加换行符时出现链接错误,如何修复?
问题修复方案
你碰到的R_X86_64_8链接错误,本质是x86_64架构的寻址限制导致的,不是语法错误:mov byte [numb+4], newl这种写法试图直接把.data段中newl的字节值作为8位立即数写入.bss段地址,但链接器没法把newl的符号地址压缩成8位偏移量,所以触发了截断错误。
下面是两种可行的修复方法:
- 通过寄存器中转写入
先把newl的值加载到8位寄存器,再写入目标地址,绕开直接内存到内存的寻址限制:
mov al, newl mov byte [numb+4], al mov al, newl mov byte [buff+12], al
- 直接使用换行符立即数
如果newl就是ASCII换行符(0x0a),可以直接写立即数,彻底规避符号引用带来的relocation问题:
mov byte [numb+4], 0xa mov byte [buff+12], 0xa
额外提醒:要确保.bss段的buff和numb分配了足够空间——numb至少要5字节(4字节数据+1字节换行),buff至少13字节(12字节数据+1字节换行),防止越界写入。
内容的提问来源于stack exchange,提问作者BowPark
相关产品推荐
相关产品推荐

