C程序的編譯與鏈接


編譯器驅動程序

編譯器驅動程序可以在用戶需要時調用語言預處理器、編譯器、匯編器和鏈接器。
例如使用GNU編譯系統,我們需要使用如下命令來調用GCC驅動程序:

gcc -o main main.c

編譯過程
一個C語言程序從源文件到可執行文件經過如下步驟:

  1. 驅動程序運行C預處理器(cpp),它將main.c翻譯成一個ASCII碼的中間文件main.i。預處理指令以#開頭標識。

    gcc -E -o main.i main.c
    在預處理階段進行的工作包括:
    • 文件包含
    • 宏替換
    • 條件編譯指令
    • 其他預處理指令
  2. 接下來,驅動程序運行C編譯器(cc1)它將main.i翻譯成一個ASCII匯編語言文件main.s

    gcc -S -o main.s main.i
  3. 然后,驅動程序運行匯編器(as),它將main.s翻譯成一個可重定位目標文件main.o

    gcc -c -o main.o main.s
  4. 最后,驅動程序運行鏈接程序(ld),將經前面步驟生成的多個可重定位目標文件以及一些系統必要的系統目標文件組合起來,創建一個可執行目標文件。

    gcc -o main main.o

(這里均使用gcc指令完成,使用單獨的程序例如ld則需要自己手動鏈接大量系統目標文件)

靜態鏈接

像unix ld程序這樣的靜態鏈接器以一組可重定位目標文件命令行參數作為輸入,生成一個完全鏈接的可以加載和運行的可執行目標文件作為輸出。
輸入的可重定位目標文件由各種不同的代碼和數據節組成。
鏈接器的兩個主要任務:

  1. 符號解析
    目的是將每個符號引用剛好和一個符號定義聯系起來。
  2. 重定位
    編譯器和匯編器生成地址從0開始的代碼和數據節。鏈接器通過把每個符號定義與存儲器位置聯系起來,然后修改所有對這些符號的引用,使得它們指向這個存儲器位置,從而重定位這些節

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com