2016-08-08 8 views
0

私の質問は少しダミーかもしれないが、私はいつも私の心の中でこの質問をしていた。gccコンパイラはマシン/プロセッサ独立バイナリをどのように生成するのですか?

コンパイル時のgccは、どのターゲットマシン/プロセッサがビルドされているかをどのように決定しますか?

gcc/g ++で生成される命令は、ターゲットシステムに依存しませんか?例えば

私は、Intelベースの、AMDベース、モトローラベースのシステムなどとx86_64のマシンを持っている...

は、すべてのプロセッサは、それに関連付けられた同じ命令セットとオペコードを持っていますか?

gccで生成されたマシンコード/バイナリに実行時チェックがありますか?

お返事ありがとうございます。

答えて

0

これは少し複雑です。インストール中にGCCがどのように構成され、コンパイルされたかによって異なります。私のUbuntu 16.04 x64システムには、GCCがインストールされています。

ターミナルで私はgcc -vを入力すると、私はGCCは、x64のLinux用のコードを生成することを意味しており、--target=x86_64-linux-gnuを取得します。 --host=x86_64-linux-gnuを意味します。GCC自体はx64 Linuxアプリケーションです。これ以上のものはlinkにあります。

もう1つの有用な出力は--with-multilib-list=m32,m64,mx32です。つまり、デフォルトの64ビットアプリケーションと、2種類の32ビットアプリケーション(-m32と-mx32)をコンパイルできます。

最後に、--with-tune=genericです。これは、アプリケーションがgeneric x64プラットフォーム用にコンパイルされ、x64 Linuxボックスのどこでも実行できることを意味します。

オーバーライドするには、-march-mtuneの2つのオプションがあります。 Archオプションは、特定のCPU固有のintructionを使用するようにコンパイラに指示します。チューンは与えられた最高のCPUに合うようにコード生成をチューニングします。 CPUは特定のプラットフォーム(例えばsandybridge)、汎用プラットフォーム(通常はデフォルト)またはnativeのいずれかであり、コンパイル時にGCCがホストCPUをチェックし、コード生成/チューニングを行います。

最後のオプションセットは、FPUの設定をカバーします。使用するユニット(x87またはSSE2 +)、命令セット(SSE2,3,4、AVX)などをこのlinkに含めることができます。

+0

答えてくれてありがとうございますが、--target = x86_64-linux-gnuをgccオプションとして指定すると、一般的なx86_64アーチシステムが正しく動作しますか?つまり、すべてのプロセッサが同じ命令セットに従うということですか? –

+0

@Ranjithはい、一般的なアーチでは、10年以上前にAMDが定義した汎用x86_64 - 16個の整数レジスタ、16個のSSE2、64ビットISA、フラットアドレス空間。つまり、すべてのプロセッサが同じ命令セットに従っているということですか?それは、互換性のあるx64 CPU(AMD、Intel、VIA)が共有する最小のサブセットなので、一般的なx86_64をターゲットとするプログラムはこれらのCPUで動作します。 –