为简单起见,我假设一个源文件是一个程序集文件,其中启动例程位于另一个文件夹中,另一个文件是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 $< [email protected]
$(C_BASEN).elf: $(LDSCRIPT) $(AS_BASEN).o $(C_BASEN).o
$(PREFIX)/arm-ld $(LDFLAGS) -T $(LDSCRIPT) $(AS_BASEN).o $(C_BASEN).o -o [email protected]
$(C_BASEN).o: $(C_BASEN).c
$(PREFIX)/arm-gcc $(CFLAGS) -c $< -o [email protected]
$(AS_BASEN).o: $(AS_BASEN).s Makefile
$(PREFIX)/arm-as $(ASFLAGS) $< -o [email protected]
建立Altough我认为我的问题是OpenOCD的的independet我州为了完整起见,OpenOCD的特定部分。在openocd守护进程启动后,我使用以下命令启动调试会话。
nc localhost 4444 <
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源,在那里我可以继续逐步执行。