なんとかなるさね

マイコンをネタにブログを始めてみました


RL78マイコン(RL78/G13)|IDE4GR 0.7.0同梱のrl78-elf-readelfでデバッグ情報をダンプしてみた 

以前のエントリ(614, 772)でe2 studio+KPIT GNURL78でビルドしてCS+ for CCでシミュレーション出来るか
試してみた時にauto変数をウォッチしようとすると値の表示が??になってしまったのですが、IDE4GR 0.7.0に
同梱されていたKPIT GNURL78 Toolchainのbinフォルダにrl78-elf-readelf.exeというコマンドがあったことに
気付き、-hでヘルプメッセージを表示させたところ、-wでDWARF形式のデバッグ情報をダンプさせることが
出来るようでしたので、auto変数のデバッグ情報をKPIT GNURL78とCC-RLで比較してみました。

そこで気付いたのですが、auto変数のデバッグ情報のデータ形式に簡略形式と詳細形式の2通りの方法が用意
されていて、KPIT GNURL78は簡略形式で情報を出力し、CC-RLは詳細形式で情報(ただし今回試したものは
情報自体に関しては簡略形式での情報と同等に見えます)を出力しているようでした。(正直に言うと、DWARF
という言葉は知っているのですが、実は、仕様に関しては何も知りませんので、かなり当てずっぽう、的では
ありますが。) 更に、かなり飛躍した推測になるのですが、CS+ for CCのRL78モードでは詳細形式にしか対応
していないのかも知れません。ひょっとすると、KPIT GNURL78の該当箇所をピンポイントで対処するだけで
解決するかも知れません。(正直に言うと、GDBのソースは見たことがあるのですが、実は、GCCのソースは
見たことがありませんので、かなり当てずっぽう、的ではありますが。でも、あくまで勘でしかありませんが、
少なくとも取っ掛かりとしては良さげな気がします、、、)

ビルドしてみたプログラム

void main(void);

volatile int v = 0xcdcd;

void main(void)
{
  static int s00 = 0x00;
  static int s01 = 0x01;
  static int s02 = 0x02;
  static int s03 = 0x03;
  static int s04 = 0x04;
  static int s05 = 0x05;
  static int s06 = 0x06;
  static int s07 = 0x07;
  static int s08 = 0x08;
  static int s09 = 0x09;
  static int s0a = 0x0a;
  static int s0b = 0x0b;
  static int s0c = 0x0c;
  static int s0d = 0x0d;
  static int s0e = 0x0e;
  static int s0f = 0x0f;
  int a00 = 0x00;
  int a01 = 0x10;
  int a02 = 0x20;
  int a03 = 0x30;
  int a04 = 0x40;
  int a05 = 0x50;
  int a06 = 0x60;
  int a07 = 0x70;
  int a08 = 0x80;
  int a09 = 0x90;
  int a0a = 0xa0;
  int a0b = 0xb0;
  int a0c = 0xc0;
  int a0d = 0xd0;
  int a0e = 0xe0;
  int a0f = 0xf0;

  for (;;) {
    v = s00;
    v = s01;
    v = s02;
    v = s03;
    v = s04;
    v = s05;
    v = s06;
    v = s07;
    v = s08;
    v = s09;
    v = s0a;
    v = s0b;
    v = s0c;
    v = s0d;
    v = s0e;
    v = s0f;
    v = a00;
    v = a01;
    v = a02;
    v = a03;
    v = a04;
    v = a05;
    v = a06;
    v = a07;
    v = a08;
    v = a09;
    v = a0a;
    v = a0b;
    v = a0c;
    v = a0d;
    v = a0e;
    v = a0f;
  }
}


KPIT GNURL78でのauto変数a00に関するデバッグ情報 (簡略形式?)

debuginfo.dmp    デバッグ情報

Contents of the .debug_info section:

 途中省略
 <2><14f>: Abbrev Number: 3 (DW_TAG_variable)
    <150>   DW_AT_name        : a00
    <154>   DW_AT_decl_file   : 1  
    <155>   DW_AT_decl_line   : 61  
    <156>   DW_AT_type        : <0x22f>
    <15a>   DW_AT_location    : 2 byte block: 91 7a     (DW_OP_fbreg: -6)
 以後省略


CC-RLでのauto変数a00に関するデバッグ情報 (詳細形式?)

debuginfo.dmp    デバッグ情報

