動態鏈接庫是一個可以被其它應用程序共享的程序模塊,其中封裝了一些可以被共享的例程和資源。動態鏈接庫文件名的擴展名一般是dll,也有可能是drv,sys和fon,它和可執行文件(exe)非常類似,區別在於動態鏈接庫中雖然包含了可執行代碼卻不能單獨執行,而應由應用程序直接或間接調用。
動態鏈接庫是相對於靜態鏈接而言的。所謂靜態鏈接是指把要調用的函數或者過程鏈接到可執行文件中,成為可執行文件的一部分。換句話說,函數和過程的代碼就在程序的可執行文件中,該文件包含了運行時所需的全部代碼。當多個程序都調用相同函數時,內存中就會存在這個函數的多個拷貝,這樣就浪費了寶貴的內存資源。而動態鏈接所調用的函數代碼並沒有被拷貝到應用程序的可執行文件中去,而是僅僅在其中加入了所調用函數的描述信息(往往是一些重定位信息)。僅當應用程序被裝入內存開始運行時,在操作系統的管理下,才在應用程序與相應的動態鏈接庫之間建立鏈接關系。當要執行所調用動態鏈接庫中的函數時,根據連接產生的重定位信息,操作系統才轉去執行動態鏈接庫中相應的函數代碼。
一般情況下,如果一個應用程序使用了動態鏈接庫,Win32系統保證內存中只有動態鏈接庫的一份復制品,這是通過內存映射文件實現的。DLL首先被調入Win32系統的全局堆棧,然后映射到調用這個動態鏈接庫的進程地址空間。在Win32系統中,每個進程擁有自己的32為位線性地址空間,如果一個動態鏈接庫被多個進程調用,每個進程都會收到該動態鏈接庫的一份映像。