GCCコンパイルc言語ファイル
3398 ワード
引用文章リンク:gccコンパイルプロセスはLinuxの下でC言語プログラムを実行するc言語の基礎の中で簡単に述べて、gccを使ってc言語プロセスをコンパイルするのは一般的に以下の通りです:
上記のコマンドは、直接c言語ファイルを実行可能ファイルにコンパイルリンクすることができます.ターゲットファイルが指定されていない場合、デフォルト入力ターゲットファイルはa.outです.cプログラム設計言語の本では、著者らはccコマンドでコンパイルすることを紹介しています.他のブログから、cc:C compiler、すなわちcコンパイラがunixシステムの製品であることがわかりました.gcc:GNU compiler collection.Linuxでは、ccはgccと同じもので、ccはgccのリンクLinuxの下を指すccとgccはMacシステムでは、ccはclang(アップルのc言語コンパイラ)を指す.
これらの違いについてはしばらくこれだけしか話していませんが、次に上記のように一度に完了したgccコマンドではなく、分布してコンパイルを完了し、c言語のコンパイルプロセスを体験してみましょう.まず、helloという名前の牛叉のc言語ファイルを用意します.c、ファイルの内容は以下の通りです.
このソースファイルのサイズは71 Bである.
コンパイルプロセスプリコンパイル
上にファイルを生成します.i,ファイルサイズが4100 Bの場合、プリプロセッサはstdio.hの内容はプログラムに直接挿入される.△これが#includeを前処理コマンドと呼ぶ理由なのか.2.アセンブリコードにコンパイル
このとき生成するhello.sは、異なる高度な言語の異なるコンパイラに共通の出力言語を提供するアセンブリアセンブリアセンブリ言語である.3.対象ファイルとしてアセンブリ
ここがどういう意味か知っています.これはバイナリファイルです.実行可能ファイルになるまでリンクライブラリしかありません.4.実行可能ファイルをリンクして生成する
生成されたhelloファイルは、次のように実行できます.
まとめ:コンパイラのコンパイル手順:ソースファイル->前処理->コンパイル/最適化->アセンブリ->リンク->実行可能ファイル.最も簡単なhello world、パソコンが私たちにこんなに多くのことをしてくれたので、容易ではないようですね.
gcc -o
:
gcc hello.c -o hello
, :
gcc test1.o test2.o -o test
上記のコマンドは、直接c言語ファイルを実行可能ファイルにコンパイルリンクすることができます.ターゲットファイルが指定されていない場合、デフォルト入力ターゲットファイルはa.outです.cプログラム設計言語の本では、著者らはccコマンドでコンパイルすることを紹介しています.他のブログから、cc:C compiler、すなわちcコンパイラがunixシステムの製品であることがわかりました.gcc:GNU compiler collection.Linuxでは、ccはgccと同じもので、ccはgccのリンクLinuxの下を指すccとgccはMacシステムでは、ccはclang(アップルのc言語コンパイラ)を指す.
MacBook-Pro:~ james$ which cc
/usr/bin/cc
MacBook-Pro:~ james$ which gcc
/usr/bin/gcc
MacBook-Pro:~ james$ ls -al /usr/bin/cc
lrwxr-xr-x 1 root wheel 5 1 11 2017 /usr/bin/cc -> clang
これらの違いについてはしばらくこれだけしか話していませんが、次に上記のように一度に完了したgccコマンドではなく、分布してコンパイルを完了し、c言語のコンパイルプロセスを体験してみましょう.まず、helloという名前の牛叉のc言語ファイルを用意します.c、ファイルの内容は以下の通りです.
#include
int main(){
printf("hello world
");
return 0;
}
このソースファイルのサイズは71 Bである.
コンパイルプロセス
gcc -E hello.c -o hello.i
上にファイルを生成します.i,ファイルサイズが4100 Bの場合、プリプロセッサはstdio.hの内容はプログラムに直接挿入される.△これが#includeを前処理コマンドと呼ぶ理由なのか.2.アセンブリコードにコンパイル
gcc -S hello.i -o hello.s
// hello.s 670B, :
.section
__TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 12
.globl _main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp0:
.cfi_def_cfa_offset 16
Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp2:
.cfi_def_cfa_register %rbp
subq $16, %rsp
leaq L_.str(%rip), %rdi
movl $0, -4(%rbp)
movb $0, %al
callq _printf
xorl %ecx, %ecx
movl %eax, -8(%rbp) ## 4-byte Spill
movl %ecx, %eax
addq $16, %rsp
popq %rbp
retq
.cfi_endproc
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "hello world
"
.subsections_via_symbols
このとき生成するhello.sは、異なる高度な言語の異なるコンパイラに共通の出力言語を提供するアセンブリアセンブリアセンブリ言語である.3.対象ファイルとしてアセンブリ
gcc -c hello.s -o hello.o
// hello.o 768B, :
cffa edfe 0700 0001 0300 0000 0100 0000
0400 0000 0002 0000 0020 0000 0000 0000
1900 0000 8801 0000 0000 0000 0000 0000
.........
2400 0000 1c00 0000 88ff ffff ffff ffff
2a00 0000 0000 0000 0041 0e10 8602 430d
0600 0000 0000 0000 1900 0000 0100 002d
0b00 0000 0200 0015 0000 0000 0100 0006
0100 0000 0f01 0000 0000 0000 0000 0000
0700 0000 0100 0000 0000 0000 0000 0000
005f 6d61 696e 005f 7072 696e 7466 0000
ここがどういう意味か知っています.これはバイナリファイルです.実行可能ファイルになるまでリンクライブラリしかありません.4.実行可能ファイルをリンクして生成する
gcc hello.o -o hello
// hello, 8,432B,
cffa edfe 0700 0001 0300 0080 0200 0000
0f00 0000 b004 0000 8500 2000 0000 0000
1900 0000 4800 0000 5f5f 5041 4745 5a45
524f 0000 0000 0000 0000 0000 0000 0000
0000 0000 0100 0000 0000 0000 0000 0000
........
// 50 0
0000 0040 0200 0000 2000 5f5f 6d68 5f65
7865 6375 7465 5f68 6561 6465 7200 5f6d
6169 6e00 5f70 7269 6e74 6600 6479 6c64
5f73 7475 625f 6269 6e64 6572 0000 0000
生成されたhelloファイルは、次のように実行できます.
MacBook-Pro:c james$ ./hello
hello world
まとめ:コンパイラのコンパイル手順:ソースファイル->前処理->コンパイル/最適化->アセンブリ->リンク->実行可能ファイル.最も簡単なhello world、パソコンが私たちにこんなに多くのことをしてくれたので、容易ではないようですね.