Contents of the .debug_info section:

 途中省略
 <2><124>: Abbrev Number: 5 (DW_TAG_variable)
    <125>   DW_AT_name        : a00
    <129>   DW_AT_decl_file   : 1  
    <12a>   DW_AT_decl_line   : 34  
    <12b>   DW_AT_type        : <0x100>
    <12f>   DW_AT_location    : 0x12c   (location list)
 以後省略

Contents of the .debug_loc section:

    Offset   Begin    End      Expression
    途中省略
    0000012c 00000123 00000224 (DW_OP_fbreg: -32)
    0000012c <End of list>
    以後省略


Cソースファイル、アセンブルリスト/アセンブラソース、プログラム(バイナリファイル)は以下の通りです。

KPIT GNURL78の場合

ビルド時のデバッグ/最適化に関わるオプションは -g2 -g -gdwarf-2 -gstrict-dwarf (-Oオプション無し)

TestKpitGnuRL78.c    Cソースファイル
TestKpitGnuRL78.lst    アセンブルリスト
TestKpitGnuRL78.x    プログラム(バイナリファイル)

CC-RLの場合

ビルド時のデバッグ/最適化に関わるオプションは -g -Onothing -volatile (mtpj再利用時に-volatile取り忘れ)

TestRenesasCCRL.c    Cソースファイル
TestRenesasCCRL.asm    アセンブラソース
TestRenesasCCRL.abs    プログラム(バイナリファイル)

追記 : 雑感

これからVMware PlayerでKPIT GNURL78 GCCのビルド環境を用意しようと思っているのですが、夏以降は
Windows10でUbuntuがネイティブに動くようになるとのことなので、素朴に以前のエントリ(428, 430)でも
思ってしまっていたような、こういう時の手間が軽減されそうです。(私はPCの買い替えが必要そうですが。)
(追記 : Windows上のMSYS2という環境でビルド出来ましたので、当面、VMware Playerは使わないです。)

次期Windows 10でUNIXコマンドをネイティブサポート - マイナビニュース
http://news.mynavi.jp/news/2016/03/31/147/

Ubuntu支援のCanonical、次期Windows 10 Bashシェルの舞台裏を披露 - マイナビニュース
http://news.mynavi.jp/news/2016/04/01/374/

私のPCには以下のエントリでVMware Player上のUbuntuにMinGW32 GCCをインストールしてありますので、
これをKPIT GNURL78 GCCのビルドに使用するつもりでいます。


[419] QEMU | VMware Player上のUbuntuでMinGW32 GCCをapt-getしてインストールしてみた

追記 : メモ

すみません。後から気付いたのですが、IDE4GR 0.7.0に同梱されているKPIT GNURL78 Toolchainの以下zip
ファイルの中にLinux上でWindows版バイナリをビルドするシェルスクリプトが含まれていました。その上、
シェルスクリプトの中でWindows版バイナリをビルドするMinGW32 GCCもビルドするようになっていました。
ですので、こちらを使用してみることにします。(GDBに関しては同じフォルダのBuildGDBRL78.txtがシェル
スクリプトになっていました。)

ide4gr-0.7.0\hardware\tools\gcc-rl78\Doc\BuildGNURL78.tar.bz2

