我想通过链接器从多个目标文件形成的程序源逐步调试。
为简单起见,我假设一个源是汇编文件,其中启动例程位于其中,另一个是 c 文件。该程序由以下makefile构建
PREFIX=/opt/arm/bin
LDSCRIPT=ld.script
AS_BASEN=$(basename startup.s)
C_BASEN=$(basename main.c)
ASFLAGS=-g
CCFLAGS=-g -nostartfiles
LDFLAGS=--fatal-warnings
$(C_BASEN).bin: $(C_BASEN).elf
$(PREFIX)/arm-objcopy -O binary $< $@
$(C_BASEN).elf: $(LDSCRIPT) $(AS_BASEN).o $(C_BASEN).o
$(PREFIX)/arm-ld $(LDFLAGS) -T $(LDSCRIPT) $(AS_BASEN).o $(C_BASEN).o -o $@
$(C_BASEN).o: $(C_BASEN).c
$(PREFIX)/arm-gcc $(CFLAGS) -c $< -o $@
$(AS_BASEN).o: $(AS_BASEN).s Makefile
$(PREFIX)/arm-as $(ASFLAGS) $< -o $@
尽管我认为我的问题与 openocd 无关,但为了完整起见,我声明了 openocd 的特定部分。在 openocd 守护进程启动后,我使用以下命令启动调试会话。
nc localhost 4444 <<eof
soft_reset_halt
load_image `pwd`/main.bin $memory_location
step $memory_location
exit
eof
ddd --debugger 'arm-gdb -ex "target remote localhost:3333"'
其中 $memory_location 是 .text 部分的第一个地址。打开后ddd
,程序停在所需的地址,我可以像往常一样单步通过装配线。最后我到达了跳转指令,它跳转到位于 c 文件中的函数。再经过一步 gdb 在程序执行时不再响应。
也许你们中的一位专家可以给我一个提示,我必须改变什么,以便 gdb 在这一点上切换到 c 源,我可以继续逐步执行。