You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GDB指定地址范围反汇编时,/m与/s选项无法输出关联源码的解决方案求助

GDB指定地址范围反汇编时,/m与/s选项无法输出关联源码的解决方案求助

我最近在研究如何用GDB自动生成带关联源码的反汇编输出,原本打算用disassemble命令配合/m/s选项来实现——这两个选项应该能把源码和汇编对应起来显示对吧?

最开始我尝试直接指定一个大范围的地址来覆盖整个目标文件:

disas /m 0,0xFFFFFF

结果立刻遇到了问题,GDB直接报错:

Cannot access memory at address 0x4

后来我把起始地址改成0x8,虽然不报错了,但输出里只有汇编指令,完全看不到对应的源码。

先说说我的环境:我用的是arm-none-eabi-gdb,处理的是从C++代码编译来的目标文件rtc.o,启动GDB的命令是这样的:

arm-none-eabi-gdb --quiet build/L4/02_base/rtc.o -iex="set osabi none" -ex="set architecture armv4" -ex="set pagination off" -ex="set verbose off"

我目前找到的“半吊子办法”是指定目标文件里存在的第一个符号(比如这个文件里是_ZL8int8_MAX),然后再加大范围:

disas /m _ZL8int8_MAX,+0xFFFFFF

但这个方案完全没法自动化——总不能每次都先手动找第一个符号吧?而且很多时候这个方法根本不管用。

现在我想请教大家:有没有办法让GDB在我指定地址范围的时候,自动把对应的源码和汇编一起输出?


补充编辑
我后来发现一个奇怪的现象:同样是用arm-none-eabi-gcc编译的STM HAL库的C代码,用GDB反汇编时能正常显示源码;但我们自己用arm-none-eabi-g++编译的C++代码,反汇编里就完全看不到源码关联。我还不确定这是不是问题的根源,不过当前最核心的需求还是解决“指定地址范围时显示源码+汇编”的自动化方案。

火山引擎 最新活动