2011-04-04 64 views

回答

5

gcc不知道。它知道有一個函數printf,它知道如何調用它,但它生成的目標文件包含對未解析符號的調用。

該符號然後由鏈接器解析,該鏈接器提供所有對象文件和庫。鏈接器在庫中找到符號printf,並在其組合所有相關模塊之後,它更新未解析的調用。

+0

它如何知道應該靜態解析(printf)(鏈接時間)還是動態解析(運行時間)? – 2011-04-04 06:43:57

+0

編譯器留下一個佔位符來調用'printf'。它不知道函數的位置,所以它只是調用一些僞造的地址並將其標記爲鏈接器來修復。鏈接器知道這個函數存在於一個動態加載的庫中(你這樣說),並且標記它以便OS加載器修復。然後OS在加載時解決這個問題,當它加載庫(或者它已經加載)並且知道'printf'的真實地址時。 – 2011-04-04 07:26:59

+0

對,這就是過程鏈接表的工作原理,但鏈接器如何知道像'printf'這樣的函數是否應該首先由操作系統或其本身解決? **我們如何告訴它? – 2011-04-04 07:31:38

相關問題