You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objdump与GDB显示地址不一致,如何实现二者地址统一?

解决objdump与GDB显示地址不一致的问题

常见原因与对应解决方法

1. 关闭地址空间布局随机化(ASLR)

ASLR是导致GDB中程序加载地址随机变化的核心原因,关闭后地址会固定,和objdump的默认虚拟地址对齐:

  • 临时关闭(仅当前会话有效):
    echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
    
  • GDB内单独关闭(不影响系统全局):
    启动GDB后执行:
    set disable-randomization on
    
    之后运行程序,加载地址就会固定。

2. 调整objdump的显示地址匹配GDB加载基址

如果不想关闭ASLR,可以先在GDB中查看程序的实际加载基址:

info files

找到类似Entry point: 0x555555554000的加载基址,然后用objdump的--adjust-vma参数调整显示地址,比如默认objdump显示的基址是0x400000,则计算偏移量0x555555554000 - 0x400000,执行:

objdump -d --adjust-vma=0x555555154000 你的程序文件名

这样objdump显示的地址就会和GDB中的一致。

3. 处理位置无关可执行文件(PIE)

如果你的程序是PIE编译的(默认编译选项-fPIE -pie),objdump默认显示的是相对基址0的偏移,而GDB显示的是实际虚拟地址。可以:

  • 在GDB中用info symbol 虚拟地址命令,将GDB中的地址对应到符号的偏移量,然后在objdump中查看该偏移的代码;
  • 或者编译时关闭PIE,用-no-pie选项编译,这样程序的加载地址固定,objdump和GDB地址会直接匹配。

4. 确保使用同一可执行文件

确认objdump分析的和GDB调试的是同一个编译生成的可执行文件,避免因重新编译导致文件版本不一致,地址无法对应。

内容的提问来源于stack exchange,提问作者user3488903

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:27:49