1. 程式人生 > >《程式設計師的自我修養--連結、裝載與庫》筆記--第二章 編譯和連結

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

第二章 編譯和連結

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

  • 預編譯處理規則:

    • 刪除所有“#define”,展開所有的巨集;
    • 處理所有的預編譯指令,比如#if, #ifdef, #elif, #else, #endif;
    • 處理#inlcude預編譯指令,將被包含的檔案插入到該預編譯指令的位置,這是遞迴進行的;
    • 刪除所有註釋;
    • 新增行號和檔名標識;
    • 保留所有的#pragma編譯器指令;
  • 編譯過程就是把預處理完的檔案進行一系列詞法分析,語法分析,語義分析及優化後生產相應的彙編程式碼檔案;

  • 彙編就是將彙編程式碼轉變成及其可以執行的指令,根據彙編指令和機器指令的對照表一一翻譯就可以了;
  • 連結:把各模組之間相互引用的部分處理好,使得各模組之間能夠正確的銜接;
  • 連結過程主要包括:地址和空間分配、符號決議、重定位;

  • 連結的最基本過程和作用:

    比如在main.c中使用另一個模組func.c的函式foo()時:
    使用連結器,你可以直接引用其他模組的函式和全域性變數而無需知道他們的地址,因為連結器在連結的時候根據你所引用的符號foo,自動去相應的模組查詢foo的地址,然後將main.c中使用到的foo的指令重新修正,讓他們的目標地址為真正的foo函式的地址,這就是連結的最基本過程和作用