の場合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: エラー: そのような命令はありません: 「大声で叫ぶ!」
コンパイラはただ...気にしないからです。