如何使用GDB获取函数的起始与结束地址?
使用GDB获取函数边界地址并导出/恢复机器码
获取函数的起始与结束地址
下面是几种在GDB里快速拿到函数边界的实用方法:
1. 用info address拿起始地址,配合disassemble找结束地址
输入info address <函数名>直接获取函数起始地址,比如查询main函数:
(gdb) info address main Symbol "main" is at 0x555555555155 in a file compiled without debugging.
这里的0x555555555155就是main的起始地址。
接着用disassemble <函数名>查看完整汇编代码,最后一条指令的地址就是函数的结束地址:
(gdb) disassemble main Dump of assembler code for function main: 0x0000555555555155 <+0>: push rbp 0x0000555555555156 <+1>: mov rbp,rsp ... 0x0000555555555176 <+33>: ret End of assembler dump.
注意:如果要dump完整的函数机器码,结束地址建议取最后一条指令地址+1(比如这里的0x0000555555555177),避免漏掉最后一条指令的字节。
2. 用info functions查看函数地址范围
如果程序保留了完整符号表,输入info functions会列出所有函数及其地址范围:
(gdb) info functions All defined functions: Non-debugging symbols: 0x0000555555555090 _init 0x00005555555550c0 printf@plt 0x0000555555555100 __libc_start_main@plt 0x0000555555555155 main 0x0000555555555180 _fini
这里main的范围可以近似为0x555555555155到下一个函数_fini的起始地址0x555555555180,但要注意函数间可能存在对齐填充的空字节,建议结合disassemble确认实际有效代码范围。
3. 直接打印函数地址
用print命令直接获取起始地址:
(gdb) print &main $1 = (int (*)()) 0x555555555155
结束地址可以通过打印下一个符号的地址来近似:
(gdb) print &_fini $2 = (void (*)()) 0x555555555180
导出(dump)函数机器码
拿到起始和结束地址后,用dump binary memory命令将机器码导出到文件:
(gdb) dump binary memory main.bin 0x555555555155 0x555555555177
命令格式:dump binary memory <输出文件名> <起始地址> <结束地址>
恢复(restore)机器码
要把导出的机器码恢复到原内存地址,使用restore命令:
(gdb) restore main.bin binary 0x555555555155
命令格式:restore <输入文件名> binary <目标起始地址>
注意事项
- 确保程序没有被
strip(剥离符号表),否则GDB无法识别函数名,只能手动输入地址操作。 - 动态链接函数(如
printf@plt)显示的是PLT跳转地址,而非实际函数的机器码,需注意区分。 - 写入内存前,若提示权限不足,可执行
set write on开启内存写入权限。
内容的提问来源于stack exchange,提问作者Koopa
相关产品推荐
相关产品推荐

