網(wǎng)站首頁 編程語言 正文
源文件從文本到可執(zhí)行文件經(jīng)歷的過程
從 .c文件到 .exe文件
gcc hello.c -o hello.exe
源文件( -E) ?預(yù)處理文件 (-S) 匯編文件 (-c) 目標(biāo)文件 ( 無)可執(zhí)行文件
hello.c--預(yù)處理--hello.i--編譯--hello.s---匯編--hello.o--鏈接--hello.exe
預(yù)處理
gcc -E hello.c -o hello.i
1.頭文件展開 —不檢查語法錯誤,可以展開任意文件
2.宏定義—將宏名替換為宏值,不檢查語法錯誤
3.替換注釋—變成空行
4.展開條件編譯—根據(jù)條件來展開指令
編譯
gcc -S hello.i -o hello.s
1.將c程序翻譯為匯編指令
2.逐行檢查語法錯誤–整個編譯4步中最耗時間的過程
匯編
gcc -c hello.s -o hello.o
1.將匯編指令翻譯成對應(yīng)的二進(jìn)制編碼
鏈接
gcc hello.o -o hello.exe
1.數(shù)據(jù)段合并
2.數(shù)據(jù)地址回填
3.庫引入
寄存器、緩存、內(nèi)存三者關(guān)系
cpu計算時,先預(yù)先把要用的數(shù)據(jù)從硬盤督導(dǎo)內(nèi)存,然后再把即將要用的數(shù)據(jù)讀到寄存器中。緩存能夠提高數(shù)據(jù)的讀取速度。
集成開發(fā)環(huán)境 IDE
用于提供程序開發(fā)的應(yīng)用程序,一般包括編輯器、編譯器、調(diào)試器和用戶界面工具。
源程序如何到可執(zhí)行程序
源程序(源代碼)是指按照一定的程序設(shè)計語言規(guī)范編寫的未經(jīng)過編譯的文本文件,是具有可讀性的計算機(jī)語言指令。可以比作自己手寫的程序代碼。
可執(zhí)行程序(Executable Program,EXE file)是可以在操作系統(tǒng)存儲空間中浮動定位的二進(jìn)制可執(zhí)行程序。一般軟件安裝后會生成可執(zhí)行文件,可以直接加載到內(nèi)存中,并又操作系統(tǒng)加載并執(zhí)行。
以 C 語言為例,自己編寫的源代碼文件擴(kuò)展名為 c,這個 c 文件就是源文件。
從源文件到可執(zhí)行文件一般需要經(jīng)過幾個步驟:預(yù)處理->編譯->匯編->鏈接這四個過程。
- 預(yù)處理:預(yù)處理相當(dāng)于根據(jù)預(yù)處理命令將源代碼轉(zhuǎn)換為新的 c 程序,不過通常以 i 為擴(kuò)展名。
- 編譯:將得到的 i 文件翻譯成匯編代碼,通常以 s 為擴(kuò)展名。
- 匯編:將匯編文件翻譯為機(jī)器指令,并打包成可重定位目標(biāo)程序的 o 文件。
- 鏈接:將引用的其它 o 文件加到匯編后的 o 文件中,處理后得到最終的可執(zhí)行文件。
這里首先在 linux 操作系統(tǒng)中編寫源代碼,并命名為 hello.c,內(nèi)容如下:
#include <stdio.h>
int main()
{
? ? printf("Hello world!\n");
? ? return 0;
}
一個很簡單的源代碼,但是這樣的源代碼如果不是在集成開發(fā)環(huán)境(Integrated Development Environment,IDE)中是不能夠直接點(diǎn)擊執(zhí)行的,需要經(jīng)過一系列的操作,具體為:
# 預(yù)處理
gcc -E hello.c -o hello.i
# 編譯
gcc -S hello.i -o hello.s
# 匯編
gcc -c hello.s -o hello.o
# 鏈接
gcc hello.o -o hello
經(jīng)過以下操作后,就能夠發(fā)現(xiàn)在 hello.c 文件同級目錄中出現(xiàn)了文件 hello.i,hello.s,hello.o,hello。可知文件 hello 即為可執(zhí)行程序,我們在終端中輸入下方的指令,就能夠看到最后的輸出結(jié)果。
./hello
原文鏈接:https://blog.csdn.net/MARSHCW/article/details/109210193
相關(guān)推薦
- 2022-05-11 深入理解AQS之獨(dú)占鎖ReentrantLock源碼分析
- 2022-08-02 Golang中panic與recover的區(qū)別_Golang
- 2022-10-22 Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對象方法詳解_Golang
- 2022-12-22 Nginx配置之main?events塊使用示例詳解_nginx
- 2022-08-16 Python中集合的創(chuàng)建及常用函數(shù)的使用詳解_python
- 2024-01-14 Spring boot 注解@Async不生效 無效 不起作用
- 2023-01-03 python案例中Flask全局配置示例詳解_python
- 2022-09-07 Python實(shí)現(xiàn)不寫硬盤上傳文件_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支