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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - C/C++ - C語言從編譯到運行過程詳解

C語言從編譯到運行過程詳解

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

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

C語言編譯運行

一、前言

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

所以現在自己學習,然后記錄下來。

以最常用的hello world!程序為例 程序名: main.c

#include <stdio.h>

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

二、C程序編譯過程

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

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

C語言從編譯到運行過程詳解

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

如果沒有gcc可以用下面指令安裝

sudo apt-get build-dep gcc

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

gcc --version

C語言從編譯到運行過程詳解

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

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

 

三、階段過程

1、預處理階段

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

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

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

C語言從編譯到運行過程詳解

2、編譯階段

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

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

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

C語言從編譯到運行過程詳解

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

C語言從編譯到運行過程詳解

3、匯編階段

gcc Cc main.c -o hello.o 生成目標代碼

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

你非要看就是這樣

C語言從編譯到運行過程詳解

4、鏈接階段

  這個階段就是把匯編后的機器指令集變成可以直接運行的文件,而對目標文件進行鏈接主要是因為在目標文件中可能用到了在其他文件當中定義的字段(或者函數),通過鏈接來把多個不同目標文件關聯到一起。

  hello 程序調用了printf 函數,它是每個 C 編譯器都會提供的標準C庫中的一個函數,printf 函數存在于一個名為 printf.o 的單獨預編譯好了的標準文件中,而這個文件必須以某種方式合并到我們的 hello.o 程序中,鏈接器(ld)就負責處理這種合并,結果就得到 hello 文件,它是一個可執行目標文件(簡稱:可執行文件),可以被加載到內存中,有系統執行。

以上就是C語言從編譯到運行過程詳解的詳細內容,更多關于C語言從編譯到運行的資料請關注服務器之家其它相關文章!

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

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 欧美一区二区三区视视频 | 俄罗斯12一15处交 | 免费被黄网站在观看 | 男人好大好硬好爽免费视频 | 日韩毛片在线视频 | 四虎地址8848aa4hc44四虎 四虎成人永久地址 | leslessexvideos日本 | 精品国产一级在线观看 | 免费国产一级观看完整版 | 奇米网7777| xnxx老师| 4hu四虎永久网址 | 欧美色阁 | 欧美又大又粗又长又硬 | 成年人免费观看视频网站 | 变态 调教 视频 国产九色 | 麻豆网站视频国产在线观看 | 秋霞理论最新三级理论最 | 跪在老师脚下吃丝袜脚 | 91亚洲精品久久91综合 | 深夜福利免费观看 | 欧美va免费大片 | 男人捅女人动漫 | 亚洲无人区乱码中文字幕 | 免费观看小视频 | 四虎影院在线免费观看 | 操人网 | 欧美怡红院视频一区二区三区 | 国产精品怡红院永久免费 | 色狠狠婷婷97 | 亚洲xxxxxhd奶水女人 | 韩国三级理韩国三级理人伦 | 四影虎库最新2021 | 脱了白丝校花的内裤猛烈进入 | 国产欧美日韩在线观看精品 | 国产三级跑 | 成人影院在线观看视频 | 亚洲剧情在线观看 | 免费标准高清看机机桶机机 | 成人在线免费播放 | 91蜜桃|