2016-02-27 14 views
2

我不完全理解爲什麼我們需要鏈接器。編譯器首先將高級代碼轉換爲程序集,然後將該彙編代碼轉換爲機器代碼。我們想要的一切(除了哪個地址加載此代碼)都存在。爲什麼需要獨立的Linker模塊? 假設我的計劃是鏈接器/編譯器中的解析引用是什麼意思?

printf("Hello Basic Question!"); 

這個C代碼翻譯成一堆彙編指令。當我們說連接器解析引用printf時,我不明白。你能否詳細說明一下? 這是否意味着在某些庫中存在printf與彙編指令之間的映射關係,並且鏈接器只是簡單地將該映射拉出來並用替換該映射?

回答

3

printf是一個函數,它不在你的代碼中,而是在一個對象庫中。 printf調用一些內核函數來輸出消息。 鏈接器解析引用,從庫中提取對象模塊並將它們添加到可執行文件中。它還解析了調用內核函數的參考,併產生了OS loader module用來分配內存,加載和執行代碼的所有數據結構。

+0

感謝您的精彩解釋。但我有一個問題。那麼預處理器是做什麼的?是不是在定義了printf()的地方添加了0​​並更新了源文件?然後新的源文件在其中定義了printf()並進行編譯?如果我提出一個荒謬而愚蠢的問題,我很抱歉。我對這個部分是新手。請多多包涵。 – lU5er

+1

@ lU5er預處理器只包含主文件中的另一個文件,並執行一些**文本轉換**,即宏替換(您可能想要閱讀wikipedia在此處所說的內容:https://en.wikipedia.org/wiki/C_preprocessor) 。特別是''在你的源文件中包含所有對全局變量的引用,以及對於I/O函數的函數原型'printf'。您的代碼和對象庫代碼和操作系統功能之間的**鏈接**仍然完全按照上面解釋的對鏈接器進行收費。當然,對於所有編譯語言(鏈接器使用對象模塊,不關心src語言) –

+0

謝謝。 :) – lU5er

相關問題