欧美网址在线观看-亚洲最新毛片-国产成人免费爽爽爽视频-亚洲一区在线影院-日韩欧美在线观看视频网站-男女激情四射-成人一区二区免费看-欧美亚洲综合在线-日韩一级视频在线播放-国产成人三级视频在线播放-亚洲中文字幕日产无码2020-99久久久国产精品免费无卡顿-av在线观看地址-果冻传媒mv免费播放在线观看-欧美在线观看视频免费-日韩天天操

聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

從源代碼到二進制行程序 C語言的編譯過程是怎樣的?

來源:CSDN 時間:2023-01-12 10:33:08

前言

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

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 欧美网址在线观看-亚洲最新毛片-国产成人免费爽爽爽视频-亚洲一区在线影院-日韩欧美在线观看视频网站-男女激情四射-成人一区二区免费看-欧美亚洲综合在线-日韩一级视频在线播放-国产成人三级视频在线播放-亚洲中文字幕日产无码2020-99久久久国产精品免费无卡顿-av在线观看地址-果冻传媒mv免费播放在线观看-欧美在线观看视频免费-日韩天天操

        www.成年人视频| 中文字幕在线观看第三页| 一路向西2在线观看| 欧美午夜性视频| 无码人妻精品一区二区蜜桃网站| 亚洲黄色片免费| 午夜在线观看av| 色戒在线免费观看| 一二三级黄色片| 国产无遮挡猛进猛出免费软件| 青青在线免费观看视频| 熟女人妇 成熟妇女系列视频| 少妇人妻互换不带套| 日韩黄色片视频| 深夜黄色小视频| 伊人色在线视频| 青青青青在线视频| 动漫av网站免费观看| 久草在在线视频| 国产福利精品一区二区三区| 妞干网这里只有精品| 国产一区二区三区在线免费| 国产老熟妇精品观看| 免费看污污网站| 国内av免费观看| 欧美精品一区二区三区三州| 国产成人综合一区| 69精品丰满人妻无码视频a片| 欧美久久在线观看| 天天干天天操天天做| 国产精品国产三级国产专区51| 激情五月宗合网| 九九九九九国产| 97在线国产视频| 天天操天天摸天天爽| 久久久无码中文字幕久...| 久草青青在线观看| 国产日韩欧美大片| 亚洲性图一区二区| 六月丁香激情网| 三年中国中文在线观看免费播放| 欧美s码亚洲码精品m码| 国产日韩第一页| 精品久久久久久中文字幕2017| 免费看黄色a级片| 特级丰满少妇一级| 日韩激情免费视频| av动漫在线播放| 最新免费av网址| 无码精品国产一区二区三区免费| 三级黄色片免费看| 色播五月综合网| 欧美成人黑人猛交| 欧美 日韩 亚洲 一区| 亚洲热在线视频| 网站一区二区三区| 日韩手机在线观看视频| www.亚洲成人网| 图片区乱熟图片区亚洲| 男操女免费网站| 日韩精品免费播放| 日韩一级片播放| 久久九九国产视频| 成年人网站大全| 无码日韩人妻精品久久蜜桃| 午夜精品久久久久久久无码 | 鲁一鲁一鲁一鲁一色| 国产资源在线免费观看| 波多野结衣激情| 色乱码一区二区三区熟女| 国产女同无遮挡互慰高潮91| 黄色三级视频片| 亚洲36d大奶网| 三区视频在线观看| 亚洲国产精品女人| 拔插拔插海外华人免费| 无码熟妇人妻av在线电影| 成人在线视频一区二区三区| 国产一区二区四区| 少妇无码av无码专区在线观看| 美女黄色片网站| 欧美精品久久久久久久自慰| 丁香花在线影院观看在线播放| 精品少妇一区二区三区在线| 玩弄中年熟妇正在播放| 天堂8在线天堂资源bt| 久久久久久久久久网| 亚洲成人福利在线观看| 大桥未久一区二区| 国产精品999视频| 欧美大尺度做爰床戏| 天天干天天操天天干天天操| 四虎4hu永久免费入口| 草草久久久无码国产专区| 999在线观看| 日韩亚洲欧美视频| wwwwwxxxx日本| 日韩日韩日韩日韩日韩| 十八禁视频网站在线观看| 亚洲一区二区中文字幕在线观看| 4444在线观看| 国产九九在线视频| 欧美日韩成人免费视频| 欧美在线aaa| 六月丁香婷婷激情| 亚洲色图都市激情| 日日噜噜噜噜久久久精品毛片| 国产又黄又爽免费视频| 国产精品wwwww| 亚洲精品天堂成人片av在线播放| 久草资源站在线观看| 五月天激情图片| 中文字幕资源在线观看| 丰满少妇被猛烈进入高清播放| 国产91av视频在线观看| 亚欧在线免费观看| 免费特级黄色片| 国产盗摄视频在线观看| 中文字幕第88页| 亚欧在线免费观看| 激情六月丁香婷婷| 久久99久久久久久| 黑人巨大国产9丨视频| 成年人三级黄色片| 最近中文字幕一区二区| 能在线观看的av网站| www..com日韩| 国产精品无码人妻一区二区在线 | 老司机午夜网站| 波多野结衣免费观看| 五月激情婷婷在线| 97超碰人人爽| 热久久久久久久久| 小明看看成人免费视频| www.这里只有精品| 国产精品久久久久久久av福利| 91看片在线免费观看| wwwwxxxx日韩| 日韩av卡一卡二| 亚洲视频在线不卡| 91麻豆天美传媒在线| 国产a级片免费看| 久久亚洲国产成人精品无码区| 四虎精品欧美一区二区免费| 欧洲精品视频在线| 国产资源在线免费观看| 黄色片网址在线观看| 久久国产色av免费观看| 日韩欧美国产片| 天天久久综合网| 国产精品视频一二三四区| 黄色片免费在线观看视频| 欧美男女爱爱视频| 精品久久久久久久无码| 亚洲av无日韩毛片久久| 日本一区二区三区四区五区六区| 欧美交换配乱吟粗大25p| 怡红院av亚洲一区二区三区h| 波多野结衣作品集| gogogo免费高清日本写真| 免费看一级大黄情大片| 久热精品在线观看视频| 国产成人一二三区| 91蝌蚪视频在线观看| 做爰高潮hd色即是空| 成人毛片视频网站| 青娱乐精品在线| 久久精品国产精品亚洲色婷婷| 91av视频免费观看| 成人毛片一区二区| 一二三av在线| 日本成年人网址| 蜜桃网站在线观看| 久久黄色片网站| 成年人观看网站| 国产中文字幕乱人伦在线观看| 天美星空大象mv在线观看视频| 蜜桃视频一区二区在线观看| 青青青国产在线视频| 黄页网站在线观看视频| 日韩av片专区| 狠狠热免费视频| 91av资源网| www.xxx麻豆| 中文字幕在线中文| 国产精品嫩草影院8vv8| 日韩一级片播放| 国产特级淫片高清视频| 毛片av在线播放| 日韩中文在线字幕| 日本一区二区免费高清视频| 亚洲激情在线观看视频| 成人免费观看视频在线观看| www.avtt| 18禁裸男晨勃露j毛免费观看| 手机在线免费毛片| 日韩av加勒比| 日韩欧美色视频| 青娱乐国产精品视频| 精品一区二区成人免费视频 |