GDB调试PIE可执行文件:如何仅运行加载器并在首指令设断点
调试无调试信息PIE二进制:让GDB在加载完成后停在第一条指令
嗨,我之前调试无调试信息的PIE(位置无关代码)二进制时刚好碰到过这个问题,给你两个靠谱的解决办法,完美满足你“只完成加载、不运行程序”的需求:
方法1:用starti命令(最简单高效)
这是GDB专门为这类场景设计的命令,一步到位:
- 启动GDB并加载你的二进制:
gdb mybinary - 直接输入
starti回车就行
这个命令会让系统加载器完成所有加载流程(包括处理PIE的基址随机化),然后在程序执行的第一条用户指令处立刻停下——完全不用手动计算地址,也不会让程序跑起来,刚好符合你的要求。
方法2:手动定位入口点设断点(适配旧版GDB)
如果你的GDB版本比较老(比如低于7.4)不支持starti,可以用这个方法:
- 启动GDB加载二进制:
gdb mybinary - 先查二进制的入口点偏移:输入
info file,在输出里找类似Entry point: 0x1050的行,这个0x1050是相对于PIE基址的偏移量 - 设置断点到加载后的实际入口地址:输入
break *$rebase(0x1050)(把0x1050换成你查到的偏移),$rebase是GDB的内置宏,会自动把偏移转换成加载后的实际内存地址 - 最后输入
run,程序会在加载完成后立刻停在入口点的第一条指令
额外说明
- 为啥不能直接用
disassemble main?一是你的二进制没有调试信息,GDB不知道main符号对应的地址;二是PIE的所有地址都是动态计算的,加载前根本没法确定任何函数的实际内存位置。 starti和run的核心区别:run会让程序直接运行(直到结束或碰到断点),而starti专门停在第一条要执行的用户指令,刚好适配PIE加载后的场景。
内容的提问来源于stack exchange,提问作者Bob5421
相关产品推荐
相关产品推荐

