編譯鏈接原理及4G虛擬地址空間內存佈局

如圖所示:
在這裏插入圖片描述

1. 預編譯(生成.i文件)*

命令:gcc -E hello.c -o hello.o

  • 將所有的“#define”刪除,並且展開所有的宏定義(文本替換);
  • 處理所有條件預編譯指令,如:“#if”、“ifdef”、“endif”、“else”、“elif”;
  • 處理“#include”預編譯指令(展開include),將被包含的文件插入到該預編譯指令的位置<這是一個遞歸的過程,被包含的文件可能還包含其他文件> ;
  • 刪除所有的註釋(“//”、“/* */”);
  • 添加行號和文件名標識,以便於編譯時編譯器產生調試用的行號信息及用於編譯時產 生錯誤或警告信息時能夠顯示行號。
  • 保留所有的#pragma編譯器指令,待編譯器使用;

2. 編譯(生成.s文件)*

命令:gcc -S hello.i -o hello.s

  • 把預處理完的文件進行一系列的詞法分析、語法分析、語義分析、彙總符號及優化後生成相應的彙編代碼文件

3. 彙編(生成.o文件,也叫目標文件 <obj文件>)*

命令:gcc -c hello.s -o hello.o
或者從源代碼直接輸出目標文件:gcc -c hello.c -o hello.o

  • 彙編器是將彙編代碼轉變城機器可以執行的指令,每一個彙編語句幾乎都對應一條機器指令。

4. 鏈接(生成.exe文件,也叫可執行文件)*

  • 合併各個段,調整段的大小以及段起始位置,合併符號表
  • 符號解析(符號決議)<"l"符號不解析,只解析“g”符號>
  • 給符號分配虛擬地址和空間
  • 符號重定位

在這裏插入圖片描述
4G虛擬地址空間內存佈局
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章