如何在GDB中对比同一进程两次运行得到的不同函数地址
GDB 地址对比解决方案
核心原理
你观察到的地址差异是ASLR(地址空间布局随机化)作用于PIE(位置无关可执行文件)的正常现象:静态查询二进制得到的函数地址是相对于文件自身基地址的固定偏移量,进程启动时系统会随机生成一个加载基地址,运行时实际函数地址 = 本次加载基地址 + 固定偏移。只要对比偏移量即可确认是否为同一函数。
具体操作步骤
- 第一步:记录静态偏移
进程未启动时,在GDB中查询到的固定函数地址就是该函数的静态偏移,直接记录即可。也可以通过objdump -d 目标二进制文件名导出反汇编结果,对应函数的地址和GDB静态查询结果完全一致。 - 第二步:获取运行时加载基地址
进程启动并暂停后,执行info proc mappings,找到属于目标二进制文件的内存段,该段最小的起始地址就是本次运行的加载基地址。也可以执行info sharedlibrary直接读取目标二进制的加载起始地址。 - 第三步:计算偏移对比
用本次运行时获取到的函数地址减去第二步得到的加载基地址,得到运行时地址对应的静态偏移,和第一步记录的偏移对比,数值一致即为同一函数。
无调试符号适配技巧
如果未提前记录目标函数的静态偏移,可以通过汇编特征比对:
- 第一次运行时执行
x/20i 目标函数运行时地址,记录开头10-20条汇编指令序列 - 第二次运行时找到疑似地址后,同样打印开头的汇编指令,和记录的序列完全匹配即可确认是同一函数。
可选调试优化
如果不需要复现ASLR场景,可在GDB中执行set disable-randomization on,之后每次启动进程的内存地址都会固定,无需计算偏移即可直接对比地址。
内容的提问来源于stack exchange,提问作者ניר שץ
相关产品推荐
相关产品推荐

