web-dev-qa-db-ja.com

arm-linux-gnu-gccとarm-linux-gcc

違いは何ですか arm-linux-gnu-gccおよびarm-linux-gcc ARM?のCプログラムのクロスコンパイルに使用する必要があるのはどれですか?

2
gpuguy

プロセッサ(「ベアメタル」システム)上で単独で実行されるプログラムのみをコンパイルする場合、重要なのは、その特定のプロセッサ用の命令を生成するコンパイラを用意することです。 「forARM」はほぼ十分な情報ですが、完全ではありません。命令セットのバージョンも指定する必要があります。今日のほとんどのARMプロセッサは同じバージョン(ARMv7)に基づいていますが、その内部でも多くの複雑さがあります。一部の機能(浮動小数点、ベクトル命令など)はオプションであり、次のいずれかを指定する必要があります。それらを使用すると、ARMv7には実際には2つの命令セット(「通常の」ARMとThumb)があります。ARMのGCCのほとんどのディストリビューションは、オプション機能とオプションで有効化されたThumbを備えたARMv7を対象としています。

他のプログラムと相互作用するプログラムをコンパイルする場合は、関係するすべてのプログラムが通信できる必要があります。システムコールを行う、さらにはライブラリコールを行うには、呼び出し元と呼び出し先がデータのバイナリ表現(エンディアンネスなど)とデータの受け渡し方法(関数の引数に使用するレジスタ、関数呼び出しの影響)について合意する必要があります。スタックなど)。これがどのように機能するかの仕様は、 ABI(アプリケーションバイナリインターフェイス) と呼ばれます。

GCCクロスコンパイラの一般的な命名規則 は_CPU-VENDOR-SYSTEM-gcc_(_-gcc_の前の部分はconfigureの-​​ システムタイプ と一致します)が、_VENDOR-SYSTEM_の部分についていくつかのあいまいさがあります。 ARMのクロスコンパイラは通常_arm-VENDOR-OS-LIBC-ABI-gcc_と呼ばれ、一部が省略されています。たとえば、_arm-acme-linux-gnu-gnueabi-gcc_はARM =(デフォルトではv7)、ACMEのLinuxディストリビューションの場合、gnueabi ABIを使用してGlibcに対してリンクするように設定されています。_arm-linux-gnu-gcc_は、ABIが指定されていないLinux上のGlibcに対してリンクするように設定されたコンパイラを示します。_arm-linux-gcc_どのlibcがターゲットになるかを指定しません。