2

アセンブラは実行可能ファイルで既に ABI バイナリに変換されていますか、それとも OS によって変換されていますか?

x86-64 インライン asm を ABI バイナリに変換する GCC またはその他のコンパイラ ソース コードへのリンクを教えてください。

私がこれらを正しく知っていれば、私にはわかりません。

  1. x86-64 ASCII 命令は 1:1 でバイナリ ブロックに変換されます。構文は問いません
  2. ABI仕様に従って変換されます

だから私はそれがコンパイラによって変換されているのか、それとも実行可能処理でOSによって変換されているのか知りたいのです。

4

1 に答える 1

1

の場合gcc、たとえば C ソースコードからの実行可能ファイルの生成は、複数ステップのプロセスです。次のように観察できます。

$ gcc -v -save-temps -ot tc -lm
..../lib/gcc/..../specs から仕様を読み取る
構成: ./configure [ .... ]
スレッドモデル: posix
gcc バージョン ....

 .../cc1 -E -quiet -v -iprefix ..../lib/gcc/..../ tc ... -o ti
[ C プリプロセッサの出力 ... ]

..../gcc/.../libexec/gcc/..../cc1 -fpreprocessed ti -quiet -dumpbase tc ... -auxbase t -O8 -version -o ts
[ C コンパイラの出力 - 前処理されたソースで動作する ... ]

.../binutils/.../bin/as -V -Qy -o to ts
[ GNU アセンブラの出力 - コンパイラによって作成されたアセンブリを使用 ... ]

..../gcc/.../libexec/gcc/..../collect2 -rpath [ ... ] -L [ ... ] --eh-frame-hdr -m elf_x86_64 -dynamic-linker / lib64/ld-linux-x86-64.so.2 -ot /usr/lib64/crt1.o /usr/lib64/crti.o ..../gcc/.../lib/gcc/.../ crtbegin.o -L[ ... かなりの数 ... ] から -lm -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no -必要に応じて .../gcc/..../lib/gcc/..../crtend.o /usr/lib64/crtn.o
[ リンカ出力 - アセンブラで作成したオブジェクトファイルを使用 ... ]

上記の結果、 のおかげで、ソースファイル-save-tempsを超えてt.c、中間段階も見つかります。

  • t.iこれは前処理された C ソースです ( cpp/cc1 -Eステージの後)
  • t.sこれはアセンブリ ソースです (C コンパイラによって作成されます)。
  • t.oオブジェクト (バイナリ) コード (アセンブラによって作成)
  • tこれは実際の ELF 実行可能ファイルです (リンカーによって作成されます)。

インライン アセンブリ ステートメントは、C コンパイラによって生成されるアセンブリ ソースに単純に埋め込まれます。あなたが言うなら:

__asm__ __volatile__("scream loudly !\n");

結果は次のとおりです。

ts: アセンブラ メッセージ:
ts:147: エラー: そのような命令はありません: 「大声で叫ぶ!」
コンパイラはただ...気にしないからです。

于 2013-05-01T13:35:36.623 に答える