C程式編譯過程淺析

來源:互聯網
上載者:User

以GCC編譯hellworld為例,簡單總結如下。

 

hello.c原始碼如下:

#include <stdio.h>
int main()
{
         printf(“Hello, world.\n”);
         return 0;
}

通常我們使用gcc來產生可執行程式,命令為:gcc hello.c,預設產生可執行檔a.out

其實編譯(包括連結)的命令:gcc hello.c 可分解為如下4個大的步驟:

·  預先處理(Preprocessing)

·  編譯(Compilation)

·  彙編(Assembly)

·  連結(Linking)

1.       預先處理(Preprocessing)

預先處理的過程主要處理包括以下過程:

將所有的#define刪除,並且展開所有的宏定義
處理所有的條件先行編譯指令,比如#if #ifdef #elif #else #endif等
處理#include 先行編譯指令,將被包含的檔案插入到該先行編譯指令的位置。
刪除所有注釋 “//”和”/* */”.
添加行號和檔案標識,以便編譯時間產生調試用的行號及編譯錯誤警告行號。
保留所有的#pragma編譯器指令,因為編譯器需要使用它們

通常使用以下命令來進行預先處理:

gcc -E hello.c -o hello.i

參數-E表示只進行預先處理 或者也可以使用以下指令完成預先處理過程

cpp hello.c > hello.i      /*  cpp - The C Preprocessor  */

直接cat hello.i 你就可以看到預先處理後的代碼

 

2.       編譯(Compilation)

編譯過程就是把預先處理完的檔案進行一系列的詞法分析,文法分析,語義分析及最佳化後產生相應的彙編代碼。

$gcc –S hello.i –o hello.s

或者

$ /usr/lib/gcc/i486-linux-gnu/4.4/cc1 hello.c

註:現在版本的GCC把預先處理和編譯兩個步驟合成一個步驟,用cc1工具來完成。gcc其實是背景程式的一些封裝,根據不同參數去調用其他的實際處理常式,比如:先行編譯編譯器cc1、彙編器as、連接器ld

可以看到編譯後的彙編代碼(hello.s)如下:

    .file   "hello.c"

    .section    .rodata

.LC0:

    .string "Hello, world."

    .text

.globl main

    .type   main, @function

main:

    pushl   %ebp

    movl    %esp, %ebp

    andl    $-16, %esp

    subl    $16, %esp

    movl    $.LC0, (%esp)

    call    puts

    movl    $0, %eax

    leave

    ret

    .size   main, .-main

    .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"

    .section    .note.GNU-stack,"",@progbits

 

3.       彙編(Assembly)

彙編器是將彙編代碼轉變成機器可以執行的命令,每一個彙編語句幾乎都對應一條機器指令。彙編相對於編譯過程比較簡單,根據彙編指令和機器指令的對照表一一翻譯即可。

$ gcc –c hello.c –o hello.o

或者

$ as hello.s –o hello.co

由於hello.o的內容為機器碼,不能以普通文本形式的查看(vi 開啟看到的是亂碼)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.