GCCコンパイルc言語ファイル

3398 ワード

引用文章リンク:gccコンパイルプロセスはLinuxの下でC言語プログラムを実行するc言語の基礎の中で簡単に述べて、gccを使ってc言語プロセスをコンパイルするのは一般的に以下の通りです:
	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、パソコンが私たちにこんなに多くのことをしてくれたので、容易ではないようですね.