link もっと前
   2019年 5月 23日 -
      2019年 5月 14日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

link 編集する

GCC を調べる - その 2 - デバッグ環境

GCC をデバッグする入り口まで辿り着くのも案外大変だったので、方法を書き残しておこうと思います。

GCC はコンパイラ?

C 言語(じゃなくても良いですが)をコンパイルする際に、gcc a.c のようにコマンドを起動します。一般的に gcc コマンドをコンパイラと呼びますが、正確にいえば gcc はコンパイラドライバ(コンパイラ、アセンブラ、リンカを順に呼び出すプログラム)です。

GCC の場合、コンパイラは cc1 という名前で、コンパイラドライバ gcc とは別のプログラムとして存在します。コンパイラの役目は高級言語(C なら *.c ファイル)からアセンブリ言語(*.s ファイル)に変換することです。

Debian の GCC 8.0 だと /usr/lib/gcc/x86_64-linux-gnu/8/cc1 に置かれています。クロスコンパイラの場合は様々ですが、crostool-NG で RISC-V 64bit Linux 向けにビルドした場合(ビルド方法は 2019年 2月 26日の日記参照)は、~/x-tools/riscv64-unknown-linux-gnu/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/cc1 に置かれます。ローカルビルドしないときは、~/x-tools をクロスコンパイラをインストールしたディレクトリで読み替えてください。

コンパイラだけ起動したい

デバッガでコンパイラを追うとき、コンパイラドライバ → コンパイラだと余計な処理がたくさん挟まって邪魔なので、コンパイラ単体で起動したくなりますよね?私はなりました。特に気にならない人は読み飛ばしてください。

コンパイラ cc1 のオプションは、コンパイラドライバ gcc に渡したオプション以外にも、cc1 用のオプションが渡されます。そのため cc1 をシェルなどから手打ちで起動するのはちょっと難しいです。

しかし無理してコンパイラ cc1 のオプションを調べずとも、コンパイラドライバ gcc が渡すオプションをそのままパクれば良いです。gcc/gcc.c の execute() 関数を下記のように書き換えると、cc1 の起動オプションが表示されます。

コンパイラドライバ gcc がコンパイラ cc1 に渡す引数を表示

diff --git a/gcc/gcc.c b/gcc/gcc.c
index a716f708259..e48e5cca79b 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -3084,6 +3084,12 @@ execute (void)
       const char *errmsg;
       int err;
       const char *string = commands[i].argv[0];
