動態庫技術(windows與linux動態庫)

2021-06-06 21:34:16 字數 2222 閱讀 2788

windows動態庫技術

動態鏈結庫是實現windows應用程式共享資源、節省記憶體空間、提高使用效率的乙個重要技術手段。常見的動態庫包含外部函式和資源,也有一些動態庫只包含資源,如windows字型資源檔案,稱之為資源動態鏈結庫。通常動態庫以.dll,.drv、.fon等作為字尾。相應的windows靜態庫通常以.lib結尾,windows自己就將一些主要的系統功能以動態庫模組的形式實現。

windows動態庫在執行時被系統載入到程序的虛擬空間中,使用從呼叫程序的虛擬位址空間分配的記憶體,成為呼叫程序的一部分。dll也只能被該程序的執行緒所訪問。dll的控制代碼可以被呼叫程序使用;呼叫程序的控制代碼可以被dll使用。dll模組中包含各種匯出函式,用於向外界提供服務。dll可以有自己的資料段,但沒有自己的堆疊,使用與呼叫它的應用程式相同的堆疊模式;乙個dll在記憶體中只有乙個例項;dll實現了**封裝性;dll的編制與具體的程式語言及編譯器無關,可以通過dll來實現混合語言程式設計。dll函式中的**所建立的任何物件(包括變數)都歸呼叫它的執行緒或程序所有。

根據呼叫方式的不同,對動態庫的呼叫可分為靜態呼叫方式和動態呼叫方式。

(1)靜態呼叫,也稱為隱式呼叫,由編譯系統完成對dll的載入和應用程式結束時dll解除安裝的編碼(windows系統負責對dll呼叫次數的計數),呼叫方式簡單,能夠滿足通常的要求。通常採用的呼叫方式是把產生動態連線庫時產生的.lib檔案加入到應用程式的工程中,想使用dll中的函式時,只須在原始檔中宣告一下。 lib檔案包含了每乙個dll匯出函式的符號名和可選擇的標識號以及dll檔名,不含有實際的**。lib檔案包含的資訊進入到生成的應用程式中,被呼叫的dll檔案會在應用程式載入時同時載入在到記憶體中。

(2)動態呼叫,即顯式呼叫方式,是由程式設計者用api函式載入和解除安裝dll來達到呼叫dll的目的,比較複雜,但能更加有效地使用記憶體,是編制大型應用程式時的重要方式。在windows系統中,與動態庫呼叫有關的函式包括:

①loadlibrary(或mfc 的afxloadlibrary),裝載動態庫。

②getprocaddress,獲取要引入的函式,將符號名或標識號轉換為dll內部位址。

③freelibrary(或mfc的afxfreelibrary),釋放動態鏈結庫。

在windows中建立動態庫也非常方便和簡單。在visual c++中,可以建立不用mfc而直接用c語言寫的dll程式,也可以建立基於mfc類庫的dll程式。每乙個dll必須有乙個入口點,在vc++中,dllmain是乙個預設的入口函式。dllmain負責初始化(initialization)和結束(termination)工作。動態庫輸出函式也有兩種約定,分別是基於呼叫約定和名字修飾約定。dll程式定義的函式分為內部函式和匯出函式,動態庫匯出的函式供其它程式模組呼叫。通常可以有下面幾種方法匯出函式:

①採用模組定義檔案的export部分指定要輸入的函式或者變數。

②使用mfc提供的修飾符號_declspec(dllexport)。

③以命令列方式,採用/export命令列輸出有關函式。

在windows動態庫中,有時需要編寫模組定義檔案(.def),它是用於描述dll屬性的模組語句組成的文字檔案。

linux共享物件技術

windows和linux採用動態鏈結庫技術目的是基本一致的,但由於作業系統的不同,他們在許多方面還是不盡相同,下面從以下幾個方面進行闡述。

(1)動態庫程式編寫,在windows系統下的執行檔案格式是pe格式,動態庫需要乙個dllmain函式作為初始化的人口,通常在匯出函式的宣告時需要有_declspec(dllexport)關鍵字。linux下的gcc編譯的執行檔案預設是elf格式,不需要初始化入口,亦不需要到函式做特別宣告,編寫比較方便。

(2)動態庫編譯,在windows系統下面,有方便的除錯編譯環境,通常不用自己去編寫makefile檔案,但在linux下面,需要自己動手去編寫makefile檔案,因此,必須掌握一定的makefile編寫技巧,另外,通常linux編譯規則相對嚴格。

(3)動態庫呼叫方面,windows和linux對其下編制的動態庫都可以採用顯式呼叫或隱式呼叫,但具體的呼叫方式也不盡相同。

(4)動態庫輸出函式檢視,在windows中,有許多任務具和軟體可以進行檢視dll中所輸出的函式,例如命令列方式的dumpbin以及vc++工具中的depends程式。在linux系統中通常採用nm來檢視輸出函式,也可以使用ldd檢視程式隱式鏈結的共享物件檔案。

(5)對作業系統的依賴,這兩種動態庫執行依賴於各自的作業系統,不能跨平台使用。因此,對於實現相同功能的動態庫,必須為兩種不同的作業系統提供不同的動態庫版本。

WINDOWS靜態庫與動態庫

編譯靜態庫時,只會產生.lib檔案。所有資料都在lib檔案中。靜態庫的使用方式只有一種,即靜態載入,在程式編譯鏈結階段,會將靜態庫中的所有資料都鏈結合併到最終生成的exe檔案中,鏈結完成後就不再需要靜態庫檔案,這樣方便程式移植,但是也帶來程式臃腫過大的弊端。同時,如果靜態庫中函式有所變化,需要重新編...

Windows動態分析技術

文章程式來自加密與解謎第三版 軟體分析流程很簡單,根據使用者名稱生成序列號然後對比輸入的序列號。字元常用windows文字框輸入。為了檢查輸入的字元,程式通常才用下面的函式把文字框中的內容都出來。16位 32位 ansi 32位 unicode getdlgitemtext getdlgitemte...

windows遠端ssh與scp操作linux

1 安裝winscp與putty,兩個要放在乙個目錄下。前者負責scp,後者負責ssh。2 winscp使用方法一目了然 3 putty輸入 顯示中文需要進行設定。a 把伺服器端預設編碼改為gb2312。以下是偶的linux端 etc sysconfig i18n lang zh cn.gb1803...