再度、GDBで、リモートデバッグ(SH7047F)

 

1.ありゃりゃ、SH-GDBと、GDB_STUBで、リモートデバッグできない!

   以前できていた、リモートデバッグが、出来なくなりました。

   理由

   その1.ハードディスクがクラッシュして、windows及び、ファイル、全てが使えなくなった。

   その2.ハードディスクを買ってきて、再度windowsをインストール

                windowsMEから、windowsXPに、OS変更。(NTFSフォーマットに変更)

   その3.ソフト全てを、1から入れ直し。

                スタブに関しては、自分のホームページに、設定の仕方を書いていたので、助かった... (^_^;;

                97.GDBスタブ(stub)で、リモートデバッグするねん...(最終訂正版)

   その4.KPITの GNU版 HEW3の仕様か、又は、SH-ELF_V403の仕様が、変わったかもしれない...

                なぜなら、

                以前 「KPIT's HEW3で、何の疑問もなく、Buildして、スタブを使ってGDBでリモートデバッグできていた」

                のです。

                それが、理由が、わからないままに、不可能になりました。

(gdb) load

Error: Invalid download offset: Files/Renesas/HEW30/test50/test50/Debug/test50.x

 

2.何がどうなってるんか、解らんけど...

        最終的には、リモートデバッグできるように、なりました

   が、その過程が、大切なので、メモっときます。

3.スタブは、正常に動作しているのか?

(gdb) set remotebaud 57600

(gdb) target remote /dev/com1

Remote debugging using /dev/com1

0x00000278 in ?? ()

--------------------------------------------------------------------------------------------------------

これは、シリアルの設定ができて、GDBスタブと接続できている事を示す。

今度は、GDBが、スタブと、うまく交信できているか、試してみる。

maintenanceという、コマンドが、それです。

(gdb) main packet Pn000=r123456

sending: "Pn000=r123456"

received: "OK"

(gdb) main packet g (これは、レジスタの値を見るコマンド)

sending: "g"

received: "0123456001111111ffff8382ffff838c0000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000efffffffc0000027800000276e05ac044000000006d269401ffff00ff000000f1"

よく解らんが、交信できてるようです。

超ええかげんです。

つまり、スタブは、うまく動作している。

 

4.GNU-HEW3+GNU-SH_V403で、Buildしてみる。

   Projectを新たに作り、全くdefaultのまま、デバッグモードで、Buildしてみる。

   できた、実行ファイルを、ロードしてみる。

(gdb) load

Error: Invalid download offset: Files/Renesas/HEW30/test50/test50/Debug/test50.x

エラーと、なります。

これは、ベステクの、GCCdeveloper Liteを使っても、

sh7047の内部rom設定である限り、同じくエラーとなります。

(gdb) main info sections

Exec file:

`/cygdrive/c/Program Files/Renesas/HEW30/test50/test50/Debug/test50.x', file type elf32-sh.

0x00000000->0x00000008 at 0x00000100: .vects ALLOC LOAD READONLY DATA HAS_CONTENTS

0x00001000->0x00002454 at 0x00000180: .text ALLOC LOAD READONLY CODE HAS_CONTENTS

0x00002454->0x00002476 at 0x000015d4: .rodata ALLOC LOAD READONLY DATA HAS_CONTENTS

0x00002476->0x00002476 at 0x00001d90: .tors HAS_CONTENTS

0xffffe000->0xffffe790 at 0x00001600: .data ALLOC LOAD DATA HAS_CONTENTS

0xffffe790->0xffffe7cc at 0x00001d90: .bss ALLOC

0xfffffffc->0xfffffffc at 0x00001d90: .stack HAS_CONTENTS

0x00000000->0x000000dd at 0x00001d90: .debug_abbrev READONLY HAS_CONTENTS

0x00000000->0x000002da at 0x00001e6d: .debug_info READONLY HAS_CONTENTS

0x00000000->0x00000190 at 0x00002147: .debug_line READONLY HAS_CONTENTS

0x00000000->0x00000050 at 0x000022d8: .debug_frame READONLY HAS_CONTENTS

0x00000000->0x00000065 at 0x00002328: .debug_pubnames READONLY HAS_CONTENTS

0x00000000->0x00000060 at 0x00002390: .debug_aranges READONLY HAS_CONTENTS

0x00000000->0x0000016c at 0x000023f0: .comment READONLY HAS_CONTENTS

----------------------------------------------------------------------------------------------

GCCdeveloper Liteで、エミュレーションの設定をすると、うまく動作します。

 

4.GNU-HEW+GNU-SH-elfを、諦める

   コマンドラインでは、どうや?

C:\test>sh-elf-gcc -v -g test.c -o test.x を実行すると、

(-vは、Print version informationで、中身が、どうなっているか調べてみる)

C:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4-GNUSH_v0403/../../../../sh-elf/bin/

as.exe -big -o C:\DOCUME~1\junzo\LOCALS~1\Temp/cc6hbaaa.o C:\DOCUME~1\junzo\LOCALS~1\Temp/cc8Iaaaa.s

C:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4-GNUSH_v0403/../../../../sh-elf/bin/

ld.exe -mshelf C:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4-GNUSH_v0403/crt1.o C:/PROGRA~1/Renesas/H

EW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4-GNUSH_v0403/crti.o C:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4-GNUSH_v0403/crtbegin.o -LC:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4-GNUSH_v0403 -LC:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc -LC:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4GNUSH_v0403/../../../../sh-elf/lib C:\DOCUME~1\junzo\LOCALS~1\Temp/cc6hbaaa.o -lgcc -lc -lgcc C:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4-GNUSH_v0403/crtend.o C:/PROGRA~1/Renesas/HEW30/Tools/KPITCU~1/GNUSH-~1/v0403/sh-elf/bin/../lib/gcc/sh-elf/3.4-GNUSH_v0403/crtn.o

要約すると

as.exe -big -oTemp/cc8Iaaaa.o Temp/cc8Iaaaa.s

ld.exe -mshelf crt1.o crti.o crtbegin.o -Lgcc -Llib Temp/cc6hbaaa.o -lgcc -lc -lgcc crtend.o crtn.o

 

まず、gcc.exeは、as.exeを呼び出し、次に、ld.exeを呼び出し、

-mshelf :shelfのエミュレーションモード設定

crt1.o crti.o crtbegin.o :連結する(default)

-Lgcc :libgcc.soをライブラリと指定。

-lgcc -lc -lgcc :ライブライを指定

crtend.o crtn.o :連結している(default)

これで、test.xと言う実行ファイルができあがる。

このtest.xは、GDBのエミュレーションで、実行できる!。

(gdb) target sim

Connected to the simulator.

(gdb) load

Loading section .init, size 0x36 vma 0x1000

Loading section .text, size 0x134c vma 0x1038

Loading section .fini, size 0x2a vma 0x2384

Loading section .rodata, size 0x22 vma 0x23b0

Loading section .data, size 0x798 vma 0x2454

Loading section .eh_frame, size 0x4 vma 0x2bec

Loading section .ctors, size 0x8 vma 0x2bf0

Loading section .dtors, size 0x8 vma 0x2bf8

Loading section .jcr, size 0x4 vma 0x2c00

Loading section .got, size 0xc vma 0x2c04

Loading section .stack, size 0x4 vma 0x30000

Start address 0x1038

Transfer rate: 56432 bits in <1 sec.

Breakpoint 3, main () at test.c:4

(gdb)

--------------------------------------------------------------------------------------

つまり、コマンドラインで、gccを起動すると、自動的に

crt1.o crti.o crtbegin.o crtend.o crtn.o に連結してくれる!

(HEW2で、やって見たけど、複雑になるので、やめましたわ。)

今までで、解ったことは、

リンカ(ld.exe)が、問題やっ!

と、言うことです。

 

5.アドレスを希望通りにするには?

C:\test>sh-elf-gcc -v -g test.c -o test.x では、プログラムの開始アドレスは

Start address 0x1038

と、GDBが教えてくれはる。

このアドレスを、変える事ができれば、

Error: Invalid download offset: が、解消できるぞっ!

それには、マップが必要。

このマップファイルは何処に?

ありまんがな....ここに

gdbstubs-20030326-1117CDT.tar.bz2

の中に

sh-7045edk-test.x

中身は、こんなん...

OUTPUT_FORMAT("elf32-sh", "elf32-sh",

"elf32-sh")

OUTPUT_ARCH(sh)

ENTRY(start)

SEARCH_DIR(/home/bgat/H-i686-pc-linux-gnu/sh-elf/lib);

/* Do we need any of these for elf?

__DYNAMIC = 0; */

SECTIONS

{

/* Read-only sections, merged into text segment: */

. = 0x400000;←ここと、

.interp : { *(.interp) }

.hash : { *(.hash) }

.dynsym : { *(.dynsym) }

.dynstr : { *(.dynstr) }

.gnu.version : { *(.gnu.version) }

.gnu.version_d : { *(.gnu.version_d) }

.gnu.version_r : { *(.gnu.version_r) }

;;;;;;;;;

/* SGI/MIPS DWARF 2 extensions */

.debug_weaknames 0 : { *(.debug_weaknames) }

.debug_funcnames 0 : { *(.debug_funcnames) }

.debug_typenames 0 : { *(.debug_typenames) }

.debug_varnames 0 : { *(.debug_varnames) }

.stack 0x410000 : { _stack = .; *(.stack) }←ここの、アドレスを変える!

/* These must appear regardless of . */

}

私は、SH7047F用に、こう、変えました。

SECTIONS

{

/* Read-only sections, merged into text segment: */

. = 0xFFFFD200;←ここと、

.interp : { *(.interp) }

.hash : { *(.hash) }

.dynsym : { *(.dynsym) }

.dynstr : { *(.dynstr) }

.gnu.version : { *(.gnu.version) }

.gnu.version_d : { *(.gnu.version_d) }

.gnu.version_r : { *(.gnu.version_r) }

;;;;;;;;;

/* SGI/MIPS DWARF 2 extensions */

.debug_weaknames 0 : { *(.debug_weaknames) }

.debug_funcnames 0 : { *(.debug_funcnames) }

.debug_typenames 0 : { *(.debug_typenames) }

.debug_varnames 0 : { *(.debug_varnames) }

.stack 0xFFFFFFFC : { _stack = .; *(.stack) }←ここの、アドレスを変える!

/* These must appear regardless of . */

}

そして、buildするのであります。(HEW3、サヨナラ...)

C:\Program Files\Renesas\HEW30\Tools\KPIT Cummins\GNUSH-ELF\v0403\sh-elf\bin\sh-elf-gcc.exe -g -Wl,--script=c:\test\sh7047.x -o ad_da.x C:\junzo\AD_DA\ad_da.c

こんな長いの、打ち込むのが大変や。

そこで、サクラエディタ なる、フリーのエディタを探してきました。

マクロを記憶できて、実行できる、素晴らしいエディタです。

アウトプットウインドも、あるので、コマンドの結果が解ります、

便利やなあ 素晴らしい!

 

たけ様、ありがとうございます m(__)m

 

こうして、再び、GDBで、SH7047Fをリモートデバッグできるように

なったので、あります....う、うれしいぞっ!

 

みなさん、ありがとうございました m(__)m

確定申告しようっと。(^_^;;

 

    H.17.3.8