Windows でコンパイルされた単純な C プログラムについて考えてみましょう。
Intel CPU マシンでプログラムをコンパイルし、AMD CPU マシン (同じオペレーティング システム) で実行できます。CPUの命令セットが同じということですか?
異なる OS と同じ CPU を搭載したマシンで同じプログラムが実行されないのはなぜですか?
Windows でコンパイルされた単純な C プログラムについて考えてみましょう。
Intel CPU マシンでプログラムをコンパイルし、AMD CPU マシン (同じオペレーティング システム) で実行できます。CPUの命令セットが同じということですか?
異なる OS と同じ CPU を搭載したマシンで同じプログラムが実行されないのはなぜですか?
オブジェクト ファイルのバイナリ設定はまったく異なります。また、どのライブラリが利用可能か、またはそれらを呼び出す方法。
ELF ファイルまたは EXE ファイルのヘッダーを比較して、私が何を意味するかを確認してください。
"main(){printf("Hello\n"); return 0;} のような単純なプログラムを作成すると、これらの行を出力するためにコンパイラがカバーする舞台裏で多くの処理が行われます。 CPU はアセンブリ命令を実行できるため役に立ちませんが、最初の OS 関数を呼び出すとすぐに恐ろしく失敗します。
これを少し詳しく説明するには:
例として。Motorola 68000 CPU を搭載した Amiga OS で実行していると仮定しましょう。
私の記憶が正しければ、システム ライブラリを呼び出すための呼び出し規則には、ポインタを CPU のアドレス レジスタにロードしてから OS 関数を呼び出すことが含まれていました。
ここで、Motorola 68000 CPU を使用して独自の OS を作成したとします。ただし、OS を設計するときに、データ交換にスタックを使用する方がはるかに優れていると考えたので、独自のプライベート OS で同様の関数を呼び出す場合は、代わりにアドレス レジスタにアドレスを渡しません。スタックにプッシュします。実行可能ファイルが私の OS で実行されると (同じオブジェクト構造を使用しているためロードできると仮定すると)、実行可能ファイルは値をレジスタに入れ、OS は値をスタックからポップしようとします。それが探していた値はどこか別のものであるはずだった.
理解できるようにこれがもう少し詳細であることを願っていますが、もちろん、これは関係する問題のほんの一部であるため、問題はこれよりもはるかに深くなります。
Intel と AMD の両方が x86 (または x86-64) アーキテクチャを使用しています。そのため、両方で同じソフトウェアを実行できます。ただし、コンパイルされたプログラムには、アーキテクチャへの依存関係だけでなく、基盤となるオペレーティング システムへの依存関係も含まれています。たとえば、Linux 実行可能ファイルのバイナリ形式でさえ、Windows のものとは異なります。
ただし、C 標準ライブラリを使用する単純な C プログラムを使用して、さまざまなオペレーティング システムやプロセッサ アーキテクチャ間でコンパイルすることはできます。コードにオペレーティング システムに依存するコードが含まれていない限り、オペレーティング システム間で移植されます。同様に、たとえば、コードが基盤となるアーキテクチャのエンディアンに依存していない場合、コードはアーキテクチャ間で移植されます。
ヨハン。