從http://blog.jamesdbloom.com/JVMInternals.html我發現這個鏈接器用內存地址替換符號引用?
C/C++代碼通常編譯成目標文件然後將多個目標文件被鏈接在一起以產品可用僞影,例如可執行文件或DLL。在鏈接階段,每個目標文件中的符號引用被替換爲相對於最終可執行文件的實際內存地址。
怎麼可能鏈接,如果運行可執行的操作系統是一個誰是負責運行系統中分配內存並將此內存被分配等。無論有免費的存儲空間(我的理解中相對確定的內存地址事情如何運作)。
從http://blog.jamesdbloom.com/JVMInternals.html我發現這個鏈接器用內存地址替換符號引用?
C/C++代碼通常編譯成目標文件然後將多個目標文件被鏈接在一起以產品可用僞影,例如可執行文件或DLL。在鏈接階段,每個目標文件中的符號引用被替換爲相對於最終可執行文件的實際內存地址。
怎麼可能鏈接,如果運行可執行的操作系統是一個誰是負責運行系統中分配內存並將此內存被分配等。無論有免費的存儲空間(我的理解中相對確定的內存地址事情如何運作)。
內存地址是相對於最終的可執行文件 - 它們不是絕對的,在鏈接過程中無法確定。
當可執行在Windows中運行,它是由所述操作系統的虛擬內存空間固定大小的或虛擬地址空間,通常4GB在32位操作系統理所當然的。每個進程都有自己的虛擬空間,可以從內存讀寫數據。然後,可執行文件和任何依賴關係被寫入這個空間,所以它們的位置現在是已知的並且在VAS內。現在,一旦執行,操作系統將採用鏈接器提供的相對地址並將其轉換爲絕對地址。這些由可執行程序在虛擬內存空間中的位置決定。
鏈接器輸出相對地址,OS在加載程序時將其轉換爲絕對地址。 –
因此,在程序中使用和定義的所有變量和對象的地址在執行時與程序的起始地址有固定的關係?這意味着如果我的操作系統加載程序有足夠的內存,但不完全在那裏的相對地址的程序將不會運行? – StaticBug
「不完全在相對地址」沒有意義。該程序不會在相對地址加載。操作系統在程序的地址空間中找到空間,將其加載到那裏然後修復地址。請記住,現代操作系統使用虛擬地址空間,因此每個進程都有或多或少的全部內存要加載。 –