複数のオブジェクト ファイルからリンカによって作成されたプログラムのソースを段階的にデバッグしたいと考えています。
簡単にするために、1 つのソースはスタートアップ ルーチンが配置されているアセンブリ ファイルであり、もう 1 つは 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
、プログラムは目的のアドレスで停止し、通常どおりアセンブリ ラインを 1 ステップ実行できます。最後に、Cファイルにある関数にジャンプするジャンプ命令に到達します。もう1ステップ後、プログラムが実行されている間、gdbは応答しなくなります。
たぶん、あなたの専門家の 1 人が、私が何を変更しなければならないかのヒントを教えてくれるので、この時点で gdb が c ソースに切り替わり、段階的な実行を続けることができます。