コグノスケ


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

link もっと前
2021年1月17日 >>> 2021年1月4日
link もっと後

2021年1月17日

Debian TestingとZephyr SDKその2 - パッチを当ててSDKビルドをする前に

目次: Zephyr

GDBとPython 3.9の組み合わせは、SEGVでクラッシュしました。調べてみると FedoraのBugzilla にドンピシャの情報が載っていました。Python 3.9とGDBの組み合わせが動かなかったこと、Red Hatの人がパッチを作ってくれて、5/28に修正されたこと、などが書いてあります。

Zephyr SDKのGDBは9.2(2020年5月23日リリース)で、上記のPython 3.9で動かすための修正は入っていません。残念。選択肢としては下記の2つが考えられます。

  • 10.1(2020年10月24日リリース)を使う
  • 9.2 + クラッシュを治すパッチ(リンク)を当てる

GDBのバージョンを変えると新たな厄災を招く恐れがあるため、今回は保守的に9.2 + パッチで行こうと思います。

基本(Crosstool-NG)に立ち戻る

Zephyr SDKは内部でCrosstool-NGというツールチェーンのビルドツールを利用しています。Zephyr SDKに突撃する前にCrosstool-NGの仕組みをおさらいし、9.2 + パッチでビルドする方法を試します。

Zephyr SDKのconfigs/ ディレクトリの下を見ると *.configファイルがたくさんあります。実はこれらはCrosstool-NGのコンフィグファイルです。このファイルをCrosstool-NGにコピーするとツールチェーンが作成できます。わかりやすいですね。

Zephyr SDKが持っているCrosstool-NGのコンフィグファイル
$ cd sdk-ng

$ ls configs/
arc.config    nios2.config                  xtensa_intel_byt_adsp.config
arm.config    riscv64.config                xtensa_intel_s1000.config
arm64.config  sparc.config                  xtensa_nxp_imx8m_adsp.config
i586.config   x86_64-zephyr-elf.config      xtensa_nxp_imx_adsp.config
iamcu.config  xtensa_intel_apl_adsp.config  xtensa_sample_controller.config
mips.config   xtensa_intel_bdw_adsp.config

Crosstool-NGはツールチェーンの各モジュールにパッチを当てられます。例えばGDB 9.2ならばpackages/gdb/9.2/ の下にパッチファイルを置くと、若い番号から順番にパッチ適用してくれます。

Crosstool-NGのGDB 9.2用パッチ
$ ls packages/gdb/9.2/

0000-musl_fix.patch                                 0004-allow-android.patch
0001-uclibc-no-gettimeofday-clobber.patch           chksum
0002-xtensa-make-sure-ar_base-is-initialized.patch  version.desc
0003-WIP-end-of-prologue-detection-hack.patch

このディレクトリに0005-xxxx.patchのような名前のパッチを追加すると、0004-allow-android.patchのあとにパッチを当ててくれます。便利ですね。パッチ当て処理の実装を見ましょう。

Crosstool-NGのパッチ当て実装

# crosstool-ng/scripts/functions

