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
相关产品推荐
相关产品推荐

