link もっと前
   2019年 5月 26日 -
      2019年 5月 17日  
link もっと後

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

日々

link permalink

RISC-V 64 CPU が我が家に来た

SiFive の HiFive Unleashed を購入しました。現状、世界唯一かつ最速の Linux が動作する RISC-V 64bit SoC です。

ボードには SD カードが付属しており buildroot がインストールされています。電源を入れれば Linux が起動し、ユーザ root、パスワード sifive でログインできるようになっていました。

インストールされているカーネルは、
Linux buildroot 4.15.0-00044-g2b0aa1d #1 SMP Tue Mar 20 12:18:35 PDT 2018 riscv64 GNU/Linux
でした。うーん、4.19 かと思ったら、意外と古い?

Linux と buildroot だけでは面白くないので Debian ports から riscv64 向けのパッケージを引っ張ってきて Debian の環境を構築しました。

Debian の riscv64 向けポーティングは絶賛作業中らしく、ffmpeg など用意されていないパッケージもチラホラありますが、自分で用意する手間を考えれば、使えるだけでどれだけありがたいかわかるというものです。

元の SD カードを書き潰すのは若干ためらわれた(後で元に戻せなくなった時に面倒)ので、今は chroot で使っています。

購入時の罠

Crowd Supply から購入しました。本体 $999, 送料 $40, 消費税が 5,000円くらい、合計で 11万円くらいです。SBC にしてはかなり良いお値段です。

送料を払うのですが、家には着払いで届く点にも注意しなければなりません。

UPS が米国→日本まで持ってきて、国内はクロネコヤマトが運びます。受け取りの際に、消費税を着払いでクロネコに払う必要があります。私は消費税のことを知らなくて、何で送料を 2回払うんだ??と混乱しました。

メモ: 技術系の話は Facebook から転記しておくことにした。かなり追記。

[編集者: すずき]
[更新: 2019年 5月 28日 03:30]
link 編集する

コメント一覧

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



link permalink

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]
link 編集する

コメント一覧

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



link もっと前
   2019年 5月 26日 -
      2019年 5月 17日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

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

最終更新: 8/23 23:38

カレンダー

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

最近のコメント 5件

  • link 19年07月18日
    hdk 「あっ、AAMはマニュアルのオペレーション...」
    (更新:07/25 00:02)
  • link 19年07月18日
    すずき 「AAM(ASCII Adjust AX ...」
    (更新:07/24 22:22)
  • link 19年07月18日
    hdk 「加算減算は符号のありなしどちらも命令が同...」
    (更新:07/24 07:25)
  • link 19年07月18日
    すずき 「OFをセットして例外を出したければINT...」
    (更新:07/20 11:02)
  • link 19年07月18日
    すずき 「MUL については、結果が倍のビット幅に...」
    (更新:07/20 10:56)

最近の記事 3件

link もっとみる
  • link 19年08月21日
    すずき 「[RockPro64 と linux-next とヘッドフォン] ...」
    (更新:08/23 23:38)
  • link 19年08月12日
    すずき 「[独自の apt サーバー - その 3 - apt の信頼シ] ...」
    (更新:08/12 12:13)
  • link 19年08月11日
    すずき 「[独自の apt サーバー - その 2 - apt-ftpa] ...」
    (更新:08/12 12:13)

こんてんつ

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 過去日記について

その他の情報

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