最近、私はarmプラットフォーム用の独自のクロスコンパイルツールチェーンを作成しようとしました。 GCCのautoconfスクリプトを使用すると、次の変数を渡す必要があることがわかりました。
--with-cpu=cortex-m4 \
--with-fpu=fpv4-sp-d16 \
--with-float=hard \
--with-mode=thumb \
したがって、CPU、fpuなどを構成する必要があるため、ARMプラットフォームごとに異なるツールチェーン/コンパイラが必要になるようです。ところで、このツールチェーンに一種のあらかじめ作られたバイナリがあることがわかりました。
https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
このツールチェーンを試してhello worldプログラムをコンパイルした後、ターゲットARMボードで試しましたが、「セグメントエラー」が表示されました。まあ、少なくとも「バイナリファイルを実行できません:Exec形式エラー」ではありません。
しかし、まだ疑問です。なぜ動作しないのですか?それとも実際に動作する必要がありますか?
ベストアンサー1
ツールチェーン自体をビルドするときにサポートする機能を構成する必要があります。目的のターゲットに必要な機能のみをサポートする「薄い」コンパイラを構築できます。
しかし、ARMプラットフォームが提供するすべてをサポートし、愚かなコンパイラを得ることもできます。
機能自体はタイプによって異なります。
- このような最適化フラグ
-mcpu
は必要なく、単に特定のARMプロセッサのコードを最適化するためのものです。 fpu
一方、FPUを使用するには、ARMコアの機能を使用できる必要があります。float=hard
プロセッサではなくOSによって異なります。浮動小数点レジスタの関数に浮動小数点を渡すことができるため、ARMレジスタと浮動小数点レジスタ間の転送が遅いため、作業速度が大幅に速くなる可能性があります。ただし、リンクの場合、システムはこれに同意する必要があります。- Thumbのサポートもある程度オプションです。コアがサポートしている場合はどちらも使用できますが、今すぐコンパイラがサムモードを選択できないようにするのは愚かです。