一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - C語言從編譯到運(yùn)行過程詳解

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

2021-12-31 14:59Steven_cs C/C++

這篇文章主要介紹了C語言從編譯到運(yùn)行的一個過程的相關(guān)資料,需要的朋友可以參考下面文章具體的內(nèi)容

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

一、前言

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

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

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

#include <stdio.h>

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

二、C程序編譯過程

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

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

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

各個階段的代碼可以通過gcc指令來生成

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

sudo apt-get build-dep gcc

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

gcc --version

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

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

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

 

三、階段過程

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)容,并且把它直接插入程序文本中。同時刪除注釋行,添加行號和文件名標(biāo)識。這樣就得到了另一個C程序,通常是以 .i 作為文件擴(kuò)展名。 所以經(jīng)過預(yù)編譯的 .i 文件是不包含宏定義的。

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

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

2、編譯階段

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

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

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

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

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

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

3、匯編階段

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

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

你非要看就是這樣

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

4、鏈接階段

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

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

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

原文鏈接:https://www.cnblogs.com/stevenchow/p/14930206.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎最新免费网址 | 超91精品手机国产在线 | 久久re亚洲在线视频 | 性柔术18性13处交 | 日本在线视频网 | 国产成人盗拍精品免费视频 | 久久视热频国产这里只有精品23 | 美女撒尿部位无遮挡 | 人与动人物人a级特片 | 女海盗斯蒂内塔的复仇2免费观看 | 美女在线看永久免费网址 | 3d动漫美女被吸乳羞羞视频 | 色婷婷在线播放 | 欧美成人另类人妖 | 国产一卡2卡3卡四卡国色天香 | 日日摸夜夜爽色婷婷91 | 午夜宅男在线观看 | 99精品久久久久久 | 天天做天天爽 | 大伊香蕉在线精品不卡视频 | 我和么公的秘密小说免费 | 国产 日韩 欧美视频二区 | 红色毛片 | 国产高清在线精品一区二区三区 | 免费的毛片视频 | 91短视频社区在线观看 | 国产激情视频网站 | 亚洲一区二区精品视频 | 教室眠催白丝美女校花 | 国内精品99 | 久久久精品3d动漫一区二区三区 | 好看华人华人经典play | 99久久国产综合精品女小说 | 公妇乱淫在线播放免费观看 | 免费一级片在线观看 | 我与么公激情性完整视频 | 青青草国产免费久久久91 | 好大好硬好湿好紧h | 亚洲美女aⅴ久久久91 | 日本xxxxxx片免费播放18 | 美女张开腿让男人桶的 视频 |