從源代碼到二進制行程序 C語言的編譯過程是怎樣的?
前言
C語言程序從源代碼到二進制行程序都經歷了那些過程?本文以Linux下C語言的編譯過程為例,講解C語言程序的編譯過程。
編寫hello world C程序:
【資料圖】
// hello.c#includeint main(){ printf("hello world!\n");}
編譯過程只需:
$ gcc hello.c # 編譯$ ./a.out # 執行hello world!
這個過程如此熟悉,以至于大家覺得編譯事件很簡單的事。事實真的如此嗎?我們來細看一下C語言的編譯過程到底是怎樣的。
上述gcc命令其實依次執行了四步操作:1.預處理(Preprocessing), 2.編譯(Compilation), 3.匯編(Assemble), 4.鏈接(Linking)。
示例
為了下面步驟講解的方便,我們需要一個稍微復雜一點的例子。假設我們自己定義了一個頭文件mymath.h,實現一些自己的數學函數,并把具體實現放在mymath.c當中。然后寫一個test.c程序使用這些函數。程序目錄結構如下:
├── test.c└── inc ├── mymath.h └── mymath.c
程序代碼如下:
// test.c#include#include "mymath.h"http:// 自定義頭文件int main(){ int a = 2; int b = 3; int sum = add(a, b); printf("a=%d, b=%d, a+b=%d\n", a, b, sum);}
頭文件定義:
// mymath.h#ifndef MYMATH_H#define MYMATH_Hint add(int a, int b);int sum(int a, int b);#endif
頭文件實現:
// mymath.cint add(int a, int b){ return a+b;}int sub(int a, int b){ return a-b;}
1.預處理(Preprocessing)
預處理用于將所有的#include頭文件以及宏定義替換成其真正的內容,預處理之后得到的仍然是文本文件,但文件體積會大很多。gcc的預處理是預處理器cpp來完成的,你可以通過如下命令對test.c進行預處理:
gcc -E -I./inc test.c -o test.i
或者直接調用cpp命令
$ cpp test.c -I./inc -o test.i
上述命令中-E是讓編譯器在預處理之后就退出,不進行后續編譯過程;-I指定頭文件目錄,這里指定的是我們自定義的頭文件目錄;-o指定輸出文件名。
經過預處理之后代碼體積會大很多:
X文件名文件大小代碼行數
預處理前test.c146B9
預處理后test.i17691B857
預處理之后的程序還是文本,可以用文本編輯器打開。
2.編譯(Compilation)
這里的編譯不是指程序從源文件到二進制程序的全部過程,而是指將經過預處理之后的程序轉換成特定匯編代碼(assembly code)的過程。編譯的指定如下:
$ gcc -S -I./inc test.c -o test.s
上述命令中-S讓編譯器在編譯之后停止,不進行后續過程。編譯過程完成后,將生成程序的匯編代碼test.s,這也是文本文件,內容如下:
// test.c匯編之后的結果test.s .file "test.c" .section .rodata.LC0: .string "a=%d, b=%d, a+b=%d\n" .text .globl main .type main, @functionmain:.LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp subl $32, %esp movl $2, 20(%esp) movl $3, 24(%esp) movl 24(%esp), %eax movl %eax, 4(%esp) movl 20(%esp), %eax movl %eax, (%esp) call add movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 12(%esp) movl 24(%esp), %eax movl %eax, 8(%esp) movl 20(%esp), %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc.LFE0: .size main, .-main .ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2" .section .note.GNU-stack,"",@progbits
請不要問我上述代碼是什么意思!-_-
3.匯編(Assemble)
匯編過程將上一步的匯編代碼轉換成機器碼(machine code),這一步產生的文件叫做目標文件,是二進制格式。gcc匯編過程通過as命令完成:
$ as test.s -o test.o
等價于:
gcc -c test.s -o test.o
這一步會為每一個源文件產生一個目標文件。因此mymath.c也需要產生一個mymath.o文件
4.鏈接(Linking)
鏈接過程將多個目標文以及所需的庫文件(.so等)鏈接成最終的可執行文件(executable file)。
命令大致如下:
$ ld -o test.out test.o inc/mymath.o ...libraries...
結語
經過以上分析,我們發現編譯過程并不像想象的那么簡單,而是要經過預處理、編譯、匯編、鏈接。盡管我們平時使用gcc命令的時候沒有關心中間結果,但每次程序的編譯都少不了這幾個步驟。也不用為上述繁瑣過程而煩惱,因為你仍然可以:
$ gcc hello.c # 編譯$ ./a.out # 執行
參考文獻
1.https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html 2.http://www.trilithium.com/johan/2005/08/linux-gate/ 3.https://gcc.gnu.org/onlinedocs/gccint/Collect2.html
標簽:
相關推薦:
精彩放送:
- []【偽元素】CSS帆布Canvas的創建方案
- []環球今日報丨reactnative開發環境安裝androidstudio 安裝問題如下
- []環球熱門:自定義控件GDI繪制在主程序報錯System怎么解決?解決方法
- []全球球精選!揭秘720°三維全景3D實景地圖制作技術 淺談三維全景3D實景地圖核心技術
- []Oracleclient是什么?關于Oracleclient的環境變量設置筆記分析
- []全球熱頭條丨如何設置Windows7Computer?Windows7Computers配置指南
- []每日速看!出境包機游重啟,飛馬爾代夫2萬起步
- []筆記本鍵盤出現錯亂怎么辦?電腦鍵盤錯亂完美解決
- []沉浸式產品如何推動文旅產業進一步發展?
- []當前信息:國內外格斗機器人大比拼 誰才是真正的王者?
- []天天速看:Unity顯示印度語異常 如何糾正錯誤的印度文?
- []動態:中國能建葛洲壩裝備公司張掖市甘州區電化學儲能生產項目正式投產
- []天天即時:儲能項目全年招標44GWh,2023或為國內大儲高增啟動元年
- []【環球快播報】重磅重組取得突破!軍工板塊全線拉升 基金又迎布局良機?
- []大連萬達商管60億元小公募項目狀態更新為“已反饋”
- []高爭民爆:截止1月10日股東人數為19285
- []三元生物:英國泰萊集團是公司合作客戶
- []天天百事通!房企融資去年年末翹尾,2023年萬億償債壓力何解?
- []43家公司已獲A股“入場券” 計劃募資419.97億元
- []世界熱點!“拿1/3居民存款買房”引熱議,孟曉蘇回應
- []【世界熱聞】浙能電力:與浙能電力沒有關系
- []樓市2022:供地涼熱寫趨勢
- []環球實時:消息指賽百味正在研究出售公司事項 估值可能超100億美元
- []天威視訊:公司正在建設深汕威視數據中心項目,目前尚未投產,具體情況可查閱公司2002年半年度報告
- []南瑞繼保力助國內首個電網側大容量構網型儲能電站成功并網!
- []【焦點熱聞】1.72萬只私募基金 僅三成去年實現正收益
- []《非物質文化遺產旅游景區認定》公開征求意見
- []【全球時快訊】頭部私募頻頻加倉 多位明星基金經理發聲看多
- []當前資訊!聯東U谷首個零探智能分布式儲能電站成功投運
- []環球觀察:浙江衢州開化縣1宗商住地1.73億掛牌 須建設指定房型住宅116套
- []天天消息!遠興能源:目前公司持有銀根礦業60%股權,已納入合并報表范圍,按60%持股比例計算歸屬母公司凈利潤
- []【世界新視野】又有A股公司回饋股東!免費送益生菌固體飲料一盒 已有多公司披露相關計劃!
- []鋒物科技退出優尼科物業70%股份 后者經營范圍包括酒店管理
- []世界觀熱點:最新龍虎榜:機構買入黑芝麻超4000萬元,知名游資賣出桂發祥
- []標準股份:截至2023年1月10日,公司股東人數約為2.59萬戶
- []自然資源部:適當增加2023年土地計劃指標分配
- []前中國首富李河君或被警方帶走!
- []儲能系統的構成主要包括哪幾個方面?
- []有望爆炒,2023年潛在主線的能源建設龍頭
- []世界資訊:一款口罩、三種標準(FFP2/KN95/N95)——uvex silv-Air c系列口罩
- []成立3年,百G海辰獲不超80億元授信融資!
- []每日報道:社保賬戶怎么開通
- []怎么查看醫保里面的資金
- []美股異動 | 見知教育(JZ.US)漲超17% 市值升至1.21億美元
- []社保怎樣開通銀行代扣
- []當前熱議!政策加碼護航供需兩端 優質房企有望平穩發展
- []去年一二手房成交量創近年新低! 今年廣州樓市主題仍是“去庫存”
- []【世界時快訊】好醫保怎么報銷醫藥費
- []異地公積金怎么提取出來,到官方網站提取
- []環球視點!外地父母投靠成都入戶需要子女有房產證嗎?
- []天天熱資訊!萬物云:證監會已受理公司實施H股全流通的申請
- []每日資訊:近八成公司業績預喜,茅臺暫居凈利潤“一哥”,這些年報預增股漲瘋了
- []【世界快播報】沃森生物:公司將嚴格按照深交所創業板相關規定,在滿足條件時及時披露相關信息
- []差旅高管談復蘇:簽證、護照申請周期延長,多國對中國旅客收緊限制
- []環球微速訊:藍海華騰:1月10日公司高管時仁帥減持公司股份合計6.78萬股
- []世界速遞!紹興出臺公積金新政 上調貸款額度最高達100萬
- []今熱點:華誼兄弟:1月10日公司高管王忠磊減持公司股份合計171.16萬股
- []世界短訊!昆船智能:截至2023年1月10日我公司股東總數為33025戶
- []二手房周報 | 15城成交低位持穩,京深杭規模環比下降(01.02-01.08)
- []【環球聚看點】我愛我家擬為北京子公司8000萬元債權額度提供擔保
- []焦點速讀:馬蜂窩春節趨勢預測:“療愈度假”類目的地是家庭出游首選
- []無人機百人會隆重舉行,復亞智能斬獲雙項大獎
- []全球快資訊丨北京2022年甲級寫字樓新增供應同比下降76.2%
- []環球最資訊丨奧來德:1月10日公司高管王艷麗減持公司股份合計9000股
- []焦點信息:大唐集團擬為天譽置業子公司提供3.5億一年期貸款 利率6%
- []環球熱文:賽騰股份:1月10日楊偉減持公司股份合計2200股
- []天天熱頭條丨中梁控股2022年累計合約銷售660.5億 12月單月約40億
- []天天簡訊:伊戈爾:公司將會嚴格按照相關法律法規的要求履行信息披露義務
- []世界熱推薦:種植牙集采開標 一顆牙的整體費用有望降低50%左右
- []每日速遞:桂發祥:公司為國資控股上市公司,實際控制人為天津市河西區人民政府國有資產監督管理委員會
- []萊茵體育控股股東已減持1571萬股股票 減持比例1.22%
- []世紀星源計劃引入中霆股份作為深圳平湖舊改項目合作方
- []當前要聞:泰國酒店春節將再迎“中國熱”,內地旅客酒店預訂增長近12倍
- []最新快訊!大悅城控股第四季度新增西安一宗商住地 地價9.1億拆遷費用10.19億
- []【當前熱聞】華陽集團:公司電子外后視鏡產品已獲得定點項目,正在開發中
- []新消息丨40億搶下上海3宗地!起底民企拿地“黑馬”佳運置業
- []環球滾動:保利發展2022年簽約金額4573億 12月拿地金額110.7億
- []全球新消息丨朗詩綠色生活:關于收購北海朗潤商管全部股權的通函將延遲寄發
- []振東制藥:請關注公司后續在巨潮資訊網(www.cninfo.com.cn)上發布的業績預告
- []潤建股份:截止到1月10日,公司股東人數為14616戶
- []快訊丨迪馬股份:新增累計涉及訴訟、仲裁15筆 金額9.19億元
- []新動態:家居丨黃光裕減持國美零售1.4334億股股份 累計套現1631.21萬港元
- []中捷精工:公司全資子公司專業從事壓鑄產品的研發、生產和銷售
- []熱點聚焦:財面兒|新希望五新實業擬發行10億元中票 申購區間3.5%-5.0%
- []全球今日報丨中國海油上調產量目標和資本支出預算 2023年目標凈產650-660百萬桶油當量
- []當前速看:迪阿股份:截至2023年1月10日,公司股東戶數為12,902戶
- []蒙娜麗莎擬用10億閑置資金進行委托理財 并開展15億資金池業務
- []當前資訊!財面兒|德信中國:末期股息派付日更改為2023年11月30日或之前
- []當前快報:天地源擬定增募資12.5億元 將用于項目建設及償還金融機構借款
- []全球熱頭條丨中國國貿:公司設立數字化推進部議案獲董事會決議通過
- []每日速讀!股價不合規 籮筐技術(LKCO.US)面臨退市風險
- []今日觀點!建發物業:關于授出705萬股限制性股份資料通函延期寄發
- []每日消息!舍得酒業:公司超高端產品“舍不得”已在局部市場圈層渠道試銷,無年前舉辦相關發布會的計劃
- []經絡:香港12月份新取用按保數字連升2個月 創4個月新高
- []今天國際:公司訂單交付數據將會在定期報告中匯總披露
- []天天熱頭條丨中原:經紀人指數CSI(住宅售價)升穿50點 預示樓價將止跌回穩
- []世界訊息:康躍科技:目前公司主營業務為醫藥制造業
- []【時快訊】施耐德電氣:直流配電加速發展,需用好“敏捷創新”的利器
- []天天觀速訊丨央行廣州分行:2022年12月末廣東本外幣貸款余額為24.57萬億
- []5GW!明陽高效異質結電池和組件實現“雙下線、雙投產”
- B站注冊資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨家財務顧問 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年營收11.24億元 期內研發費用投入增長19.05%
- 紅棗期貨尾盤拉升大漲近6% 目前紅棗市場總庫存約30萬噸
- 嘉銀金科發布2021年Q2財報 期內凈利潤達1.27億元同比增長208%
- 成都銀行2021上半年凈利33.89億元 期內實現營收同比增長17.27億元
- 汽車之家發布2021年第二季度業績 期內新能源汽車品牌收入增長238%
- 中信銀行上半年實現凈利潤290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價格創新高 全天成交額達1.29億元
- 上半年生物藥大增45% 關鍵財務指標好轉營收賬款持續下降
- 【世界報資訊】安源煤業:公司截至2023年1月10日股東總數為62122戶
- 面對春節期間的美食大餐,控住不住自己怎么辦?肚痛腹瀉纏著你!
- 感染XBB.1.5要囤紙尿褲?大可不必!擔心腹瀉可適量備好和胃整腸丸
- 南昌舉辦金融支持房地產業發展推進會 預計提供簽約授信355億元
- 【速看料】港股餐飲板塊集體下跌 海底撈跌超6%
- 天天微頭條丨南寧百貨:公司申請免稅品經營資質目前仍無新進展,暫無明確的具體時間規劃,能否取得該資質存在不確定性
- 每日熱文:歐圣電氣:截止2023年1月10日收盤公司股東人數15599戶
- 環球觀察:桃李面包業績快報:2022年凈利潤6.48億元 同比下降15%
- 環球熱點評!豫園股份:控股股東復星高科技質押約3.1億股 占公司總股本7.96%
- 【聚看點】派克新材:公司產品供應C919大飛機
- 全球快看:“末日博士”看漲未來五年金價,稱每年能漲10%!背后都有哪些原因?
- 天天最資訊丨黃金市場分析:若跌破1865美元,將挑戰1850美元的心理位
- 美原油交易策略:API原油庫存意外猛增,關注EIA數據
- 【世界播資訊】國際金價逼近1890,美國CPI料續走弱,黃金或被嚴重低估
- 環球新消息丨巴克萊警告:若全球制造業放緩,2023年油價或下跌15-25美元!
- 當前時訊:上海商業地產蓄勢修復,2023年需求回暖趨勢可期
- 1月11日東尼電子漲停分析:蘋果產業鏈,無線耳機,手機產業鏈概念熱股
- 全球今日報丨去年賣地收入少了兩萬億! 今年“土地財政”何去何從?
- 焦點快播:1月11日中天服務漲停分析:物業管理,直播/短視頻概念熱股
- 武漢辦公樓租金和空置率趨于回穩
- 每日速看!1月11日陜西黑貓漲停分析:煤炭,甲醇,煤化工概念熱股
- 天天熱推薦:1月11日楚天龍漲停分析:eSIM,電子身份證,車聯網概念熱股
- 凈利連降三年,招商蛇口醞釀變局
- 華聯控股:華聯南山A區更新項目申報工作正在進行中
- 環球今頭條!板塊異動 | 銀行業將助力優質房企改善現金流 房地產板塊持續拉升
- 天天消息!5至8年進入儲能行業第一方陣!永泰能源轉型加速!
- 全球熱文:上汽集團2022年新能源汽車及海外市場銷量雙雙破百萬輛
- 焦點熱訊:2022年中國儲能鋰電池出貨量達130GWh
- 擴充鋰礦資源儲備!天齊鋰業擬斥資6.32億在澳洲買礦
- 當前熱議!2.68GW/6.67GWh!12月儲能中標項目分析
- 世界今熱點:“旅連連年度企業會員榮譽榜”揭曉丨旅連連2周年特別策劃
- 天天新資訊:旅游大住宿新時代,我們需要什么樣的酒旅榜單?
- 2023基金還能“無腦買就賺”?超7億基民咋辦?收好這條核心策略 兩大方案任您選
- 天天看點:兩會代表徐曉亮:在旅游業復蘇的風口,要打造本土文旅IP
- 百事通!華泰證券(06886.HK)成功發行40億元公司債
- 環球關注:認購熱情持續升溫! 多只主動權益類基金“開門迎客”
- 機構策略:滬指3130點上方謹慎看多 以左側布局為主
- 回收白銀多少錢一克(2023年1月11日)
- 今日播報!港龍中國:2022年合同銷售額約130.04億元 同比下降56.71%
- 禹洲集團:去年累計銷售額356.06億元
- 凱萊英:CDMO在提高創新藥研發效率、加速新藥上市和降低商業化上市新藥的生產成本方面優勢明顯
- 央行:2022年人民幣存款增加26.26萬億元 同比多增6.59萬億元
- 即時:明星私募展望2023年投資:一個值得期待的“雙擊之年”
- 川潤股份:截至2023年1月10日公司股東戶數為79,984戶
- 環球新消息丨中國金茂:2022年累計銷售額1550億元 銷售面積779.53萬平方米
- 【時快訊】遠洋集團:去年銷售額約1002.9億元
- 簡訊:聯得裝備:公司的經營情況將會在定期報告中進行披露
- 湖南省冷水江市召開10GWH鋰電子動力&儲能電池產業園項目洽談會
- 環球頭條:中金2023年展望被動元器件:供給擴張 消費電子和新能源需求共振
- 熱推薦:東北證券鄧利軍:消費賠率與勝率較高 低位布局正當時
- 當前觀點:逾400只基金告別“不敗戰績”!連續5年正收益 這4只主動權益基金做到了
- 扎堆消費類定增 公募鐘情困境反轉細分行業
- 國家發改委:鼓勵直接參與電力市場,縮小代理購電用戶范圍
- 天天熱文:旅游“暖陽”:旅行社加班定制路線,老板喊話員工“歸隊”
- 環球滾動:家居丨正泰電器:南存輝辭任公司總裁 張智寰接任
- 當前資訊!家居丨奧普家居:約2.66億股限售股解除限售 將于1月16日起上市流通
- 【天天報資訊】財面兒丨中國金茂2022年1-12月累計取得簽約銷售額1550億元
- 當前短訊!淮河能源:根據中登公司最近一期發送的股東名冊,本公司的股東總數為49,440戶
- 天天短訊!財面兒丨大悅城子公司出售深圳寶安區9區共5套商業房地產 底價6981.95萬元
- 福星股份增發方案藏蹊蹺 定向增發后開發資金仍存缺口?
- 天天微速訊:甘李藥業:目前公司自主研發的甘精、賴脯以及門冬三款胰島素在歐美兩地的申報工作仍按計劃正常推進中
- 【全球快播報】主動權益基金去年四季報登場:基金樂觀看待后市 股票倉位進一步提高
- 當前簡訊:世行下調全球經濟增長預期,警告經濟衰退!黃金價格逼近1900美元
- 熱資訊!H5小游戲是什么意思?幾款有意思的html游戲推薦
- 全球訊息:如何安裝HERO的root權限?Sprint HTC Hero(Hero 200)獲取ROOT權限
- 世界即時看!58歲庫茲馬曬性感肌肉照 網友:珍妮阿姨看傻了
- 天天速遞!重師計算機專業收分 2019年重慶師范大學計算機與信息科學學院錄取分數線
- 一加侖等于多少升一升多少斤?容積單位換算公制
- 【環球報資訊】游戲設計有什么技巧?5個簡單的游戲設計技巧
- 世界快資訊丨詹姆斯說庫里得MVP 附加賽勝利屬于湖人
- 天天新動態:7款功能最強大的免費殺毒軟件 你用過幾個?
- 鄭州輕工業大學易斯頓美術學院 鄭州輕工業大學是幾本?
- 世界熱議:為什么我玩穿越火線進不去?穿越火線重啟客戶端的解決方法
- 過濾王服務端程序與控制臺如何連接?連接方法步驟
- 快訊:臺式機電腦電源供電不足怎么辦?有哪些故障現象?
- 全球簡訊:智能手環有哪些推薦?智能手環排行榜前十名
- 【新要聞】Windows 10開始菜單打不開點擊無反應怎么辦?解決辦法如下
- 天天資訊:2021山東高考成績查詢時間公布 高考成績查詢通道
- 寇組詞有哪些?寇的拼音是什么?
- 梁子湖有哪些好玩的地方?梁子湖旅游攻略
- 結構體定義:struct與typedef struct 用法詳解
- 【獨家】POWER BI:服務器端全套部署 服務器端安裝SQLSERVER2017(X64)
- 焦點簡訊:諾基亞e900怎么樣?參數配置如何?
- 琵琶頂部弦軸的作用 琵琶頂部的炫軸有什么用?
- 天天播報:《艾米麗在巴黎》第二季拍攝 女神被淋到五官扭曲
- 當前滾動:物聯網系統的投資回報率是多少?物聯網系統開發的11個步驟
- 阿里云原生數據庫系統:機遇與挑戰(附下載)
- 全球百事通!DNF更新卡住怎么辦?選擇角色進入游戲后卡住的解決方法
- 重點單位消防安全如何管理?重點單位消防安全“戶籍化”管理系統上線啦
- 低配置電腦如何設置OBS?obs推流編碼在哪設置?
- 全球今熱點:JRebel熱部署插件有什么用?JRebel熱部署插件評測
- 速看:皇室戰爭寶箱順序是什么?皇室戰爭攻略
- 環球新消息丨12生肖傳奇電視劇有哪些?12生肖的成語你知道多少?
- 環球百事通:【藍拳武器幻化】45級紫戰斧強烈推薦
- 天天關注:視婚姻如兒戲!趙麗穎、馮紹峰官宣離婚
- 環球短訊!安恒信息(688023)1月10日主力資金凈賣出3733.25萬元
- 最新資訊:《四平青年》講述了什么故事?《四平青年》故事梗概
- 全球簡訊:自動稱重系統是什么?自動稱重系統怎么應用?
- 環球百事通!多少分能上諸暨市第二高級中學?諸暨市第二高級中學錄取分數線公布
- 世界球精選!丹東住宿26元 青山溝在丹東市寬甸鎮的住宿推薦