最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言從編譯到運(yùn)行過(guò)程詳解

 更新時(shí)間:2021年09月07日 15:36:07   作者:Steven_cs  
這篇文章主要介紹了C語(yǔ)言從編譯到運(yùn)行的一個(gè)過(guò)程的相關(guān)資料,需要的朋友可以參考下面文章具體的內(nèi)容

C語(yǔ)言從編譯到運(yùn)行

一、前言

最近在看CSAPP(深入理解計(jì)算機(jī)系統(tǒng))然后以前也學(xué)過(guò)C語(yǔ)言,但是從來(lái)沒(méi)有深究寫好的C代碼是怎么編譯再到執(zhí)行的。

所以現(xiàn)在自己學(xué)習(xí),然后記錄下來(lái)。

以最常用的hello world!程序?yàn)槔?程序名: main.c

#include <stdio.h>

int main()
{
    printf("Hello world!\n");
    return 0;
}

二、C程序編譯過(guò)程

hello程序的生命周期是從一個(gè)高級(jí)C語(yǔ)言程序開始的,為了能夠運(yùn)行hello.c程序,每一條C語(yǔ)句都被其他程序轉(zhuǎn)化為一系列的低級(jí)機(jī)器語(yǔ)言指令。然后這些指令按照一種稱為可執(zhí)行目標(biāo)程序的格式打包,以二進(jìn)制磁盤文件的形式存放起來(lái)。目標(biāo)程序也稱為可執(zhí)行目標(biāo)文件。

編譯一個(gè) C程序可以分為四階段:預(yù)處理階段--->生成匯編代碼階段--->匯編階段--->鏈接階段

各個(gè)階段的代碼可以通過(guò)gcc指令來(lái)生成

如果沒(méi)有g(shù)cc可以用下面指令安裝

sudo apt-get build-dep gcc

安裝完之后可以根據(jù)以下指令查看是否安裝成功

gcc --version

安裝好后用下面指令生成中間文件

gcc main.c 直接生成可執(zhí)行文件 a.out
gcc -E main.c -o hello.i 生成預(yù)處理后的代碼
gcc –S main.c -o hello.s 生成匯編代碼
gcc –c main.c -o hello.o 生成目標(biāo)代碼

三、階段過(guò)程

1、預(yù)處理階段

gcc -E main.c -o hello.i 生成預(yù)處理后的代碼

  預(yù)處理器(cpp)根據(jù)以字符 # 開頭的命令,修改原始的C程序。比如mian.c中第一行的 #include<stdio.h> 命令就告訴預(yù)處理器讀取系統(tǒng)頭文件stdio.h的內(nèi)容,并且把它直接插入程序文本中。同時(shí)刪除注釋行,添加行號(hào)和文件名標(biāo)識(shí)。這樣就得到了另一個(gè)C程序,通常是以 .i 作為文件擴(kuò)展名。 所以經(jīng)過(guò)預(yù)編譯的 .i 文件是不包含宏定義的。

  處理完后我們來(lái)看看 hello.i 文件。發(fā)現(xiàn)原來(lái)的7行代碼變成了700多行,我們的代碼在最后面。而前面多出來(lái)的代碼就是 .c 中#include<stdio.h>展開的代碼。

2、編譯階段

gcc –S main.c -o hello.s     生成匯編代碼

  編譯是將源文件(hello.i)翻譯成匯編文件(hello.s)的過(guò)程。中間包含詞法、語(yǔ)法分析等步驟,具體過(guò)程可以參考《編譯原理》。

  打開匯編代碼我們會(huì)發(fā)現(xiàn)里面有很多以 . 開頭的行,所有這些以 . 開頭的行都是指導(dǎo)匯編器和鏈接器工作的偽指令。 我們通??梢院雎赃@些行。

去掉這些行后剩下的部分。

3、匯編階段

gcc –c main.c -o hello.o 生成目標(biāo)代碼

匯編階段是把編譯階段生成的 .s 文件轉(zhuǎn)成 .o 的二進(jìn)制目標(biāo)代碼。匯編器(as)將 hello.s 翻譯成機(jī)器語(yǔ)言指令,把這些指令打包成一種叫做可重定位目標(biāo)程序的格式,并將結(jié)果保存在目標(biāo)文件hello.o中。hello.o文件是一個(gè)二進(jìn)制文件,它的字節(jié)編碼是機(jī)器語(yǔ)言指令而不是字符。如果我們?cè)谖谋揪幾g器中打開 hello.o 文件,看到的將是一堆亂碼。

你非要看就是這樣

