imulsion が指摘したように、バイト コードは、マシン コードにコンパイルする直前の中間ステップです。最後のステップはロード時間 (そして多くの場合、Just-In-Time (JIT) コンパイルの場合のようにランタイム) に委ねられるため、バイト コードはアーキテクチャに依存しません: ランタイム (.net の CLR または Java の JVM) は、バイトコードのオペコードをその基礎となるマシンコード表現にマッピングします。
比較すると、ネイティブ コード (Windows: PE、PE32+、OS X/iOS: Mach-O、Linux/Android/etc: ELF) はコンパイルされたコードであり、特定のアーキテクチャ (Android/iOS: ARM、その他のほとんど: Intel 32) に適しています。 -ビット (i386) または 64 ビット)。これらはすべて非常に似ていますが、プロセスになるときに実行可能ファイルのメモリ構造を設定するためのセクション (または、Mach-O 用語で「ロード コマンド」) が必要です (古い DOS は、「.com」形式をサポートしていました。生のメモリ イメージ)。上記のすべてにおいて、大まかに次のように言えます。
- 「.」のあるセクション コンパイラによって作成され、「デフォルト」であるか、デフォルトの動作が期待されます
- 実行可能ファイルには、通常「text」または「.text」と呼ばれるメイン コード セクションがあります。これは、特定のアーキテクチャで実行できるネイティブ コードです。
- 文字列は別のセクションに格納されます。これらは、ハードコードされた出力 (出力するもの) とシンボル名に使用されます。
- シンボル - リンカーが実行可能ファイルとそのライブラリ (Windows: DLL、Linux/Android: 共有オブジェクト、OS X/iOS: .dylibs またはフレームワーク) をまとめるために使用するものは、別のセクションに保存されます。通常、コンパイラが呼び出した関数 (printf、open など) にスタブを簡単に配置できるようにする "PLT" (Procedure Linkage Table) もあり、実行可能ファイルのロード時にリンカーが接続できます。
- インポート テーブル (Windows の用語では..ELF では DYNAMIC セクション、OS X では LC_LOAD_LIBRARY コマンド) は、追加のライブラリを宣言するために使用されます。実行可能ファイルのロード時にそれらが見つからない場合、ロードは失敗し、実行できません。
- エクスポート テーブル (ライブラリ/dylibs/etc 用) は、ライブラリ (または Windows では .exe でさえも) がエクスポートして、他のライブラリとリンクできるシンボルです。
- 定数は通常、「.rodata」として表示されるものにあります。
お役に立てれば。本当に、あなたの質問は漠然としていました..
TG