天天看點

《程式員的自我修養--連結、裝載與庫》筆記--第二章 編譯和連結

第二章 編譯和連結

預編譯、編譯、彙編、連結

  • 預編譯處理規則:
    • 删除所有“#define”,展開所有的宏;
    • 處理所有的預編譯指令,比如#if, #ifdef, #elif, #else, #endif;
    • 處理#inlcude預編譯指令,将被包含的檔案插入到該預編譯指令的位置,這是遞歸進行的;
    • 删除所有注釋;
    • 添加行号和檔案名辨別;
    • 保留所有的#pragma編譯器指令;
  • 編譯過程就是把預處理完的檔案進行一系列詞法分析,文法分析,語義分析及優化後生産相應的彙編代碼檔案;
  • 彙編就是将彙編代碼轉變成及其可以執行的指令,根據彙編指令和機器指令的對照表一一翻譯就可以了;
  • 連結:把各子產品之間互相引用的部分處理好,使得各子產品之間能夠正确的銜接;
  • 連結過程主要包括:位址和空間配置設定、符号決議、重定位;
  • 連結的最基本過程和作用:

    比如在main.c中使用另一個子產品func.c的函數foo()時:

    使用連結器,你可以直接引用其他子產品的函數和全局變量而無需知道他們的位址,因為連結器在連結的時候根據你所引用的符号foo,自動去相應的子產品查找foo的位址,然後将main.c中使用到的foo的指令重新修正,讓他們的目标位址為真正的foo函數的位址,這就是連結的最基本過程和作用

繼續閱讀