ARM64嵌入式Linux下,如何调试指定动态加载器的32位程序?
调试ARM64设备上通过ld-linux-armhf.so.3启动的32位ARM程序
目标端正确启动调试的命令
无需嵌套调用ld-linux-armhf.so.3启动gdbserver,直接用32位gdbserver加载目标程序即可,同时指定动态库路径:
# 设置32位程序的动态库搜索路径 export LD_LIBRARY_PATH=/customfolder/lib32 # 启动32位gdbserver,绑定主机端口并仅调试一次 /customfolder/bin/gdbserver --once <主机IP>:10010 ./TestGDB32
若必须手动通过ld-linux-armhf.so.3启动程序(比如环境变量无法生效),可让gdbserver直接执行动态加载器并传递程序参数:
/customfolder/bin/gdbserver --once <主机IP>:10010 /customfolder/lib32/ld-linux-armhf.so.3 --library-path /customfolder/lib32 ./TestGDB32
主机端gdb配置与调试步骤
- 启动支持多架构的gdb:
gdb-multiarch - 在gdb中指定目标架构为32位ARM:
set architecture arm - 加载本地
TestGDB32的符号表(确保本地有带调试信息的程序版本):file ./TestGDB32 - 连接到目标设备的gdbserver:
target remote <目标设备IP>:10010 - 执行常规调试操作:
break main # 在main函数设断点 continue # 继续执行 list # 查看代码 bt # 查看调用栈
原命令失败的原因
你之前的命令通过ld-linux-armhf.so.3启动gdbserver,再让gdbserver启动另一个ld-linux-armhf.so.3进程运行TestGDB32,导致gdb初始附着的是gdbserver进程而非目标程序进程,进而出现符号加载失败、栈信息错乱的问题。直接用32位gdbserver加载目标程序(或动态加载器+程序参数),能让gdb直接关联到正确的目标进程。
内容的提问来源于stack exchange,提问作者Davide Benetti
相关产品推荐
相关产品推荐

