gcc 編譯過程

gcc 編譯過程
hello.c hello(a.out)文件, 必須歷經 hello.ihello.shello.o,最后才得到 hello(
a.out)文件,分別對應著預處理、編譯、匯編和鏈接 4 個步驟,整個過程如圖 10.5 所示。

4 步大致的工作內容如下:
1) 預處理, C 編譯器對各種預處理命令進行處理,包括頭文件包含、宏定義的擴
展、條件編譯的選擇等;
2) 編譯,將預處理得到的源代碼文件,進行“翻譯轉換”,產生出機器語言的目標
程序,得到機器語言的匯編文件;
3) 匯編,將匯編代碼翻譯成了機器碼,但是還不可以運行;
4) 鏈接,處理可重定位文件,把各種符號引用和符號定義轉換成為可執行文件中
的合適信息,通常是虛擬地址。

下面根據 hello.c 這個示例,跟蹤一下其中的細節。
1)預處理
gcc 命令加上-E 參數,可以得到預處理文件。輸入下列命令:
vmuser@Linux-host:hello$ gcc -E hello.c –o hello.i
將會產生 hello.i 文件,這就是 hello.c 經過預處理后的文件。實際操作結果見圖 10.6

10.6 預編譯得到 hello.i 文件
一個原本連同空行才 8 行的代碼,經過預處理,得到了一個 800 多行的預處理文件,文
件開的內容如圖 10.7 所示。

10.7 hello.i 文件開頭
hello.i 文件末尾處的內容如圖 10.8 所示。


10.8 hello.i 文件末尾
其余部分內容請用 Vi 打開后進行查看。可以看到, hello.c 經過預處理后得到的 hello.i
文件,除了原本的幾行代碼之外,還包含了很多額外的變量、函數等等,這些都是預處理器
處理的結果。
2)編譯
gcc 編譯參數加上-S,可以將 hello.i 編譯成 hello.s 文件。命令如下:
vmuser@Linux-host:hello$ gcc -S hello.i

實際操作和結果如圖 10.9 所示。

10.9 編譯得到 hello.s 文件
hello.s 是一個匯編文件,可用 Vi 編輯器打開查看,如圖 10.10 所示。


10.10 hello.s 文件內容
可以看到,該文件內容都是匯編語句。這里不對匯編進行解釋。
3)匯編
得到了匯編文件后,通過 gcc 就可以得到機器碼了。在終端輸入下列命令,可以得到
hello.o 文件。
vmuser@Linux-host:hello$ gcc -c hello.s
實際操作和結果如圖 10.11 所示。


10.11 匯編得到 hello.o 文件
4)鏈接
盡管已經得到了機器碼,但這個文件卻還是不可以運行的,必須要經過鏈接才能運行。
在終端輸入下列命令,將會得到可執行文件 a.out
vmuser@Linux-host:hello$ gcc hello.o
操作和結果如圖 10.12 所示。


10.12 鏈接得到 a.out 文件
a.out gcc 默認輸出文件名稱,可以通過-o 參數指定新的文件名。例如加上“-o hello
參數,將會生成 hello 文件,這個文件和 a.out 實際上是一樣的,用 md5sum 命令計算文件校
驗值,兩者完全一樣,如圖 10.13 所示。


10.13 a.out hello 文件
鏈接可分為動態鏈接和靜態鏈接:
? 動態鏈接使用動態鏈接庫進行鏈接,生成的程序在執行的時候需要加載所需的動態
庫才能運行。動態鏈接生成的程序小巧,但是必須依賴動態庫,否則無法執行。
? Linux 下的動態鏈接庫實際是共享目標文件(shared object),一般是.so 文件,
作用類似于 Windows 下的.dll 文件。
? 靜態鏈接使用靜態庫進行鏈接,生成的程序包含程序運行所需要的全部庫,可以直
接運行,不過體積較大。
? Linux 下靜態庫是匯編產生的.o 文件的集合,一般以.a 文件形式出現。
gcc 默認是動態鏈接,加上-static 參數則采用靜態鏈接。再來看 hello.c 示例,在鏈接的
時候加上-static 參數:
vmuser@Linux-host:hello$ gcc hello.o -static -o hello_static
操作命令和結果如圖 10.14 所示,可以看到,動態鏈接生成的文件大小是 7155 字節,
而靜態鏈接生成的文件卻有 616096 字節,體積明顯大了很多。


10.14 靜態鏈接和動態鏈接結果對比

轉載于:https://www.cnblogs.com/wjchao/p/7460375.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391514.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虎牙直播電影一天收入_電影收入