+      int kkk;
+
+      printf("\n------------------------------\n");
+      for (kkk = 0; commands[i].argv[kkk]; kkk++)
+            printf("%s ", commands[i].argv[kkk]);
+      printf("\n------------------------------\n");
 
       errmsg = pex_run (pex,
 			((i + 1 == n_commands ? PEX_LAST : 0)

出力は下記のようになります。この例では、コンパイラは RISC-V 32bit ベアメタル向けを使っています。

コンパイラのオプション例
------------------------------
/home/katsuhiro/share/projects/oss/crosstool-builder-new/buildroot/libexec/gcc/riscv32-unknown-elf/8.3.0/cc1 -quiet a.c -quiet -dumpbase a.c -march=rv32gc -mabi=ilp32d -auxbase a -o /tmp/ccdd2F4Z.s
------------------------------

この情報があれば、コマンドラインから単独で起動できますし、GDB で追うこともできます。

GDB で cc1 をデバッグ
$ gdb /home/katsuhiro/share/projects/oss/crosstool-builder-new/buildroot/libexec/gcc/riscv32-unknown-elf/8.3.0/cc1

(gdb) b main
Breakpoint 1 at 0x4308a0: main. (2 locations)

(gdb) r a.c -dumpbase a.c -march=rv32gc -mabi=ilp32d -auxbase a -g -O0 -Wall -fdump-tree-all-raw -fdump-rtl-all -o a.s
Starting program: /home/katsuhiro/share/projects/oss/crosstool-builder-new/buildroot/libexec/gcc/riscv32-unknown-elf/8.3.0/cc1 a.c -dumpbase a.c -march=rv32gc -mabi=ilp32d -auxbase a -g -O0 -Wall -fdump-tree-all-raw -fdump-rtl-all -o a.s

Breakpoint 1, main (argc=15, argv=0x7fffffffd3c8)
    at /home/katsuhiro/share/projects/oss/crosstool-builder-new/./gcc/gcc/main.c:36
36        toplev toplev (NULL, /* external_timer */

ブレークポイントなども仕掛けられますし、変数の値を表示することもできます。解析がかなり楽になるはずです……たぶん。

[編集者: すずき]
[更新: 2019年 5月 22日 01:47]

コメント一覧

  • hdk 
    実際に試したわけではないので素朴な疑問なのですが、cc1の引数はgcc -vで出る内容から-vと-versionあたりを外したものとは違うんでしょうか? 
    (2019年05月23日 21:07:06)
  • すずき 
    試してみたら、同じみたいです。
    わざわざ改造しなくても、-v の方が簡単ですね。 
    (2019年05月25日 10:35:00)
open/close この記事にコメントする



link permalink

link 編集する

ARM SBC リスト

最近はたくさんの ARM のシングルボードコンピュータ(SBC)が市販されています。嬉しい時代になりました。これからのお買い物の参考としてリストアップしました。値段は変動するので参考です。

NVIDIA Parker
ボード Jetson TX2、Denver/2GHz x 2、A57/2GHz x 4、8GB LPDDR4、16nm、$600
NVIDIA Tegra X1
ボード Jetson TX1、A57/1.9GHz x 4、4GB LPDDR4、20nm、$500
HiSilicon Kirin 970
ボード HiKey 970、A73/2.36GHz x 4、A53/1.8GHz x 4、6GB LPDDR4-1866、10nm、$299
HiSilicon Kirin 960
ボード HiKey 960、A72 x 4、A53 x 4、3GB LPDDR4、16nm FinFET、$239
MediaTek Helio X20
ボード MediaTek X20、A72/2.1GHz x 2、A53/1.95GHz x 4、A53/1.4GHz x 4、2GB LPDDR3、$199
Rockchip RK3399
ボード NanoPC-T4、A72/2GHz x 2、A53/1.5GHz x 4、4GB LPDDR3-1866、$109
Samsung S5P6818
ボード NanoPC-T3 Plus、A53/1.4GHz x 8、2GB DDR3、$75
Amlogic S912
ボードが見当たらない、A53 x 8、
AllWinner H6
ボード PINE H64、A53 x 4、2GB LPDDR3-1600、$36

少し古い世代の SoC を採用したボード達です。

Amlogic S905
ボード ODROID C2、A53/1.5GHz x 4、2GB DDR3、$39
Rockchip RK3328
ボード ROCK64、A53/1.4GHz x 4、4GB LPDDR3-1866、$24.95 (1GB) $34.95 (2GB) $44.95 (4GB)
AllWinner H5
ボード NanoPi NEO2、A53/1.5GHz x 4、1GB DDR3、$20
Broadcom BCM2837B
ボード Raspberry Pi 3 Model B、A53/1.2GHz x 4、1GB LPDDR2、28nm、$35

以前(2018年 8月 12日の日記参照)載せた情報も含んでいます。

[編集者: すずき]
[更新: 2019年 5月 25日 11:32]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2019年 5月 23日 -
      2019年 5月 14日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 5/31 01:18

カレンダー

<2019>
<<<05>>>
---1234
567891011
12131415161718
19202122232425
262728293031-

最近のコメント 5件

  • link 20年05月02日
    すずき 「ちょっと調べたところ、コアが焼けると騒ぎ...」
    (更新:05/08 15:43)
  • link 20年05月02日
    すずき 「結構、怖い制御に見えますね&hellip...」
    (更新:05/08 15:23)
  • link 20年05月02日
    hdk 「デスクトップ用のNVIDIA Quadr...」
    (更新:05/07 20:30)
  • link 20年01月27日
    すずき 「詳細は調べていないので、コード中のコメン...」
    (更新:04/18 23:05)
  • link 20年01月27日
    superzeros 「少し気になったのでglibcの履歴を調べ...」
    (更新:04/16 21:07)

最近の記事 3件

link もっとみる
  • link 20年06月01日
    すずき 「[GCC を調べる - その 13-4 - ベクトル命令のオフ] ...」
    (更新:05/31 01:18)
  • link 20年05月31日
    すずき 「[GCC を調べる - その 13-3 - オフセット付きアド] ...」
    (更新:05/30 22:00)
  • link 20年05月30日
    すずき 「[GCC を調べる - その 13-2 - オフセット付きアド] ...」
    (更新:05/30 21:53)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報