日報 2024.12.14
先日組んだ兄貴のJONSBO N2マシン、Windows起動後に”回復”要求が出るようになってしまったのでPC持ってきてもらって調査開始。
その前に小6のガキも連れて来たようなので自宅VR DDRプレイさせる。思ったよりスジが良くておかしいなと思ったら「ビートバトル」なるスマホゲーやってたっぽい。なんやねんそれ。
絶対アカンやつやろシリーズ。
ちょっとサーベイするとビートバトルは正確にはダンレボのパクりゲーではなく”Friday Night Funkin'”というゲームのパクりゲーっぽい。
いやコレもどうやねん?って思ったけど座ってるねーちゃんがデフォルメエッチやから許したわ。
JONSBO N2マシン修理開始。原因はよくわからんのでてっとり早く買っといたキオクシアの新品SSDに交換、も、なぜかUEFIで20MBしか認識せず”PS3111″と表示される。
全くわからんのでサーベイしたらどうもチップセットの型番が表示されてて、つまり故障らしい。新品やぞ。
諦めて返品しようと思って最後にダメ元でCMOSクリアして再チャンレジしたら普通に認識した。完全に不明。ちょっと怖いけど交換して返品受付期間の間動作チェックして経過観察。
今のWindowsはオフラインだとインストール続行すら出来ない鬼畜仕様なのでコマンドプロンプト出して裏コマンドを入れないとダメ。バカたれが。Shift+F10でコマンドプロンプトが出るので oobe\BypassNRO.cmd
というコマンドを入れて再起動するとオフラインで続行みたいなボタンが出る。アホか。
エリート飯。
電光表札ソフトウェア続き。
ラズパイZeroのC/C++開発環境の用意。あらすじ、リモートWin側でクロスコンパイルしたい。
Rasberrypi/toolsにクロスコンパイラがあるっぽいけど古くて非推奨です、例えばaptから取ってねと書いてる。
These toolchains are deprecated. They are outdated and easily available from other sources (e.g. direct from Ubuntu apt). e.g.
12 sudo apt-get install gcc-arm-linux-gnueabihfThere is also an aarch64 version:
12 sudo apt-get install gcc-aarch64-linux-gnuNote: if building for Pi0/1 using
--with-arch=armv6 --with-float=hard --with-fpu=vfp
is recommended (and matches the default flags of the toolchains included here).
今回はWindowホストでやるのでWindows用にビルドされたコンパイラ無いか調べる。
WSL使ってもいいけどシンプルにやってみる。
Arm公式にありそう。
Pi Zeroは32bit CPUなので AArch32 GNU/Linux target with hard float (arm-none-linux-gnueabihf)
、
arm-gnu-toolchain-14.2.rel1-mingw-w64-x86_64-arm-none-linux-gnueabihf.exe をインストール。
PATH環境変数に追加しておく。
適当に以下コマンドでコンパイルして出た “a.out” をラズパイに送って実行。
arm-none-linux-gnueabihf-g++ main.cpp
実行
`$ ./a.out
Segmentation fault
なるへそ、パイゼロはARMv6だからコンパイルオプション変えろ書いてたな。
1 2 3 4 5 |
arm-none-linux-gnueabihf-g++ main.cpp --with-arch=armv6 --with-float=hard --with-fpu=vfp arm-none-linux-gnueabihf-g++: error: unrecognized command-line option '--with-arch=armv6' arm-none-linux-gnueabihf-g++: error: unrecognized command-line option '--with-float=hard' arm-none-linux-gnueabihf-g++: error: unrecognized command-line option '--with-fpu=vfp' |
? GCC経験が年齢に伴っていないのでサーベイ。
- 仙石浩明の日記: __sync_bool_compare_and_swap_4 とは何か? ~ glibc をビルドする場合は、 gcc の –with-arch=i686 configure オプションを使ってはいけない
- Ubuntu上でRaspberry Pi Zero向けクロスコンパイル事始め #Linux – Qiita
なるへそ、–with オプションはデフォルト設定のためのconfigureオプション。コンパイル時に設定を変える場合は -m オプション。
ちなみにコンパイラのデフォルトオプションは-vオプションで確認できる。--with-arch=armv7-a
で、ARMv7向けにコンパイルされる事が分かる。
1 2 3 4 5 6 7 8 9 |
arm-none-linux-gnueabihf-g++ -v Using built-in specs. COLLECT_GCC=arm-none-linux-gnueabihf-g++ COLLECT_LTO_WRAPPER=C:/Program\ Files\ (x86)/Arm\ GNU\ Toolchain\ arm-none-linux-gnueabihf/14.2\ rel1/bin/../libexec/gcc/arm-none-linux-gnueabihf/14.2.1/lto-wrapper.exe Target: arm-none-linux-gnueabihf Configured with: /data/jenkins/workspace/GNU-toolchain/arm-14-8/src/gcc/configure --target=arm-none-linux-gnueabihf --prefix= --with-sysroot=/arm-none-linux-gnueabihf/libc --with-build-sysroot=/data/jenkins/workspace/GNU-toolchain/arm-14-8/build-mingw-arm-none-linux-gnueabihf/install//arm-none-linux-gnueabihf/libc --with-bugurl=https://bugs.linaro.org/ --enable-gnu-indirect-function --enable-shared --disable-libssp --disable-libmudflap --enable-checking=release --enable-languages=c,c++,fortran --with-gmp=/data/jenkins/workspace/GNU-toolchain/arm-14-8/build-mingw-arm-none-linux-gnueabihf/host-tools --with-mpfr=/data/jenkins/workspace/GNU-toolchain/arm-14-8/build-mingw-arm-none-linux-gnueabihf/host-tools --with-mpc=/data/jenkins/workspace/GNU-toolchain/arm-14-8/build-mingw-arm-none-linux-gnueabihf/host-tools --with-isl=/data/jenkins/workspace/GNU-toolchain/arm-14-8/build-mingw-arm-none-linux-gnueabihf/host-tools --host=x86_64-w64-mingw32 --with-arch=armv7-a --with-fpu=neon --with-float=hard --with-mode=thumb --with-arch=armv7-a --with-libiconv-prefix=/data/jenkins/workspace/GNU-toolchain/arm-14-8/build-mingw-arm-none-linux-gnueabihf/host-tools --enable-mingw-wildcard --with-pkgversion='Arm GNU Toolchain 14.2.Rel1 (Build arm-14.52)' Thread model: posix Supported LTO compression algorithms: zlib gcc version 14.2.1 20241119 (Arm GNU Toolchain 14.2.Rel1 (Build arm-14.52)) |
実行。
1 2 |
arm-none-linux-gnueabihf-g++ main.cpp -march=armv6 -mfloat=hard -mfpu=vfp arm-none-linux-gnueabihf-g++: error: unrecognized command-line option '-mfloat=hard'; did you mean '-mfloat-abi=hard'? |
よくわからんけど言われるがまま修正
1 2 3 4 5 |
arm-none-linux-gnueabihf-g++ main.cpp -march=armv6 -mfloat-abi=hard -mfpu=vfp main.cpp: In function 'int test()': main.cpp:3:10: sorry, unimplemented: Thumb-1 'hard-float' VFP ABI 3 | int test() | ^ |
コンパイルできない。
さっきのPi Zero向けのクロスコンパイル設定を真似して-march=armv6
だけにしてみる。
1 2 3 4 5 |
arm-none-linux-gnueabihf-g++ main.cpp -march=armv6 main.cpp: In function 'int test()': main.cpp:3:10: sorry, unimplemented: Thumb-1 'hard-float' VFP ABI 3 | int test() | |
変わらず。
記事の方はよくみたら hard float版じゃないコンパイラ使ってる。
sudo apt install g++-arm-linux-gnueabi
gnueabi、Windows用にビルドされたやつがなさそうなので観念してWSLでインストールしてコンパイルしてみる。
GOマンボ。
$ arm-linux-gnueabi-gcc main.cpp -march=armv6
いけた。a.outをラズパイで実行してみる。
1 |
-bash: ./a.out: cannot execute: required file not found |
あかん。実行ファイルチェック。
1 2 3 4 |
$ file ./a.out ./a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, BuildID[sha1]=99cdaf310a9b06432656311caf0a89d01c694823, for GNU/Linux 3.2.0, not stripped |
最初にgnueabihfでコンパイルしたほうも調べてみる。
1 |
./a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, with debug_info, not stripped |
/lib/ld-linux-armhf.so.3 じゃないとダメっぽい。
こういう情報があったのでFPU確認してみる。
Featuresにvfpって入ってる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cat /proc/cpuinfo processor : 0 model name : ARMv6-compatible processor rev 7 (v6l) BogoMIPS : 697.95 Features : half thumb fastmult vfp edsp java tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xb76 CPU revision : 7 Hardware : BCM2835 Revision : 9000c1 Serial : 00000000a0d5d212 Model : Raspberry Pi Zero W Rev 1.1 |
Raspberry Pi Zero Wの古いリビジョンだったらFPU(VFP)が入ってないやつがあって、それだとarm-linux-gnueabi-gccでコンパイルするやつで動かせるって事…?
もしかしたらコンパイラを自分でビルドする必要があるのかも。
その前に古くて非推奨って書いてたラズパイ公式のtoolsで試してみるか。
ひとまずエリート飯。
AbemaTVで適当に流してた異世界チャンネルで「ソードアートオンライン アリシゼーション」を途中から、”キリトかなーやっぱ”しか知らない知識で結局最後まで観てしまった。
ツンデレアリスが途中で豚まん2個喰おうとしたところがピーク。キリトが勇次郎からアリスを寝取って終わりて事でOKでしょうか。勇次郎可愛そうすぎる。最初から観てへんからアレやけどキリトって嫁はんおらんかったか?2クール目があるらしくよくわからんとこで終わった。
おわい
僕はめんどくさいからラスパイでコンパイルしてるわ。
VS CodeのRemote-SSH使ったら楽にできるんちゃうかな。
ラズパイではコンパイルできてるんですがRemote-SSHがPi Zero 1は対応してなくて面倒臭いんですよね…。
今日ラズパイコンパイル方式で開発にしようかと諦めかけたその時以下の誰かが作ったコンパイラ使ったらいけましたわ。感謝。
tttapa/docker-arm-cross-toolchain: Modern GCC cross-compilation toolchains for Raspberry Pi
https://github.com/tttapa/docker-arm-cross-toolchain?tab=readme-ov-file