虎牙直播電影一天收入“美國電影協會(MPAA)的首席執行官J. Valenti提到:“沒有人能告訴您電影在市場上的表現。 直到電影在黑暗的劇院里放映并且銀幕和觀眾之間都散發出火花。 (“The CEO of Motion Picture Association of America (MPAA) J. Valenti mentioned th…

郵箱如何秘密發送多個人郵件_如何發送秘密消息

郵箱如何秘密發送多個人郵件Cryptography is the science of using codes and ciphers to protect messages, at its most basic level. Encryption is encoding messages with the intent of only allowing the intended recipient to understand the meaning of the message.…

leetcode 面試題 17.21. 直方圖的水量(單調棧)

給定一個直方圖(也稱柱狀圖),假設有人從上面源源不斷地倒水,最后直方圖能存多少水量?直方圖的寬度為 1。 上面是由數組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方圖,在這種情況下,可以接 6 個單位的水(藍色部分表示水&a…

python:動態參數*args

動態參數 顧名思義,動態參數就是傳入的參數的個數是動態的,可以是1個、2個到任意個,還可以是0個。在不需要的時候,你完全可以忽略動態函數,不用給它傳遞任何值。 Python的動態參數有兩種,分別是*args和**kw…

3.5. Ticket

過程 3.4. Ticket 使用方法 New Ticket 新建Ticket, Ticket 可以理解為任務。 將Ticket 分配給團隊成員 受到Ticket后,一定要更改Ticket 為 accept , 這時在View Tickets 中將會看到該Ticket已經分配, 編碼過程 這里有一個特別的規定&…

Python操作Mysql實例代碼教程在線版(查詢手冊)_python

實例1、取得MYSQL的版本在windows環境下安裝mysql模塊用于python開發MySQL-python Windows下EXE安裝文件下載 復制代碼 代碼如下:# -*- coding: UTF-8 -*- #安裝MYSQL DB for pythonimport MySQLdb as mdb con None try: #連接mysql的方法:connect(ip,user,pass…

批判性思維_為什么批判性思維技能對數據科學家至關重要

批判性思維As Alexander Pope said, to err is human. By that metric, who is more human than us data scientists? We devise wrong hypotheses constantly and then spend time working on them just to find out how wrong we were.正如亞歷山大波普(Alexander Pope)所說…

leetcode 1143. 最長公共子序列(dp)

給定兩個字符串 text1 和 text2,返回這兩個字符串的最長 公共子序列 的長度。如果不存在 公共子序列 ,返回 0 。 一個字符串的 子序列 是指這樣一個新的字符串:它是由原字符串在不改變字符的相對順序的情況下刪除某些字符(也可以…

【Spark】SparkStreaming-Kafka-Redis-集成-基礎參考資料

SparkStreaming-Kafka-Redis-集成-基礎參考資料 Overview - Spark 2.2.0 DocumentationSpark Streaming Kafka Integration Guide - Spark 2.2.0 DocumentationSpark Streaming Kafka Integration Guide (Kafka broker version 0.8.2.1 or higher) - Spark 2.2.0 Documentat…

Manjaro 17 搭建 redis 4.0.1 集群服務

安裝Redis在Linux環境中 這里我們用的是manjaro一個小眾一些的發行版 我選用的是manjaro 17 KDE 如果你已經安裝好了manjaro 那么你需要準備一個redis.tar.gz包 這里我選用的是截至目前最新的redis 4.0.1版本 我們可以在官網進行下載 https://redis.io/download選擇Stable &…

了解如何使用Flutter構建iOS和Android應用

Learn Flutter in this full course from Nick Manning (of fluttercrashcourse.com). Flutter is Google’s multi-platform mobile development framework used to create apps for Android and iOS using the Dart programming language. 可以從fluttercrashcourse.com的Nic…

leetcode 781. 森林中的兔子(hashmap)

森林中,每個兔子都有顏色。其中一些兔子(可能是全部)告訴你還有多少其他的兔子和自己有相同的顏色。我們將這些回答放在 answers 數組里。 返回森林中兔子的最少數量。 示例: 輸入: answers [1, 1, 2] 輸出: 5 解釋: 兩只回答了 “1” 的兔…

快速排序簡便記_建立和測試股票交易策略的快速簡便方法

快速排序簡便記Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without se…

Java學習第1天:序言,基礎及配置tomcat

所謂是福不是禍,是禍躲不過,到底還是回到java的陣地上來。既然它這么熱,那就學學它,現在這件事已經提上議事日程,也已經開始。 今天做的事: 泛泛的翻了幾本書,敲了一些練習代碼,比如…

robot:List變量的使用注意點

創建list類型變量,兩種方式,建議使用Create List關鍵字 使用該列表變量時需要變為${}方式,切記切記! 轉載于:https://www.cnblogs.com/gcgc/p/11429482.html

python基礎教程(十一)

迭代器 本節進行迭代器的討論。只討論一個特殊方法---- __iter__ ,這個方法是迭代器規則的基礎。 迭代器規則 迭代的意思是重復做一些事很多次---就像在循環中做的那樣。__iter__ 方法返回一個迭代器,所謂迭代器就是具有next方法的對象,在調…

編程需要數學知識嗎_編程需要了解數學嗎?

編程需要數學知識嗎Does programming require knowing math? Not necessarily. 編程需要了解數學嗎? 不必要。 When I say that, Im mostly talking about Web Development, not working with graphics or specific applications that require advanced math. 當我…

美劇迷失_迷失(機器)翻譯

美劇迷失Machine translation doesn’t generate as much excitement as other emerging areas in NLP these days, in part because consumer-facing services like Google Translate have been around since April 2006.如今,機器翻譯并沒有像其他NLP新興領域那樣…

mysql 1449 : The user specified as a definer ('usertest'@'%') does not exist 解決方法 (grant 授予權限)...

從服務器上遷移數據庫到本地localhost 執行 函數 時報錯, mysql 1449 : The user specified as a definer (usertest%) does not exist 經查,是權限問題(其中usertest是服務器上數據庫的登錄名),解決辦法: 授權給 u…

初識數據結構與算法

1、什么是數據結構? a、數據結構是一門研究非數值計算的程序設計問題中的操作對象,以及它們之間的關系和操作等相關問題的學科。 b、數據結構是計算機存儲、組織數據的方式,數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常…