專利名稱::一種動態(tài)鏈接方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明屬于計算機軟件
技術(shù)領(lǐng)域:
,尤其涉及一種動態(tài)鏈接方法及系統(tǒng)。
背景技術(shù):
:動態(tài)鏈接庫(英文:DynamicLinkLibrary,簡稱:DLL)是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫,DLL不是一個可執(zhí)行文件。動態(tài)鏈接提供了一種方法,使進程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù),函數(shù)的可執(zhí)行代碼位于一個DLL中,該DLL包含一個或多個已經(jīng)被編譯、鏈接并與使用它們的進程分開存儲的函數(shù)。DLL還有助于共享數(shù)據(jù)和資源。但是動態(tài)鏈接依賴于系統(tǒng)的支持,在Linux系統(tǒng)下通過動態(tài)鏈接的函數(shù)就可以完成動態(tài)鏈接庫的鏈接,而一些系統(tǒng)不支持動態(tài)鏈接。
發(fā)明內(nèi)容本發(fā)明實施例的目的在于提供一種動態(tài)鏈接方法及系統(tǒng),以解決現(xiàn)有技術(shù)存在的,一些系統(tǒng)不支持動態(tài)鏈接,應(yīng)用無法調(diào)用動態(tài)鏈接庫的問題。本發(fā)明的實施例是這樣實現(xiàn)的,一種動態(tài)鏈接方法,所述方法包括以下步驟:讀取可執(zhí)行連接格式ELF的庫,所述可執(zhí)行連接格式ELF的庫包括:庫函數(shù)的跳轉(zhuǎn)地址和庫函數(shù)的代碼段;復(fù)制庫函數(shù)的跳轉(zhuǎn)地址至應(yīng)用的跳轉(zhuǎn)表預(yù)留空間,復(fù)制庫函數(shù)的代碼段至應(yīng)用的應(yīng)用部分預(yù)留空間,所述庫函數(shù)的代碼段在庫中和應(yīng)用中的地址一致;應(yīng)用調(diào)用庫函數(shù)時,在應(yīng)用的跳轉(zhuǎn)表中查詢庫函數(shù)的跳轉(zhuǎn)地址,根據(jù)所述庫函數(shù)的跳轉(zhuǎn)地址,跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行;庫函數(shù)調(diào)用應(yīng)用時,在應(yīng)用的跳轉(zhuǎn)表中查詢應(yīng)用對應(yīng)的函數(shù)地址,根據(jù)所述應(yīng)用對應(yīng)的函數(shù)地址,跳轉(zhuǎn)到應(yīng)用的代碼段執(zhí)行。本發(fā)明的實施例的另一目的在于提供一種動態(tài)鏈接系統(tǒng),所述系統(tǒng)包括:讀取單元,用于讀取可執(zhí)行連接格式ELF的庫,所述可執(zhí)行連接格式ELF的庫包括:庫函數(shù)的跳轉(zhuǎn)地址和庫函數(shù)的代碼段;復(fù)制單元,用于復(fù)制庫函數(shù)的跳轉(zhuǎn)地址至應(yīng)用的跳轉(zhuǎn)表預(yù)留空間,復(fù)制庫函數(shù)的代碼段至應(yīng)用的應(yīng)用部分預(yù)留空間,所述庫函數(shù)的代碼段在庫中和應(yīng)用中的地址一致;第一調(diào)用單元,用于應(yīng)用調(diào)用庫函數(shù)時,在應(yīng)用的跳轉(zhuǎn)表中查詢庫函數(shù)的跳轉(zhuǎn)地址,根據(jù)所述庫函數(shù)的跳轉(zhuǎn)地址,跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行;第二調(diào)用單元,用于庫函數(shù)調(diào)用應(yīng)用時,在應(yīng)用的跳轉(zhuǎn)表中查詢應(yīng)用對應(yīng)的函數(shù)地址,根據(jù)所述應(yīng)用對應(yīng)的函數(shù)地址,跳轉(zhuǎn)到應(yīng)用的代碼段執(zhí)行。本發(fā)明實施例通過將庫函數(shù)的跳轉(zhuǎn)地址以及庫函數(shù)的代碼段復(fù)制到應(yīng)用中,使得應(yīng)用和庫函數(shù)可以相互調(diào)用,解決了現(xiàn)有技術(shù)存在的,一些系統(tǒng)不支持動態(tài)鏈接的情況下,應(yīng)用無法調(diào)用動態(tài)鏈接庫的問題。為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1是本發(fā)明實施例提供的動態(tài)鏈接方法的實現(xiàn)流程圖;圖2是本發(fā)明實施例提供的可執(zhí)行連接格式的庫的結(jié)構(gòu)示意圖;圖3是本發(fā)明實施例提供的復(fù)制之前的應(yīng)用的結(jié)構(gòu)示意圖;圖4是本發(fā)明實施例提供的復(fù)制之后的應(yīng)用的結(jié)構(gòu)示意圖;圖5是本發(fā)明實施例提供的動態(tài)鏈接系統(tǒng)的模塊結(jié)構(gòu)圖。具體實施例方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。本發(fā)明實施例提供了動態(tài)鏈接方法,所述方法的執(zhí)行主體是動態(tài)庫鏈接系統(tǒng),所述方法如圖1所示,具體步驟包括:S11、讀取可執(zhí)行連接格式(英文!ExecutableandLinkableFormat,簡稱:ELF)的庫。在步驟所述Sll之前,ELF的庫通過編譯鏈接DLL和手工創(chuàng)建的跳轉(zhuǎn)表構(gòu)成,圖2為可執(zhí)行連接格式的庫的結(jié)構(gòu)示意圖,所述ELF的庫包括現(xiàn)行輸出跳轉(zhuǎn)表、虛擬輸入跳轉(zhuǎn)表和應(yīng)用部分,所述現(xiàn)行輸出跳轉(zhuǎn)表存儲庫函數(shù)的跳轉(zhuǎn)地址和屬性,應(yīng)用部分存儲了庫函數(shù)的代碼段、數(shù)據(jù)和靜態(tài)數(shù)據(jù)。S12、復(fù)制所述庫函數(shù)的跳轉(zhuǎn)地址至應(yīng)用的跳轉(zhuǎn)表預(yù)留空間,復(fù)制庫函數(shù)的代碼段至應(yīng)用的應(yīng)用部分預(yù)留空間。需要說明的是,庫函數(shù)的跳轉(zhuǎn)地址用于應(yīng)用或者其它函數(shù)調(diào)用庫函數(shù)時,通過所述庫函數(shù)的跳轉(zhuǎn)地址找到庫函數(shù)的代碼段的位置;庫函數(shù)的代碼段從庫中復(fù)制到應(yīng)用中,庫函數(shù)的代碼段存儲的地址不變,否則通過庫函數(shù)的跳轉(zhuǎn)地址無法準(zhǔn)確找到庫函數(shù)的代碼段。圖3為復(fù)制之前的應(yīng)用的結(jié)構(gòu)示意圖,圖4為復(fù)制之后的應(yīng)用的結(jié)構(gòu)示意圖,復(fù)制的過程包括:復(fù)制圖2中現(xiàn)行輸出跳轉(zhuǎn)表至圖3中虛擬輸出跳轉(zhuǎn)表,復(fù)制圖2中的代碼段、數(shù)據(jù)和靜態(tài)數(shù)據(jù)區(qū)至圖3中應(yīng)用的應(yīng)用部分預(yù)留的空間。S13、應(yīng)用調(diào)用庫函數(shù)時,在應(yīng)用的跳轉(zhuǎn)表查詢庫函數(shù)的跳轉(zhuǎn)地址,根據(jù)所述庫函數(shù)的跳轉(zhuǎn)地址,跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行;S14、庫函數(shù)調(diào)用應(yīng)用時,在應(yīng)用的跳轉(zhuǎn)表中查詢應(yīng)用對應(yīng)的函數(shù)地址,根據(jù)所述應(yīng)用對應(yīng)的函數(shù)地址,跳轉(zhuǎn)到應(yīng)用的代碼段執(zhí)行。需要說明的是,在沒有復(fù)制庫函數(shù)的跳轉(zhuǎn)地址和庫函數(shù)的代碼段之前,在應(yīng)用的跳轉(zhuǎn)表中就存儲有應(yīng)用對應(yīng)的函數(shù)地址。如圖4所示,虛擬輸出跳轉(zhuǎn)表和現(xiàn)行輸入跳轉(zhuǎn)表統(tǒng)稱應(yīng)用的跳轉(zhuǎn)表,在DLL結(jié)束部分上面的代碼段、數(shù)據(jù)和靜態(tài)數(shù)據(jù)是從庫中復(fù)制過來的,DLL結(jié)束部分下面的代碼、數(shù)據(jù)和靜態(tài)數(shù)據(jù)是復(fù)制之前應(yīng)用中存在的;步驟I是應(yīng)用調(diào)用庫函數(shù)時,在虛擬輸出跳轉(zhuǎn)表中找到庫函數(shù)的跳轉(zhuǎn)地址,然后步驟2是跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行;步驟3是庫函數(shù)調(diào)用應(yīng)用對應(yīng)的函數(shù)時,在現(xiàn)行輸入跳轉(zhuǎn)表中找到應(yīng)用對應(yīng)的函數(shù)地址,然后步驟4是跳轉(zhuǎn)到應(yīng)用的代碼段執(zhí)行。需要說明的是,庫函數(shù)和應(yīng)用的函數(shù)之間可能會存在相互調(diào)用的關(guān)系,通過上述方法實現(xiàn)了庫函數(shù)和應(yīng)用的函數(shù)相互調(diào)用,使得應(yīng)用和動態(tài)鏈接庫方便、靈活地互相調(diào)用。在本實施例中,通過將庫函數(shù)的跳轉(zhuǎn)地址復(fù)制到應(yīng)用的跳轉(zhuǎn)表,可以使得應(yīng)用調(diào)用庫函數(shù)時,在應(yīng)用的跳轉(zhuǎn)表找到庫函數(shù)的跳轉(zhuǎn)地址并根據(jù)所述跳轉(zhuǎn)地址跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行,實現(xiàn)了應(yīng)用對動態(tài)鏈接庫的調(diào)用,解決了現(xiàn)有技術(shù)存在的一些系統(tǒng)不支持動態(tài)鏈接時,應(yīng)用無法調(diào)用動態(tài)鏈接庫的問題。本發(fā)明實施例提供了動態(tài)鏈接系統(tǒng),所述系統(tǒng)如圖5所示,具體包括:讀取單元51,用于讀取ELF的庫,所述ELF的庫包括:庫函數(shù)的跳轉(zhuǎn)地址、庫函數(shù)的屬性、庫函數(shù)的代碼段、庫函數(shù)的數(shù)據(jù)和庫函數(shù)的靜態(tài)數(shù)據(jù)。復(fù)制單元52,用于復(fù)制庫函數(shù)的跳轉(zhuǎn)地址至應(yīng)用的跳轉(zhuǎn)表預(yù)留空間,復(fù)制庫函數(shù)的代碼段至應(yīng)用的應(yīng)用部分預(yù)留空間,所述庫函數(shù)的代碼段在庫中和應(yīng)用中的地址一致。第一調(diào)用單元53,用于應(yīng)用調(diào)用庫函數(shù)時,在應(yīng)用的跳轉(zhuǎn)表中查詢庫函數(shù)的跳轉(zhuǎn)地址,根據(jù)所述庫函數(shù)的跳轉(zhuǎn)地址,跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行。第二調(diào)用單元54,用于庫函數(shù)調(diào)用應(yīng)用時,在應(yīng)用的跳轉(zhuǎn)表中查詢應(yīng)用對應(yīng)的函數(shù)地址,根據(jù)所述應(yīng)用對應(yīng)的函數(shù)地址,跳轉(zhuǎn)到應(yīng)用的代碼段執(zhí)行。本領(lǐng)域普通技術(shù)人員可以理解為上述實施例所包括的各個模塊只是按照功能邏輯進行劃分的,但并不局限于上述的劃分,只要能夠?qū)崿F(xiàn)相應(yīng)的功能即可;另外,各功能模塊的具體名稱也只是為了便于相互區(qū)分,并不用于限制本發(fā)明的保護范圍。本領(lǐng)域普通技術(shù)人員還可以理解,實現(xiàn)上述實施例方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,所述的程序可以在存儲于可讀取存儲介質(zhì)中,所述的存儲介質(zhì),包括R0M/RAM等。以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。權(quán)利要求1.一種動態(tài)鏈接方法,其特征在于,所述方法包括:讀取可執(zhí)行連接格式ELF的庫,所述可執(zhí)行連接格式ELF的庫包括:庫函數(shù)的跳轉(zhuǎn)地址和庫函數(shù)的代碼段;復(fù)制庫函數(shù)的跳轉(zhuǎn)地址至應(yīng)用的跳轉(zhuǎn)表預(yù)留空間,復(fù)制庫函數(shù)的代碼段至應(yīng)用的應(yīng)用部分預(yù)留空間,所述庫函數(shù)的代碼段在庫中和應(yīng)用中的地址一致;應(yīng)用調(diào)用庫函數(shù)時,在應(yīng)用的跳轉(zhuǎn)表中查詢庫函數(shù)的跳轉(zhuǎn)地址,根據(jù)所述庫函數(shù)的跳轉(zhuǎn)地址,跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行;庫函數(shù)調(diào)用應(yīng)用時,在應(yīng)用的跳轉(zhuǎn)表中查詢應(yīng)用對應(yīng)的函數(shù)地址,根據(jù)所述應(yīng)用對應(yīng)的函數(shù)地址,跳轉(zhuǎn)到應(yīng)用的代碼段執(zhí)行。2.如權(quán)利要求1所述的方法,其特征在于,所述讀取可執(zhí)行連接格式ELF的庫之前包括:編譯鏈接動態(tài)鏈接庫DLL和手工創(chuàng)建的跳轉(zhuǎn)表構(gòu)成ELF的庫。3.一種動態(tài)鏈接系統(tǒng),其特征在于,所述系統(tǒng)包括:讀取單元,用于讀取可執(zhí)行連接格式ELF的庫,所述可執(zhí)行連接格式ELF的庫包括:庫函數(shù)的跳轉(zhuǎn)地址和庫函數(shù)的代碼段;復(fù)制單元,用于復(fù)制庫函數(shù)的跳轉(zhuǎn)地址至應(yīng)用的跳轉(zhuǎn)表預(yù)留空間,復(fù)制庫函數(shù)的代碼段至應(yīng)用的應(yīng)用部分預(yù)留空間,所述庫函數(shù)的代碼段在庫中和應(yīng)用中的地址一致;第一調(diào)用單元,用于應(yīng)用調(diào)用庫函數(shù)時,在應(yīng)用的跳轉(zhuǎn)表中查詢庫函數(shù)的跳轉(zhuǎn)地址,根據(jù)所述庫函數(shù)的跳轉(zhuǎn)地址,跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行;第二調(diào)用單元,用于庫函數(shù)調(diào)用應(yīng)用時,在應(yīng)用的跳轉(zhuǎn)表中查詢應(yīng)用對應(yīng)的函數(shù)地址,根據(jù)所述應(yīng)用對應(yīng)的函數(shù)地址,跳轉(zhuǎn)到應(yīng)用的代碼段執(zhí)行。4.如權(quán)利要求3所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括:編譯單元,用于編譯鏈接動態(tài)鏈接庫DLL和手工創(chuàng)建的跳轉(zhuǎn)表構(gòu)成ELF的庫。全文摘要本發(fā)明適用于計算機軟件
技術(shù)領(lǐng)域:
,提供了一種動態(tài)鏈接方法及系統(tǒng),所述方法包括讀取可執(zhí)行連接格式ELF的庫;復(fù)制庫函數(shù)的跳轉(zhuǎn)地址至應(yīng)用的跳轉(zhuǎn)表預(yù)留空間,復(fù)制庫函數(shù)的代碼段至應(yīng)用的應(yīng)用部分預(yù)留空間,所述庫函數(shù)的代碼段在庫中和應(yīng)用中的地址一致;應(yīng)用調(diào)用庫函數(shù)時,在應(yīng)用的跳轉(zhuǎn)表中查詢庫函數(shù)的跳轉(zhuǎn)地址,根據(jù)所述庫函數(shù)的跳轉(zhuǎn)地址,跳轉(zhuǎn)到庫函數(shù)的代碼段執(zhí)行;庫函數(shù)調(diào)用應(yīng)用時,在應(yīng)用的跳轉(zhuǎn)表中查詢應(yīng)用對應(yīng)的函數(shù)地址,根據(jù)所述應(yīng)用對應(yīng)的函數(shù)地址,跳轉(zhuǎn)到應(yīng)用的代碼段執(zhí)行。本發(fā)明通過將庫函數(shù)的跳轉(zhuǎn)地址和代碼段復(fù)制到應(yīng)用中,解決了現(xiàn)有技術(shù)存在的一些系統(tǒng)不支持動態(tài)鏈接庫的情況下,應(yīng)用無法調(diào)用動態(tài)鏈接庫的問題。文檔編號G06F17/30GK103218428SQ20131012111公開日2013年7月24日申請日期2013年4月9日優(yōu)先權(quán)日2013年4月9日發(fā)明者劉高科申請人:深圳市九洲電器有限公司