x86环境下汇编标签相对地址引发段错误的解决咨询
解决x86汇编中函数地址写入为相对偏移导致的段错误问题
看起来你在编译器生成的汇编代码里遇到了一个典型的地址寻址问题——让我帮你拆解一下原因和解决办法:
问题根源
你看到的0xc5是汇编器生成的PC相对偏移值,而不是temp_fun_2的绝对虚拟地址。当你直接写mov [esi+4], DWORD temp_fun_2时,汇编器默认会计算当前指令到temp_fun_2的距离(相对偏移),并把这个偏移值写入内存,而不是函数实际加载后的绝对地址。当程序运行时,这个偏移值显然不是有效的可执行内存地址,调用它必然触发段错误。
修复方案
要把函数的绝对地址写入[esi+4],最可靠的方式是先用lea指令获取函数的绝对地址,再将其存入目标内存:
替换你代码中的这一行:
mov [esi+4], DWORD temp_fun_2
为:
lea eax, temp_fun_2 ; 把temp_fun_2的绝对地址加载到eax寄存器 mov [esi+4], eax ; 将绝对地址写入[esi+4]内存位置
为什么这个方法管用
lea指令的核心作用是计算内存操作数的有效地址并加载到寄存器,它会在链接阶段直接解析temp_fun_2的绝对虚拟地址,而不是生成相对偏移。这样存入[esi+4]的就是程序运行时temp_fun_2实际所在的地址,后续调用这个地址时就能正确跳转到目标函数。
可选的汇编器特定写法
如果你使用的是NASM,也可以直接用立即数的方式指定绝对地址(确保汇编器配置为非PIC模式):
mov [esi+4], DWORD temp_fun_2
但如果是GAS(GNU汇编器),语法需要调整为:
movl $temp_fun_2, (%esi,4)
不过lea的写法在x86平台上是通用的,不需要依赖汇编器的特定语法,所以更推荐使用。
内容的提问来源于stack exchange,提问作者handora
相关产品推荐
相关产品推荐