CT_DoExtractPatch()
{

...

            CT_Pushd "${src_dir}/${basename}"
            for d in "${patch_dirs[@]}"; do
                CT_DoLog DEBUG "Looking for patches in '${d}'..."
                if [ -n "${d}" -a -d "${d}" ]; then
                    for p in "${d}"/*.patch; do    #★パッチファイルを列挙、パッチ当てる
                        if [ -f "${p}" ]; then
                            CT_DoExecLog ALL ${patch} --no-backup-if-mismatch -g0 -F1 -p1 -f -i "${p}"
                        fi
                    done
                fi
            done

...

ビルド後にできるログbuild.logをLooking for patchesで検索していくと、パッチを当てている箇所が確認できます。

Crosstool-NGのパッチ当てログ
...

[DEBUG]    Looking for patches in 'crosstool-ng/packages/gdb/9.2'...
[DEBUG]    ==> Executing:  '/usr/bin/patch' '--no-backup-if-mismatch' '-g0' '-F1' '-p1' '-f' '-i' 'crosstool-ng/packages/gdb/9.2/0000-musl_fix.patch'
[ALL  ]    patching file gdb/linux-nat.c
[ALL  ]    patching file gdb/stopcode.h
[DEBUG]    ==> Return status 0
[DEBUG]    ==> Executing:  '/usr/bin/patch' '--no-backup-if-mismatch' '-g0' '-F1' '-p1' '-f' '-i' 'crosstool-ng/packages/gdb/9.2/0001-uclibc-no-gettimeofday-clobber.patch'
[ALL  ]    patching file gnulib/configure
[ALL  ]    patching file gnulib/import/m4/gettimeofday.m4
[DEBUG]    ==> Return status 0

...

Crosstool-NGがパッチを当てる順はシェルのファイル列挙順のため、ファイル名は必ずしも数字で始める必要はないです。しかし、前例に習ったほうが良いでしょう。パッチを0005-fix-python3.9.patchという名前で追加します。

Crosstool-NGでパッチを追加してビルド
$ git clone https://github.com/crosstool-ng/crosstool-ng
$ cd crosstool-ng

$ cat > packages/gdb/9.2/0005-fix-python3.9.patch
(パッチをコピペする)

$ ./bootstrap
$ ./configure --enable-local
$ make

$ cp ../sdk-ng/configs/riscv64.config ./.config

$ ./ct-ng menuconfig
$ ./ct-ng build

ビルド後にできるログbuild.logを確認して、パッチが当たっていることを確かめます。

Crosstool-NGのパッチ追加後のログ
...

[DEBUG]    Looking for patches in 'crosstool-ng/packages/gdb/9.2'...
[DEBUG]    ==> Executing:  '/usr/bin/patch' '--no-backup-if-mismatch' '-g0' '-F1' '-p1' '-f' '-i' 'crosstool-ng/packages/gdb/9.2/0000-musl_fix.patch'
[ALL  ]    patching file gdb/linux-nat.c
[ALL  ]    patching file gdb/stopcode.h
[DEBUG]    ==> Return status 0
[DEBUG]    ==> Executing:  '/usr/bin/patch' '--no-backup-if-mismatch' '-g0' '-F1' '-p1' '-f' '-i' 'crosstool-ng/packages/gdb/9.2/0001-uclibc-no-gettimeofday-clobber.patch'
[ALL  ]    patching file gnulib/configure
[ALL  ]    patching file gnulib/import/m4/gettimeofday.m4
[DEBUG]    ==> Return status 0

...

[DEBUG]    ==> Executing:  '/usr/bin/patch' '--no-backup-if-mismatch' '-g0' '-F1' '-p1' '-f' '-i' 'crosstool-ng/packages/gdb/9.2/0005-python3.9.patch'
[ALL  ]    patching file gdb/python/python.c
[ALL  ]    Hunk #1 succeeded at 234 (offset -4 lines).
[ALL  ]    Hunk #2 succeeded at 271 (offset -4 lines).
[ALL  ]    Hunk #3 succeeded at 952 (offset -19 lines).
[ALL  ]    Hunk #4 succeeded at 1552 (offset -68 lines).
[ALL  ]    Hunk #5 succeeded at 1720 (offset -70 lines).
[ALL  ]    patch unexpectedly ends in middle of line
[DEBUG]    ==> Return status 0

GDBの開発メールアーカイブから適当にコピペしてパッチを作ったので、Hunkがずれてるよって怒られましたが、パッチ当ては成功しています。あまり気にしなくても良いでしょう。ビルド後は動作確認しましょう。

Crosstool-NGでパッチ追加後のバイナリ動作確認
$ cd ~/x-tools/riscv64-zephyr-elf/bin

$ ./riscv64-zephyr-elf-gdb --version

GNU gdb (crosstool-NG 1.24.0.254_fcf3233) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

動きました。良かった良かった。

編集者:すずき(2023/09/24 12:01)

コメント一覧

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



2021年1月16日

RISC-V QEMUのデバッグ用ビルド方法

目次: RISC-V

たまにRISC-V向けのQEMUの動きを見たいときがあって、デバッグビルドをするのですが、やり方を忘れがちなのでメモしておきます。

QEMUビルド

$ mkdir build
$ cd build

$ ../configure --target-list=riscv32-softmmu,riscv32-linux-user,riscv64-softmmu,riscv64-linux-user \
    --disable-docs --enable-debug

...

qemu 5.2.50

                   Install prefix: /usr/local
                   BIOS directory: share/qemu
                    firmware path: /usr/local/share/qemu-firmware
                 binary directory: bin
                library directory: lib
                 module directory: lib/qemu
                libexec directory: libexec
                include directory: include
                 config directory: /usr/local/etc
            local state directory: /usr/local/var
                 Manual directory: share/man
                    Doc directory: /usr/local/share/doc

...

                 thread sanitizer: NO
                         rng-none: NO
                    Linux keyring: YES
                     FUSE exports: NO
                       FUSE lseek: NO

  Subprojects
                    libvhost-user: YES

Found ninja-1.10.1 at /usr/bin/ninja

$ ninja

ビルドが成功するとbuildディレクトリ以下にqemu-system-riscv32やqemu-system-riscv64が生成されているはずです。

編集者:すずき(2021/07/15 20:35)

コメント一覧

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



2021年1月14日

Debian TestingとZephyr SDKその1 - 自分でSDKをビルド

目次: Zephyr

開発用のマシンではDebian Testingを使っているのですが、久しぶりにdist-upgradeしたところPython 3.8が消えてしまいました。Python 3.9に移行したみたいです。

アップデート時は「そうなんだ、3.9になったんだな。」くらいの認識でスルーしまいたが、Zephyrを使おうとしたら異変に気づきました。なんとZephyr SDKのGDBが動きません。どうしてこうなった。

GDBを起動するとエラー
$ riscv64-zephyr-elf-gdb
riscv64-zephyr-elf-gdb: error while loading shared libraries: libpython3.8.so.1.0: cannot open shared object file: No such file or directory

Debianは元々Zephyr SDKのサポート範囲に入っていない(Ubuntuのみ)ですし、Debian Testingなんてサポートされるはずがないので、自力で解決する必要があります。

Zephyr SDKのビルド

Zephyr SDKのビルド手順は簡単ですが、Debian Testingだとうまくいきません。

Zephyr SDKのビルド
$ git clone https://github.com/zephyrproject-rtos/sdk-ng
$ cd sdk-ng

$ ./go.sh riscv64
./go.sh: 行17: python: コマンドが見つかりません

Pythonが見つからず怒られます。Debian Testingは /usr/bin/pythonがなくなったため、go.shのpythonをpython3に書き換えてあげると動きます。他にもPython 3.8を想定している箇所があるので、Python 3.9に直します。

Zephyr SDK改変(RISC-V 64向け)

diff --git a/configs/riscv64.config b/configs/riscv64.config
index 295f2c0..a9fc301 100644
--- a/configs/riscv64.config
+++ b/configs/riscv64.config
@@ -46,5 +46,5 @@ CT_CC_LANG_CXX=y
 CT_CC_GCC_LIBSTDCXX_NANO=y
 CT_DEBUG_GDB=y
 CT_GDB_V_9_2=y
-CT_GDB_CROSS_PYTHON_BINARY="python3.8"
+CT_GDB_CROSS_PYTHON_BINARY="python3.9"
 CT_GDB_CROSS_BUILD_NO_PYTHON=y
diff --git a/go.sh b/go.sh
index e5442fa..7a45fd8 100755
--- a/go.sh
+++ b/go.sh
@@ -14,7 +14,7 @@ fi
 
 COMMIT="d7da3a9c7f0f3a90bb4c71b91aea6cbc2471a541"
 GITDIR=${PWD}
-JOBS=$(python -c 'import multiprocessing as mp; print(mp.cpu_count())')
+JOBS=$(python3 -c 'import multiprocessing as mp; print(mp.cpu_count())')
 
 unameOut="$(uname -s)"
 unameMachine="$(uname -m)"

SDKはbuild/output以下に生成されます。RISC-V 64であればbuild/output/riscv64-zephyr-elfです。生成されたバイナリが動くか確かめましょう。

生成されたGDBを実行
$ cd build/output/riscv64-zephyr-elf/bin

$ ./riscv64-zephyr-elf-gdb
Segmentation fault

SEGVで死にました。うーん、だめそうですね……。次回以降、直せないかトライします。

編集者:すずき(2023/09/24 12:01)

コメント一覧

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



link もっと前
2021年1月17日 >>> 2021年1月4日
link もっと後

管理用メニュー

link 記事を新規作成

<2021>
<<<01>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント5件

  • link 24年6月17日
    Bobさん (06/04 09:25)
    「BindIPv6Only=no does...」
  • link 18年8月12日
    すずきさん (05/29 16:57)
    「コメントありがとうございます。\n\nこ...」
  • link 18年8月12日
    ARM926EJ-Sさん (05/29 14:27)
    「この記事が書かれたのは2018年ですが、...」
  • link 17年9月3日
    すずきさん (05/26 23:59)
    「>ちょさんさん\nご参考になれば幸いです...」
  • link 17年9月3日
    ちょさんさん (05/26 20:34)
    「自分もこの機種と全く同じCN-SP700...」

最近の記事20件

  • link 20年10月23日
    すずき (05/29 16:53)
    「[ROCK64/ROCKPro64 - まとめリンク] 目次: ROCK64/ROCKPro64[ROCK64] ROCK64ブート...」
  • link 18年8月12日
    すずき (05/29 16:53)
    「[ARM PCで開発できるか?] 目次: ROCK64/ROCKPro64最近のARM搭載SoCはかなり速くなっています。もし...」
  • link 18年12月15日
    すずき (05/29 16:52)
    「[ARMワンボードPCのネットワーク速度] 目次: ROCK64/ROCKPro64Raspberry Pi対抗ボードの多くは...」
  • link 21年5月22日
    すずき (05/29 16:50)
    「[ベンチマーク - まとめリンク] 目次: ベンチマーク一覧が欲しくなったので作りました。USB HDD RAIDのベンチマー...」
  • link 06年5月17日
    すずき (05/29 16:49)
    「[ディスクI/Oベンチマークプログラム] 目次: ベンチマーク研究室のゼミの後に、明日のシス情セミナーの発表練習を行いました。...」
  • link 06年5月15日
    すずき (05/29 16:45)
    「[USB HDD RAIDのベンチマーク] 目次: ベンチマーク昨日作成したRAID0+1の書き込み性能を測定しました。やはり...」
  • link 25年5月24日
    すずき (05/25 22:25)
    「[メガネが壊れた] 金曜日、メガネの鼻当てが曲がってんなー?と思って、元の位置に戻そうと指で押したらパキっと音がして折れました...」
  • link 25年5月25日
    すずき (05/25 21:53)
    「[JTSA Unlimited大会参加2025] 目次: 射的JTSA Unlimitedの大会に参加しました。「木」ステージ...」
  • link 22年3月18日
    すずき (05/25 21:41)
    「[射的 - まとめリンク] 目次: 射的関係の深いまとめリンク。目次: Arduino一覧が欲しくなったので作りました。ガスガ...」
  • link 25年5月9日
    すずき (05/23 23:31)
    「[JavaとM5Stamp C3とBluetooth LE - Bluetoothデバイスとの通信改善] 目次: Arduin...」
  • link 23年6月2日
    すずき (05/23 23:31)
    「[Arduino - まとめリンク] 目次: Arduino関係の深いまとめリンク。目次: 射的一覧が欲しくなったので作りまし...」
  • link 23年4月10日
    すずき (05/23 22:59)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年4月25日
    すずき (05/23 22:59)
    「[ImageMagickでAVIFを変換] 目次: LinuxAVIFが読めないアプリケーションがたまにあるので、AVIF(A...」
  • link 25年5月23日
    すずき (05/23 22:30)
    「[デバッグ用のlibcを使って実行する方法(ダイナミックリンク編)] 目次: C言語とlibcCライブラリのデバッグをしたいと...」
  • link 22年4月13日
    すずき (05/23 22:30)
    「[C言語とlibc - まとめリンク] 目次: C言語とlibcC言語について。プログラムの落とし穴、演算子の優先順位標準入力...」
  • link 25年5月22日
    すずき (05/23 22:21)
    「[デバッグ用のlibcを使って実行する方法(スタティックリンク編)] 目次: C言語とlibcCライブラリのデバッグをしたいと...」
  • link 25年5月20日
    すずき (05/23 03:18)
    「[glibcのsigprocmask()とpthread_sigmask()の実装] 目次: C言語とlibc以前、シグナルマ...」
  • link 23年6月1日
    すずき (05/23 00:38)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 25年5月16日
    すずき (05/23 00:37)
    「[フォントがおかしいので直した] 目次: 自宅サーバーこのブログ、フォント設定が2つほどおかしかったので直しました。今まで見づ...」
  • link 23年5月15日
    すずき (05/22 00:23)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替えるとしたら?FTO...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
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 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

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

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 06/04 09:25