日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

编译器、汇编器、链接器

發布時間:2024/3/12 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译器、汇编器、链接器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接的概念

鏈接(lingking)是將各種代碼和數據片段收集并組合成為一個大一文件的過程,這個文件可以加載(復制)到內存并執行。

鏈接可以執行于

  • 編譯時,也就是在源代碼被翻譯成機器代碼時;
  • 加載時,也就是在程序被加載器(loader)加載到內存并執行時;
  • 運行時;也就是由應用程序來執行。
  • 從源文件到可執行文件

    考慮兩個源文件main.c和sum.c。

    int sum(int *a, int n);int aray[2] = {1, 2};int main() {int val = sum(array, 2);return val; } int sum(int *a, int n) {int i, s = 0;for(i = 0; i < n; i++){s += a[i];} }

    如上圖。驅動程序依次執行以下步驟:

  • 首先,運行C預處理器(cpp),將C的源程序main.c翻譯成一個ASCII碼的中間文件main.i;
  • 接下來,運行C編譯器(ccl),將main.i翻譯成一個ASCII碼的匯編語言文件main.s;
  • 然后,運行匯編器(as),將main.s翻譯成一個可重定位目標文件main.o;
  • 經過上述三個步驟生成sum.o;
  • 最后,運行鏈接器(ld),將main.o和sum.o以及一些必要的系統文件組合起來,創建一個可執行目標文件prog。
  • 各階段的功能如下:

  • 預處理主要用于C語言編譯器對各種預處理命令進行處理,包括對頭文件的包含、宏定義的擴展、條件編譯的選擇等。例如,對# include指示的處理結果,就是將對應.h文件的內容插入到源程序文件中。
  • 編譯會先對源程序進行詞法分析語法分析語義分析,然后根據分析的結果進行代碼優化存儲分配,最終會把C語言源程序翻譯成匯編語言程序
  • 匯編的功能是將編譯生成的匯編語言代碼轉換為機器語言代碼
  • 鏈接的功能是將所有關聯的可重定位目標文件組合起來,以生成一個可執行文件。
  • C語言的翻譯層次

    編譯器

    編譯器將C程序轉換成一種機器能理解的符號形式的匯編語言程序(assmbly language program)

    匯編器

    偽指令:匯編語言指令的一個變種,通常被看作一條匯編指令。

    匯編器將匯編語言程序轉換成目標文件(object file),它包括機器語言指令、數據和指令正確放入內存所需要的信息。

    匯編器將分支和數據傳輸指令中用到的標號都放入一個**符號表(symbol table)**中。

    符號表:一個用來匹配標記名和指令所在內存字的地址的列表。

    UNIX系統中的目標文件通常包含以下6個不同的部分:

    • 目標文件頭,描述目標文件其他部分的大小和位置。
    • 代碼段,包含機器語言代碼。
    • 靜態數據段,包含在程序生命周期內分配的數據
    • 重定位信息,標記了一些在程序加載進內存時依賴于絕對地址的指令和數據。
    • 符號表,包含未定義的剩余標記,如外部引用。
    • 調試信息,包含一份說明目標模塊如何編譯的簡明描述,這樣,調試器能夠將機器指令關聯到 C源文件,并時數據結構也變得可讀。

    鏈接器

    鏈接器:也稱鏈接編譯器。它是一個系統程序,把各個獨立匯編的機器語言程序組合起來并且解決所有未定義的標記,最后生成可執行文件。

    可執行文件:一個具有目標文件格式的功能程序,不包含未解決的引用。它可以包含符號表和調試信息。

    鏈接器的工作分3個步驟

  • 將代碼和數據模塊象征性地放入內存。
  • 決定數據和指令標簽的地址。
  • 修補內部和外部引用。
  • 加載器

    加載器:把目標程序裝載到內存中以準備運行的系統程序。

    現在可執行文件已經在磁盤中,操作系統可以將其讀入內存并啟動執行它。在UNIX系統中,加載器(loader)按照如下步驟工作:

  • 讀取可執行文件頭來確定代碼段和數據段的大小。
  • 為正文和數據創建一個足夠大的地址空間。
  • 將可執行文件中的指令和數據復制到內存中。
  • 把主程序的參數(如果存在)復制到棧頂。
  • 初始化機器寄存器,將棧指針指向第一個空位置。
  • 跳轉到啟動例程,它將參數復制到參數寄存器并且調用程序的main函數。當main函數返回時,啟動例程通過系統調用exit終止程序。
  • 動態鏈接庫

    動態鏈接庫(dynamically linked library,DLL):在程序執行過程中才被鏈接的庫例程。

    總結

    以上是生活随笔為你收集整理的编译器、汇编器、链接器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。