鏈接編譯裝入
㈠ 裝入程序基本介紹
當編譯器、匯編程序或連接程序生成的代碼不能立即直接執行時,它們通常表現為可重定位(relocatable)的形式。這類代碼的特點是其主要存儲器訪問可以在內存的任意位置,且起始位置是不確定的。裝入程序(loader)的作用至關重要,它負責處理這些與指定基地址或起始地址相關的可重定位地址,從而使得程序的執行更為靈活。
通常情況下,裝入處理是在後台進行的,作為操作系統環境的一部分,或者是在與鏈接過程合並時完成。這意味著裝入程序並不是一個獨立運行的程序,而是作為整個系統流程中不可或缺的一環。它確保了程序能夠在正確的地址上被定位並執行,從而保證了系統的穩定性和效率。
總之,裝入程序是一個後台支持工具,它通過調整程序的內存布局,使其能夠適應不同的運行環境和起始地址,使得原本的可重定位代碼能夠有效地轉化為可執行的代碼,但其自身並不作為獨立程序出現,而是作為整個程序生命周期中的隱性步驟。
㈡ 操作系統中 區分編譯後的形成邏輯地址和鏈接後的形成的最終邏輯地址 什麼意思啊
編譯後產生若干個目標模塊,編譯後的邏輯地址指的是每個模塊都從0號單元開始編址,而鏈接將這些模塊鏈接在一起,形成一個完整的裝入模塊,此時的邏輯地址會重新編址,也就是說鏈接後的邏輯地址是將整個模塊從0號單元開始編址。
㈢ 什麼是動態鏈接
動態鏈接是指編譯系統在鏈接階段並不把目標文件和函數庫文件鏈接在一起,而是等到程序在運行過程中需要使用時才鏈接函數庫。
動態鏈接的優缺點
一、動態鏈接的優點是:
使用動態鏈接時,用於動態鏈接的函數代碼保存在與程序的其他部分相獨立的DEF文件中。讀者將會看到,用戶的程序要包含鏈接DLL函數載入指令的少量代碼,但並不將函數本身包括進來。
參考文獻
吳士力,劉奇,朱蘭編著.第4章 Linux應用程序開發 入式LINUX應用開發全程解析與實戰.機械工業出版社,2010.01.
方敏主編;方敏,王亞平,權義寧,王長山編著.第5章 存儲管理 新世紀計算機類本科系列教材 計算機操作系統.西安電子科技大學出版社,2004年08月第1版.
李劍編著.VisualC++.NET實用教程.人民郵電出版社,2002年01月第1版.
㈣ 什麼是裝入有哪些裝入方式分別闡述這些裝入方式的工作原理。
裝入是指將程序和數據從外部存儲介質載入到計算機內存中的過程,以便程序能夠被執行。它是計算機操作系統中非常重要的一個環節,確保程序能夠正確地在內存中運行。
裝入方式主要有三種:絕對裝入、靜態重定位和動態運行時裝入。
1. 絕對裝入方式:
- 工作原理:在編譯時,如果知道程序將放到內存中的哪個位置,編譯程序將產生絕對地址的目標代碼。裝入程序按照裝入模塊中的地址,將程序和數據裝入內存。這種方式的特點是裝入後不需要進行地址的轉換,因為目標代碼中的地址已經是內存中的絕對地址。
- 示例:假設內存起始地址為1000,程序編譯時就確定將從1000號單元開始裝入,那麼編譯器會直接生成以1000為起始地址的目標代碼。
- 適用場景:絕對裝入只適合用於單道程序環境,即內存中同時只運行一個程序的情況。
2. 靜態重定位:
- 工作原理:編譯、鏈接後的裝入模塊地址從0開始,指令中使用的地址和數據存放的地址都是相對於起始地址的邏輯地址。裝入程序會根據內存的當前情況,將裝入模塊裝入到內存的適當位置,並一次性地將所有邏輯地址轉換為物理地址。轉換後的物理地址是相對於內存起始地址的。
- 示例:一個程序編譯後得到的目標模塊從邏輯地址0開始,當它被裝入到內存地址為500的位置時,所有邏輯地址都會加上500,變成物理地址。
- 適用場景:適用於多道程序環境,但要求作業一旦進入內存後,在運行期間不能移動,也不能再申請內存空間。
3. 動態運行時裝入:
- 工作原理:編譯、鏈接後的裝入模塊地址同樣從0開始。但裝入程序把裝入模塊裝入內存後,並不會立即轉換邏輯地址為物理地址。而是在程序真正執行時,才通過重定位寄存器將邏輯地址加上模塊在內存中的起始地址來得到物理地址。這種方式允許程序在內存中移動。
- 示例:程序被裝入內存後,所有地址仍然是邏輯地址。當程序執行某條指令時,比如跳轉到邏輯地址100,CPU會通過重定位寄存器找到模塊在內存中的起始地址,然後將兩者相加得到實際的物理地址,並跳轉到該地址執行指令。
- 適用場景:適用於多道程序環境,特別是需要支持程序在內存中移動或共享內存空間的情況。現代計算機系統普遍採用這種方式。
㈤ C語言文件的編譯與執行的四個階段並分別描述
開發C程序有四個步驟:編輯、編譯、連接和運行。
任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。
1、預處理:導入源程序並保存(C文件)。
2、編譯:將源程序轉換為目標文件(Obj文件)。
3、鏈接:將目標文件生成為可執行文件(EXE文件)。
4、運行:執行,獲取運行結果的EXE文件。
(5)鏈接編譯裝入擴展閱讀:
將C語言代碼分為程序的幾個階段:
1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。
2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。
3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。
4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。