編譯鏈接過程

csdn地址:《程序員的自我修養(yǎng)》讀書筆記-編譯鏈接過程

準(zhǔn)備

對(duì)于入門的hello world程序, 如下所示:

#include <stdio.h>
int main()
  {
    printf("hello world\n");
    return 0;
  }

在IDE中僅需點(diǎn)擊一下運(yùn)行既可看到程序的運(yùn)行結(jié)果沟饥,而如果使用GCC編譯锌仅,也非常簡(jiǎn)單贾费,只需gcc hello.c即可生成目標(biāo)文件a.out, 但其中隱藏了編譯鏈接的基本步驟吕世,分別為:預(yù)處理碑幅、編譯戴陡、匯編和鏈接。通過

gcc  --verbose hello.c -o a.out

可看到各步驟的流程枕赵。

預(yù)處理

預(yù)處理過程主要處理源碼中以“#”開始的預(yù)編譯指令猜欺, 比如“#include"、“define"等拷窜。通過預(yù)處理后的輸出文件后綴為.i 或者.ii开皿, 具體實(shí)現(xiàn)預(yù)處理過程的為預(yù)編譯器cpp。若要查看預(yù)處理后的文件篮昧,可用:

gcc -E hello.c -o hello.i
或者:cpp hello.c > hello.i
  • 主要處理規(guī)則:

1. 刪除所有的#define, 并展開所有的宏定義;
2. 處理所有的條件預(yù)編譯指令赋荆,如#if、#ifdef等懊昨;
3. 處理“#include"預(yù)編譯指令窄潭;
4. 刪除所有注釋;
5. 添加行數(shù)和文件名標(biāo)識(shí)酵颁;

  • 舉例說明:

例如定義常量 CONST_TEST嫉你,如下:

#include <stdio.h>
#define CONST_TEST 5
int main()
{
    printf("%d\n", CONST_TEST);
    return 0;
}

在經(jīng)過預(yù)處理后main函數(shù)變成如下:

int main()
{
    printf("%d\n", 5);
    return 0;
}

編譯

編譯過程就是把預(yù)處理完的文件進(jìn)行一系列詞法分析月帝、語法分析、語義分析以及優(yōu)化后生成相應(yīng)的匯編代碼文件幽污。gcc命令如下:

gcc -S hello.i -o hello.s
或者:ccl hello.c
備注:對(duì)于c語言來說嚷辅, 預(yù)處理和編譯的實(shí)現(xiàn)程序?yàn)閏cl, c++對(duì)應(yīng)的程序?yàn)閏clplus距误。

生成的hello.s文件為:

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 12
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    subq    $16, %rsp
    leaq    L_.str(%rip), %rdi
    movl    $0, -4(%rbp)
    movb    $0, %al
    callq   _printf
    movl    $1, %ecx
    movl    %eax, -8(%rbp)          ## 4-byte Spill
    movl    %ecx, %eax
    addq    $16, %rsp
    popq    %rbp
    retq
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
    .asciz  "hello world\n"


.subsections_via_symbols

匯編

匯編過程主要是將匯編代碼轉(zhuǎn)變成機(jī)器可以執(zhí)行的指令, 生成目標(biāo)文件簸搞。gcc命令為:

gcc -c hello.s -o hello.o
或者:as hello.s -o hello.o

鏈接

通過匯編過程生成的目標(biāo)文件并不能直接執(zhí)行,其原因包括:某個(gè)源文件中的函數(shù)可能引用了另一個(gè)源文件中定義的某個(gè)符號(hào)(如變量或者函數(shù)調(diào)用等)准潭;在程序中可能調(diào)用了某個(gè)庫文件中的函數(shù)等趁俊, 而鏈接就是解決這些問題。鏈接程序的主要工作就是將有關(guān)的目標(biāo)文件彼此相連接刑然,也即將在一個(gè)文件中引用的符號(hào)同該符號(hào)在另外一個(gè)文件中的定義連接起來寺擂,使得所有的這些目標(biāo)文件成為一個(gè)能夠按操作系統(tǒng)裝入執(zhí)行的統(tǒng)一整體。鏈接命令為ld泼掠,對(duì)于上訴的hello wrold程序沽讹,可用:

ld -demangle -dynamic -arch x86_64 -macosx_version_min 10.12.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -o hello.out hello.o  -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.osx.a

備注:測(cè)試環(huán)境為mac 10.12.3 (16D32)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末武鲁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蝠检,更是在濱河造成了極大的恐慌沐鼠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹谁,死亡現(xiàn)場(chǎng)離奇詭異饲梭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)焰檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門憔涉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人析苫,你說我怎么就攤上這事兜叨。” “怎么了衩侥?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵国旷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我茫死,道長(zhǎng)跪但,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任峦萎,我火速辦了婚禮屡久,結(jié)果婚禮上忆首,老公的妹妹穿的比我還像新娘。我一直安慰自己被环,他們只是感情好糙及,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛤售,像睡著了一般丁鹉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悴能,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天揣钦,我揣著相機(jī)與錄音,去河邊找鬼漠酿。 笑死冯凹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炒嘲。 我是一名探鬼主播宇姚,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼夫凸!你這毒婦竟也來了浑劳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤夭拌,失蹤者是張志新(化名)和其女友劉穎魔熏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸽扁,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒜绽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桶现。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躲雅。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骡和,靈堂內(nèi)的尸體忽然破棺而出相赁,到底是詐尸還是另有隱情,我是刑警寧澤即横,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布噪生,位于F島的核電站,受9級(jí)特大地震影響东囚,放射性物質(zhì)發(fā)生泄漏跺嗽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桨嫁。 院中可真熱鬧植兰,春花似錦、人聲如沸璃吧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畜挨。三九已至筒繁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巴元,已是汗流浹背毡咏。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逮刨,地道東北人呕缭。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像修己,于是被迫代替她去往敵國(guó)和親恢总。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容