4、鏈接階段

  這個(gè)階段就是把匯編后的機(jī)器指令集變成可以直接運(yùn)行的文件,而對(duì)目標(biāo)文件進(jìn)行鏈接主要是因?yàn)樵谀繕?biāo)文件中可能用到了在其他文件當(dāng)中定義的字段(或者函數(shù)),通過(guò)鏈接來(lái)把多個(gè)不同目標(biāo)文件關(guān)聯(lián)到一起。

  hello 程序調(diào)用了printf 函數(shù),它是每個(gè) C 編譯器都會(huì)提供的標(biāo)準(zhǔn)C庫(kù)中的一個(gè)函數(shù),printf 函數(shù)存在于一個(gè)名為 printf.o 的單獨(dú)預(yù)編譯好了的標(biāo)準(zhǔn)文件中,而這個(gè)文件必須以某種方式合并到我們的 hello.o 程序中,鏈接器(ld)就負(fù)責(zé)處理這種合并,結(jié)果就得到 hello 文件,它是一個(gè)可執(zhí)行目標(biāo)文件(簡(jiǎn)稱:可執(zhí)行文件),可以被加載到內(nèi)存中,有系統(tǒng)執(zhí)行。

以上就是C語(yǔ)言從編譯到運(yùn)行過(guò)程詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言從編譯到運(yùn)行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • VSstudio中scanf返回值被忽略的原因及解決方法(推薦)

    VSstudio中scanf返回值被忽略的原因及解決方法(推薦)

    這篇文章主要介紹了VSstudio中scanf返回值被忽略的原因及其解決方法,scanf返回值被忽略,接下來(lái)我就告訴大家該如何解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2022-09-09
  • C++開發(fā)之CRC校驗(yàn)實(shí)例詳解

    C++開發(fā)之CRC校驗(yàn)實(shí)例詳解

    這篇文章主要介紹了C++開發(fā)之CRC校驗(yàn)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++中四種強(qiáng)制轉(zhuǎn)換方式的區(qū)別

    C++中四種強(qiáng)制轉(zhuǎn)換方式的區(qū)別

    在C++中,有四種不同的強(qiáng)制轉(zhuǎn)換方式,它們分別是靜態(tài)轉(zhuǎn)換、動(dòng)態(tài)轉(zhuǎn)換、常量轉(zhuǎn)換和重新解釋轉(zhuǎn)換,下面通過(guò)示例代碼講解每種轉(zhuǎn)換的區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • 堆排序算法(選擇排序改進(jìn))

    堆排序算法(選擇排序改進(jìn))

    這篇文章主要介紹了堆排序算法(選擇排序改進(jìn)),有需要的朋友可以參考一下
    2014-01-01
  • C++實(shí)現(xiàn)特殊矩陣的壓縮存儲(chǔ)算法

    C++實(shí)現(xiàn)特殊矩陣的壓縮存儲(chǔ)算法

    在實(shí)際存儲(chǔ)時(shí),會(huì)發(fā)現(xiàn)矩陣中有許多值相同的數(shù)據(jù)或有許多零數(shù)據(jù),且分布呈現(xiàn)出一定的規(guī)律,稱這類型的矩陣為特殊矩陣。本文將利用C++實(shí)現(xiàn)特殊矩陣的壓縮存儲(chǔ),感興趣的可以了解一下
    2022-08-08
  • C語(yǔ)言深入探究棧的原理

    C語(yǔ)言深入探究棧的原理

    一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端 稱為棧頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進(jìn)先出LIFO(Last In First Out)的原則
    2021-11-11
  • C語(yǔ)言中的rand()和rand_r()詳解

    C語(yǔ)言中的rand()和rand_r()詳解

    這篇文章主要為大家介紹了C語(yǔ)言中的rand()和rand_r(),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++實(shí)現(xiàn)旋轉(zhuǎn)掃描儀的示例代碼

    C++實(shí)現(xiàn)旋轉(zhuǎn)掃描儀的示例代碼

    旋轉(zhuǎn)掃描儀(Rotating?Scanner),也稱為旋轉(zhuǎn)掃描儀或圓形掃描儀,是一種用于獲取圖像和文檔的設(shè)備,下面就跟隨小編一起來(lái)學(xué)習(xí)一下如何使用C++實(shí)現(xiàn)旋轉(zhuǎn)掃描儀功能吧
    2024-02-02
  • C++頭文件algorithm中的函數(shù)功能詳解

    C++頭文件algorithm中的函數(shù)功能詳解

    這篇文章主要介紹了C++頭文件algorithm中的函數(shù)功能詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 簡(jiǎn)單了解C++語(yǔ)言中的二元運(yùn)算符和賦值運(yùn)算符

    簡(jiǎn)單了解C++語(yǔ)言中的二元運(yùn)算符和賦值運(yùn)算符

    這篇文章主要介紹了C++語(yǔ)言中的二元運(yùn)算符和賦值運(yùn)算符,文中列出了可重載的運(yùn)算符列表,需要的朋友可以參考下
    2016-01-01

最新評(píng)論

民乐县| 西和县| 沧州市| 南溪县| 宜兰市| 家居| 米易县| 明水县| 仙游县| 南漳县| 思南县| 陕西省| 嫩江县| 休宁县| 平阴县| 怀仁县| 左云县| 和田县| 安塞县| 都江堰市| 河间市| 鄂州市| 辛集市| 竹北市| 靖宇县| 云霄县| 洛南县| 邵东县| 晋江市| 廉江市| 大冶市| 锦州市| 渭南市| 永顺县| 海门市| 海晏县| 德州市| 东乌珠穆沁旗| 黑龙江省| 青海省| 清涧县|