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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:05:28