ただし、KPIT GNURL78 GCCもMinGW32 GCCもシェルスクリプトの中でウェブサイトからwgetでソースを
取得してビルドするようになっているのですが、KPIT Cumminsのサイト(http://www.kpitgnutools.com)が
5月末で閉鎖され、CyberThor Studiosのサイト(https://gcc-renesas.com)に引き継がれましたので、シェル
スクリプトの中のGNURL78ソースのURLを以下のウェブページ上のものに書き換えておく必要がありそうです。

https://gcc-renesas.com/rl78/rl78-latest-source-code/    ← IDE4GR 0.7.0同梱のv14.03がある方
https://gcc-renesas.com/rl78/legacy-source-code/

なお、Linux上でLinux版バイナリをビルドするのであれば、以下のページの手順でもビルド出来るようでした。
(そして、よくよく考えてみると、そもそもLinux版バイナリで実験するということでも事足りる気はします。)
(IDE4GR 0.7.0同梱のものとはバージョンが異なります。)

https://gcc-renesas.com/wiki/index.php?title=Building_the_RL78_Toolchain_under_Ubuntu_14.04

ちなみに、IDE4GR 0.7.0に同梱されているKPIT GNURX Toolchainの方も同様に以下のzipファイルにシェル
スクリプトが含まれていました。

ide4gr-0.7.0\hardware\tools\gcc-rx\Doc\BuildGNURX.tar.bz2

同様にシェルスクリプトの中のURLは以下のウェブページ上のものに書き換えておく必要がありそうです。

https://gcc-renesas.com/rx/rx-latest-source-code/
https://gcc-renesas.com/rx/legacy-source-code/    ← IDE4GR 0.7.0同梱のv14.03がある方

また、Linux上でLinux版バイナリをビルドするのであれば、以下のページの手順でもビルド出来るようでした。
(IDE4GR 0.7.0同梱のものとはバージョンが異なります。)

https://gcc-renesas.com/wiki/index.php?title=How_to_build_the_RX_Toolchain_under_Ubuntu_14.04

追記 : メモ

その後、ウェブで調べ物をしていて、Windows上でGNURL78 GCCをビルドする手順をGitHubで公開している
人がいらっしゃることに気付きました。(以前にR8C/M12Aのブログを読ませて頂いたことを思い出しました。)
(gcc-4.9.3のソースからWindows上のMSYS2という環境でビルドされていました。)

RL78を始める~gccの構築から~ - RVF/RC45 blog
http://www.rvf-rc45.net/wordpress/?p=1520

My GitHub RL78 - hirakuni45
https://github.com/hirakuni45/RL78/

更に、GNURL78 GCCをビルドする手順だけでなく、GNURX GCCをビルドする手順も別のブログで解説して
いらっしゃいました。(R8C用コンパイラの構築手順を解説しているブログの終わりの方に書かれていました。)
(gcc-4.9.3のソースからWindows上のMSYS2という環境でビルドされていました。)

R8C用コンパイラの構築 gcc-4.9.3 - RVF/RC45 blog
http://www.rvf-rc45.net/wordpress/?p=1435

追記 : 雑感

残念ながら、私のパソコンの年代物のCPUではMSYS2のインストーラが不正命令例外アプリケーションエラー
(もう毎度のことですが)になってしまいましたので、MSYS2は諦めざるを得ませんでした。(私のパソコンの
CPUはAMD Athlon 1.2GHzというCPUです。) 性能的にはCS+(旧CubeSuite+)の編集ウィンドウが重く感じ
られる以外に不満は無いのですが、便利な環境が使えなくなって来ているので、さすがに買い替えないと、、、

追記 : 補足

MSYS2ですが、一旦は諦めたのですが、インストーラ(msys2-i686-20160205.exe)の他にアーカイブファイル
(msys2-base-i686-20160205.tar.xz)も用意されていたことに気付き、今までにインストーラは不正命令例外
アプリケーションエラーになってしまうもののインストールされるプログラムは問題無いことがありましたので、
試してみたところ特に問題無くMSYS2を実行させることが出来ました。ですが、gccやtexinfoが新しいせいで
KPIT GNURL78 BINUTILSはビルド出来ませんでした。それらに関してはIDE4GR同梱のものを使うことにして
KPIT GNURL78 GCCはビルド出来ましたので、実験することは出来そうです。(ついでに、KPIT GNURL78の
newlibもIDE4GR同梱のものを使うことにしました。) あと、hirakuni45さんがGitHubに書かれていた解説には
無かったのですが、(結局ビルド出来なかったものの)KPIT GNURL78 BINUTILSのビルドで必要とされている
bisonが含まれていませんでしたので、以下のようにインストールしました。

pacman -S bison

また、KPIT GNURL78 GCCのソースがtar.bz2でアーカイブされていましたので解凍は以下のようにしました。

tar -jxf gcc-4.8.1-20140402_rl78_v14.03.tar.bz2

なお、MSYS2の32bit版のインストーラやアーカイブファイルは以下のウェブページからダウンロードしました。

https://sourceforge.net/projects/msys2/files/Base/i686/

ちなみに、64bit版は以下のウェブページにありました。

https://sourceforge.net/projects/msys2/files/Base/x86_64/

以下はKPIT GNURL78 GCCをmake、make installした時の画面コピーです。また、事前にIDE4GRのrl78-elf
フォルダをコピーしておいたフォルダにmake installして上書きした後のフォルダの画面コピーや、上書きした
後のフォルダを元々のIDE4GRのrl78-elfフォルダとファイル一覧比較した時の画面コピーも一緒にあります。
 







追記 : メモ

MSYS2 - GitHub.io
http://msys2.github.io/

MSYS2 - SourceForge.net
https://sourceforge.net/projects/msys2/

関連記事

2016/06/19   blog-entry-788   category: RL78 /* 16bit,8bit CISC */

go page top