0

我想通过链接器从多个目标文件形成的程序源逐步调试。

为简单起见,我假设一个源是汇编文件,其中启动例程位于其中,另一个是 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 源,我可以继续逐步执行。

4

1 回答 1

0

也许您可以尝试这些工具的不同版本(如果其中的某些错误抑制了预期的行为)。试试看这里http://www.comsytec.com/products/gnu-binaries/gcc-binaries.html

于 2012-04-11T18:15:50.737 回答