在aarch64架构上用gdb-multiarch调试x64程序时无法识别动态函数
ARM64机器调试X64程序时GDB/GEF功能异常的解决方法
1. 重新编译程序并添加调试符号
默认编译未生成调试符号,导致GDB无法解析函数名。重新编译时加入-g参数:
x86_64-linux-gnu-gcc -g -o main main.c
-g会生成完整调试信息,让GDB能将调用地址映射为printf等函数名。同时避免使用-static参数,静态编译不会生成GOT表,直接导致GEF的got命令失效。
2. 修正QEMU运行参数
启动QEMU时必须指定X64系统库路径,确保程序加载正确的x64 libc和动态链接器:
qemu-x86_64 -L /usr/x86_64-linux-gnu/ -g 1234 main
-L参数指定x64架构的系统根目录,让程序的动态链接过程正常完成,GOT表会被正确初始化,GEF才能识别到相关区域。
3. 配置GDB-multiarch的架构与符号路径
启动gdb-multiarch后,除了加载目标文件和连接远程调试,还需明确指定目标架构并设置libc符号搜索路径:
file main set architecture i386:x86-64 set solib-search-path /usr/x86_64-linux-gnu/lib/ target remote localhost:1234
set architecture强制GDB以x64模式解析指令和符号,避免自动识别错误set solib-search-path让GDB找到x64 libc的符号文件,完成printf等库函数的地址解析
4. 更新GEF到最新版本
旧版GEF对跨架构调试的支持可能存在缺陷,重新安装最新版GEF即可修复部分命令失效问题:可以通过官方提供的安装脚本重新安装,确保其适配x64-on-arm64的调试场景。
问题根源说明
- 未添加调试符号:GDB无法将反汇编中的调用地址映射为具体函数名
- QEMU未指定库路径:程序加载异常导致GOT表未初始化,GEF的
got命令找不到有效数据 - GDB架构识别错误:自动识别机制可能误判目标架构,影响符号解析和命令执行
内容的提问来源于stack exchange,提问作者Toma
相关产品推荐
相关产品推荐

