crosstool-ngを使用してRaspberryPi4用のクロスコンパイラーをどのように組み立てたかをお話ししたいと思います。おそらく誰かがそのトピックがあまりにも原始的で退屈だと思うでしょう。最初はクロスコンパイラーを早く組み立てられると思っていたのですが、いじくり回して調べないといけなかったので、意外なニュアンスがありました。次に、私が何をどのように行ったかを説明します。
おそらく、あなたが自分自身に尋ねる必要がある最初の質問は、「クロスコンパイラーは何のためにあるのか?」です。実際、Raspberry Pi4は非常に高速であり、その上でプログラムをコンパイルできます。プロジェクトが単純な場合、そうすることはかなり可能です。しかし、プロジェクトが成長してより複雑になると、クロスコンパイルに切り替える方がすでに良いでしょう。そうすれば、他の問題を解決するのが簡単になります。たとえば、統合サーバーでプロジェクトの自動アセンブリを整理できます。高速なPCでクロスコンパイルすると、ビルド速度が大幅に向上し、PCでプログラムを編集するためのより優れたツールを見つけることができます。
2番目の質問:「既製のクロスコンパイラーを使用できますか?なぜ自分で集めるの?」実を言うと、私はラズベリー用の通常のクロスコンパイラーを見つけていません。多分私はひどく見ていましたか?上の ラズベリーからgithubのツールプロジェクトがあり、いくつかのクロスコンパイラがありますが、それらは古いものです!さて、何がありますか?バージョン4.9.3?どういうわけか深刻ではありません。 Linaroのダウンロードページには、バージョン7.5しか表示されませんが、すでに優れていますが、まず、Raspberry Buster OS自体ではバージョン8.3がすでに使用されており、次に、Linaroコンパイラはいくつかのパッチを適用した後にのみ機能しました。ちょっと変です…
Linaroコンパイラを実行しようとした後、自分でクロスコンパイラを作れるのではないかと思いました。私はすでにcrosstool-ngの経験があります。AmberSoC用のクロスコンパイラをやっていた 。
アセンブリの複雑さは何ですか? crosstool-ngツールには、常に明確であるとは限らないさまざまな設定があります。私のラップトップでクロスコンパイラを構築するには、約45分かかります。設定を間違えると、結果のクロスコンパイラはどういうわけかそのように機能しないか、何かを収集しないか、収集しますが、結果のバイナリはRaspberryで実行されません。結果のクロスコンパイラを確認した後、設定を変更して、最初から生成し直す必要がありました。さて、それが私が望むようにうまくいくまで、私はいくつかの試みをしました。
おそらく、私が最初に本当に理解していなかった主なことは、コンパイラがオペレーティングシステムと一致しなければならないということです。少し奇妙に見えますが、そのようになります。実際、OSにはすでに標準のc / c ++ライブラリが含まれています。それらは一連の関数をエクスポートします。クロスコンパイラによって生成されるコードには、これらのライブラリ関数への呼び出しが含まれている必要があります。したがって、クロスコンパイラ自体とコードが生成されるOSのライブラリのバージョンが一致している必要があります。
クロスコンパイラを作ってみましょう。
手順は次のとおりです
。1)次のパッケージがホストシステムにインストールされていることを確認します(Ubuntu 18を使用しています)。
gcc g++ gperf bison flex texinfo help2man make libncurses5-dev python3-dev autoconf automake libtool libtool-bin gawk wget bzip2 xz-utils unzip patch libstdc++6 rsync git
何かが足りない場合は、sudo aptinstallを介してインストールする必要があります。
2)ウェブサイトからcrosstool-ngバージョン1.24.0をダウンロードします。
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.24.0.tar.bz2
3)結果のアーカイブを解凍します。
tar xjf crosstool-ng-1.24.0.tar.bz2 cd crosstool-ng-1.24.0
4)crosstool-ngをまとめる:
./configure make make install
5)crosstool-ngへのパッチ適用
これはかなり奇妙なアクションですが、それなしでは良い結果は得られませんでした。このパッチがないと、クロスコンパイラーはデフォルトでsysrootに関連する/ usr / lib / arm-linux-gnueabihfフォルダー内のライブラリーの検索を拒否しました。
パッチは非常にラズベリーで入手する必要があります。
OSバスターがインストールされたラズベリーpi4(これは重要です。私はこの特定のOS用のクロスコンパイラーを作成しています)では、binutilsソースを取得する必要があります。
sudo apt install binutils-source
/usr/src/binutils/patches/129_multiarch_libpath.patch
ホストコンピュータのcrosstool-ng-1.24.0 / packages / binutils /2.31.1フォルダに置いたこのファイルを参照してください 。Raspberry Pi OS Buster自体では、binutilsのバージョンは2.31.1であるため、このフォルダーに配置することが重要です。ラズベリーのコンソールのコマンドでこれを確認してください。
ld --version
さらに、スクイーズのためにOS上にあるGLIBを確認する必要があります。
ldd --version
Busterには2.28があります。つまり、このバージョンのGLIB2.28ではcrosstool-ng自体を構成する必要があります。デフォルトでは別のバージョンがあります。これが行われない場合、クロスコンパイラはバスターOSのラズベリーで実行されないコードを生成します-バイナリは外部ライブラリに存在しない関数を参照できます。
6)初期のcrosstool-ng構成を準備する
crosstool-ng自体にはすでにかなりの数の典型的な構成があります。これを含め、RaspberryPi3に必要な構成と非常によく似た構成があります。
可能なすべての構成のリストは、次のコマンドで表示できます。
./ct-ng list-samples
次に、選択した構成を次のコマンドで「アクティブ化」する必要があります。
./ct-ng armv8-rpi3-linux-gnueabihf
新しい構成ファイル.configが表示されます。これは、将来のクロスコンパイラーのプロパティを完全に定義します。今、それは少し修正する必要があります。手動で編集できますが、メニューから修正する方が簡単です。
./ct-ng menuconfig
最初のメニューは次のようになります
。7)次に、奇妙なオプションを変更します。オプションの場合もあります。
Raspberryのクロスコンパイラーの作成について少なくとも何かが書かれているほとんどすべての場所で、「ツールチェーンを読み取り専用にする」オプションのチェックを外すように書いています。この設定は、[パスとその他のオプション]メニューにあります。 crosstool-ngのドキュメントには、コンパイルされたプログラムがコンパイラ自体のsysrootに誤ってインストールされないように、デフォルトで結果のコンパイラは読み取り専用になると記載されています。私の意見では、これは完全に合理的な決定です。なぜここからダニを取り除くために作者が書いているのか分かりません...
8)次へ。 「ターゲットオプション」項目に移動し、スクリーンショットに従って値を設定します:
実際、Raspberry Pi4にはCortex-A72プロセッサが搭載されており、これはメニューで割り当てることができます。ただし、Pi4だけでなく、Pi3用にもコンパイルするため、Cortex-A53は自分用に保管しました。ただし、-mcpu = cortex-a72コマンドラインパラメーターを使用してgccコンパイラーを起動するときに、正確な設定をすでに指定できます。
また、クロスコンパイラーがRaspberryボード自体のコンパイラーとまったく同じタプルを持つことを好むことも付け加えたいと思います。つまり、最終的なコンパイラはarm-linux-gueabihfだけになります。それは私にとって簡単です。多くの既存のパッケージには、コンパイラがarm-linux-gnueabihfに割り当てられている既製のcmakeファイルが含まれています。これらすべてのcmakeファイルを手動で修正して、armv8-mygcc-linux-gnueabihfのようなものをそこに記述したくありませんか?これを行うには、「ターゲットタプルのベンダー部分を省略する」オプションをオフにします。
9)「バイナリユーティリティ」メニューに移動してbinutils 2.31.1バージョンをインストールします(まだパッチがあることを覚えていますか?)
10)「オペレーティングシステム」メニューに移動してカーネルバージョン4.20をインストールします
実際、Raspberry Buster OSにはすでに5.10カーネルがありますが、最大でインストールできるのは4.20です
。11
)[ C-libraries]メニューに移動し、GLIB 2.28バージョンをインストールします。12 )[C-compiler]に移動します。メニュー
将来のクロスコンパイラ8.3.0の目的のバージョンをインストールし、コアgcc追加構成コンパイラ設定に--enable-multiarchオプションを追加します。クロスコンパイラがパス/ usr / lib / arm-linux-gnueabihfに沿ってsysroot内のライブラリを見つけることが重要です
。ここで、すべてのメニューを終了し、要求されたときに行った変更を保存して、ビルドを開始します。
13)組み立ては簡単なコマンドで実行されます:
export DEB_TARGET_MULTIARCH=arm-linux-gnueabihf ./ct-ng build
待たなければなりません。ラップトップで組み立てるのに約45分かかりました。ビルド後、新しいクロスコンパイラーはパス〜/ x-tools / arm-linux-gnueabihfにあり
ます。クロスコンパイラーがデフォルトで使用するライブラリパスを確認できます。パス/ usr / lib / arm-linux-gnueabihfを検索しますか?
これを行うには、次のコマンドを実行します。
~/x-tools/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ld --verbose | grep "SEARCH"
コマンドは次のようなものを返す必要があります。
SEARCH_DIR("=/usr/local/lib/arm-linux-gnueabihf"); SEARCH_DIR("=/lib/arm-linux-gnueabihf"); SEARCH_DIR("=/usr/lib/arm-linux-gnueabihf"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/home/nick/x-tools/arm-linux-gnueabihf/arm-linux-gnueabihf/lib");
パスは「=」記号で始まることに注意してください。これは、-sysroot = PATH_TO_YOUR_SYSROOTコマンドラインオプションを指定してgccを実行するときに指定された場合、これらはsysroot相対パスであることを意味します。
おそらくそれだけです。 sysrootをどこで取得するかはまだ決定していません。最も簡単な方法は、必要なすべての開発パッケージをRaspberry Piにインストールしてから、デバイスからSDカードを引き出し、ホストPCに転送することです。しかし、いくつかのニュアンスもあります。
クロスコンパイラーができたので、パーサー固有のプログラムを作成できます。たとえば、Raspberry自体からのユーザーランドのデモ:
git clone https://github.com/raspberrypi/userland.git cd userland export PATH=${HOME}/x-tools/arm-linux-gnueabihf/bin:$PATH ./buildme
コンパイル結果はbuild / binフォルダーにあります。
記事の最後に、さまざまなバージョンのラズベリー用のプロジェクトをビルドする際のgccコンパイラーの追加パラメーターの表を示したいと思います。
Raspberry Pi 1: -mcpu=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp (alias for vfpv2) Raspberry Pi 2: -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 Raspberry Pi 3: -mcpu=cortex-a53 -mfloat-abi=hard -mfpu=neon-fp-armv8 -mneon-for-64bits Raspberry Pi 4: -mcpu=cortex-a72 -mfloat-abi=hard -mfpu=neon-fp-armv8 -mneon-for-64bits
私の記事が誰かに役立つことを願っています。