日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

C语言——程序的编译+链接(linux+gcc实现过程)

發(fā)布時間:2025/3/21 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言——程序的编译+链接(linux+gcc实现过程) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、預(yù)處理
    • 1.預(yù)處理階段的操作:
    • 1.預(yù)處理過程實現(xiàn):
  • 二、編譯
    • 1.編譯階段的操作:
    • 2.編譯過程的實現(xiàn):
  • 三、匯編
    • 1.匯編階段的操作:
    • 2.匯編過程的實現(xiàn):
  • 四、鏈接
    • 1.鏈接階段的操作:
    • 2.鏈接過程的實現(xiàn):


前言

一個程序要運行,一定要經(jīng)歷四個步驟。依次是: 預(yù)處理、編譯、匯編和鏈接。那么接下來就依次拆解這些過程來更好的理解程序是如何運行起來的。

首先簡述一下各步驟的內(nèi)容:

  • 預(yù)處理:展開頭文件/宏替換/去掉注釋/條件編譯
  • 編譯 :檢查語法,生成匯編代碼
  • 匯編:把匯編代碼轉(zhuǎn)成二進制機器碼寫入目標文件
  • 鏈接:鏈接各模塊生成可執(zhí)行程序

后面展開討論————


一、預(yù)處理

1.預(yù)處理階段的操作:

  • 展開所有的宏定義,將#define刪除
  • 刪除所有注釋
  • 保留所有的#pragma編譯指令,因為編譯器需要使用它們。
  • 處理條件編譯指令
  • 處理#include預(yù)編譯指令,將被包含的頭文件插到該編譯指令的位置
  • 添加行號和文件標識名
  • 1.預(yù)處理過程實現(xiàn):

    可以使用linux來實現(xiàn)預(yù)處理到鏈接的過程并觀察

    gcc指令的用法

    -E選項:提示編譯器執(zhí)行完預(yù)處理就停下來,后邊的編譯、匯編、鏈接就先不執(zhí)行了。
    -S選項:提示編譯器執(zhí)行完編譯就停下來,不去執(zhí)行匯編和鏈接了。
    -c選項:提示編譯器執(zhí)行完匯編就停下來。
    使用 gcc 命令不跟任何的選項的話,會默認執(zhí)行預(yù)處理、編譯、匯編、鏈接這整個過程,如果程序沒有錯,就會得到一個可執(zhí)行文件,默認為a.out,使用 -o + 文件名可定義生成可執(zhí)行文件的名稱。

    一個簡單的代碼理解預(yù)處理


    首先,編輯一個test.c文件,里面有注釋,宏定義及預(yù)編譯指令等,執(zhí)行g(shù)cc -E test.c -o test.i,生成一個test.i文件。

    觀察發(fā)現(xiàn),文件變成了900行左右,宏定義已經(jīng)被替換掉了,注釋等也已經(jīng)刪除。上面的部分即stdio.h包含的代碼。

    二、編譯

    1.編譯階段的操作:

    編譯過程是整個程序構(gòu)建的核心部分,編譯成功,會將源代碼由文本形式轉(zhuǎn)換成機器語言,編譯過程就是把預(yù)處理完的文件進行一系列詞法分析、語法分析、語義分析以及優(yōu)化后生成相應(yīng)的匯編代碼文件。

    2.編譯過程的實現(xiàn):

    依然是上面的簡單代碼,針對生成的test.i文件執(zhí)行g(shù)cc -S test.i -o test.s,生成一個test.s文件。

    觀察test.s文件,已經(jīng)從之前的文本形式轉(zhuǎn)換成匯編代碼。

    三、匯編

    1.匯編階段的操作:

    匯編過程調(diào)用匯編器as來完成,是用于將匯編代碼轉(zhuǎn)換成機器可以執(zhí)行的指令,每一個匯編語句幾乎都對應(yīng)一條機器指令。

    2.匯編過程的實現(xiàn):

    針對生成的test.s文件執(zhí)行g(shù)cc -c test.s -o test.o,生成一個test.o文件。

    文件將變成這樣的只有機器才能看懂的語言啦。

    四、鏈接

    1.鏈接階段的操作:

    鏈接的主要內(nèi)容就是將各個模塊之間相互引用的部分正確的銜接起來。它的工作就是把一些指令對其他符號地址的引用加以修正。鏈接過程主要包括了地址和空間分配、符號決議和重定向。

    2.鏈接過程的實現(xiàn):

    使用gcc test.o -o test指令,生成一個test文件

    這就是鏈接后的文件,也是一個可執(zhí)行程序,用./test執(zhí)行

    可以看到最終得到了答案。

    總結(jié)

    以上是生活随笔為你收集整理的C语言——程序的编译+链接(linux+gcc实现过程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。