用於生成DLL檔案的def檔案的規範寫法

2021-07-06 07:04:42 字數 3663 閱讀 2422

*.def檔案介紹

模組定義   (.def)   檔案為鏈結器提供有關被鏈結程式的匯出、屬性及其他方面的 資訊。

使用def檔案來輸出函式的乙個最主要目的就是:將編譯器生成的函式修飾名去掉,用更加自然的、容易理解的、容易記憶的名字,而不是修飾名來輸出函式。這裡的名字可以不是函式名,這時須使用def檔案的name格式。但由於習慣,大多情況下,只使用函式名,因為這樣最簡單省事。是否存在偷懶的嫌疑?我的理解,不管是羅列函式名,還是其它輸出名,其本質上是一樣的,即都是使用了定義檔案的name格式。直接羅列函式名,就相當於「函式名」=「函式修飾名」,只是可以忽略等號後面的部分,而聯結器會自動完成函式入口的匹配和設定工作。而一旦決定使用非函

數名的其它名字輸出函式,則必須書寫完整的格式,即「函式輸出名」=「要輸出的函式修飾名」,這裡等號後面的部分必須書寫正確,否則,連線時就通不過了。舉個例子:假設動態庫中乙個函式描述如下,

int winapi testadd(int a,int b)

其def檔案的exports段描述如下,

exports

testadd

add=?testadd@@yghhh@z

這裡testadd和add實際上指向同乙個入口。

生成   dll   時,.def   檔案最有用。由於存在可代替模組定義語句使用的鏈結器選項,通常不需要   .def   檔案。也可以將__declspec(dllexport)   用作指定匯出函式的手段。    

在鏈結器階段可以使用   /def(指定模組定義檔案)鏈結器選項呼叫   .def   檔案。    

如果生成的   .exe   檔案沒有匯出,使用   .def   檔案將使輸出檔案較大並降低載入速度。

模組定義語句的規則

下列語法規則適用於   .def   檔案中的所有語句。其他適用於特定語句的規則與各語句一起加以說明。      

1.語句、屬性關鍵字和使用者指定的識別符號

區分大小寫

。      

2.包含空格或分號   (;)   的長檔名必須用引號   (")   引起。      

3.使用乙個或多個空格、製表符或換行符,將語句關鍵字同其引數分開和將各語句分開。指定引數的冒號   (:)   或等號   (=)   兩旁有零個或多個空格、製表符或換行符。      

4.如果使用   name   或   library   語句,則這些語句必須位於所有其他語句之前。      

5.在   .def   檔案中,sections   和   exports   語句可以出現多次。每個語句都可以採用多個規範,各規範間必須用乙個或多個空格、製表符或換行符分開。語句關鍵字必須在第乙個規範的前面出現一次,並且可以在每個附加規範的前面重複。      

6.許多語句都具有等效的   link   命令列選項。有關其他詳細資訊,請參閱相應的   link   選項說明。      

7..def   檔案中的注釋由每個注釋行開始處的分號   (;)   指定。

注釋不能與語句共享一行,但可以在多行語句的規範間出現。(sections   和   exports   為多行語句。)      

8.以十進位制或十六進製制為基礎指定數值引數。      

9.如果字串引數與保留字匹配,則必須用雙引號   (")   將字串引數引起。

library語句

語句樣式:

library   [library][base=address]    

該語句通知   link   建立   dll。link   同時還建立導入庫,除非生成中使用了   .exp   檔案。    

(1)library   引數指定   dll   的名稱。也可以使用   /out   鏈結器選項指定   dll   輸出名。    

(2)base=address   引數設定作業系統用來載入   dll   的基址。該引數重寫   0x10000000   的預設   dll   位置。有關基址的詳細資訊,請參閱   /base   選項說明。      

description語句

description   "text"    

該語句將字串寫入   .rdata   節。將指定的   text   用單引號或雙引號('   或   ")引起。若要在字串中使用引號(單引號或雙引號),請用其他型別的標記括住字串。    

在模組定義檔案中,description   僅在生成虛擬裝置驅動程式   (vxd)   時有效。

exetype語句

exetype:dynamic   |   dev386    

在模組定義檔案中,exetype   僅在生成虛擬裝置驅動程式   (vxd)   時有效。如果生成虛擬裝置驅動程式時在模組定義檔案中沒有指定   exetype,並且如果沒有指定   /exetype   鏈結器選項,則靜態載入   (dev386)   生效。 

export語句

exports    

definitions

exports   語句引入了乙個由乙個或多個   definitions(匯出的函式或資料)組成的節。每個定義必須在單獨一行上。exports   關鍵字可以在第乙個定義所在的同一行上或在前一行上。.def   檔案可以包含乙個或多個   exports   語句。    

匯出   definitions   的語法為:    

entryname[=internalname]   [@ordinal   [noname]]   [private]   [data]    

(1)entryname   是要匯出的函式名或變數名。這是必選項。如果匯出的名稱與   dll   中的名稱不同.  則通過  internalname   指定   dll   中匯出的名稱。

例如,如果   dll   匯出函式   func1(),要將它用作   func2(),則應指定:    

exports    

func2=func1    

(2) 

@ordinal   允許指定是序號而不是函式名將進入   dll   的匯出表。這有助於最小化   dll   的大小。.lib   檔案將包含序號與函式之間的對映,這使您得以像通常在使用   dll   的專案中那樣使用函式名。

(3) 可選的   noname   關鍵字允許只按序號匯出,並減小結果   dll   中匯出表的大小。但是,如果要在   dll   上使用   getprocaddress,則必須知道序號,因為名稱將無效。

(4)可選的   private   關鍵字禁止將   entryname   放到由   link   生成的導入庫中。它對同樣是由   link   生成的影象中的匯出無效。

(5)可選的   data   關鍵字指定匯出的是資料,而不是**。例如,可以匯出資料變數,如下所示:    

exports    

i   data    

當對同一匯出使用   private   和   data   時,private   必須位於   data   的前面。

如何從DLL或者DEF檔案生成LIB檔案《轉》

visual c 開發工具提供了兩個命令列工具,乙個是dumpbin.exe,另乙個是lib.exe。利用這兩個工具即可從dll匯出其對應的lib。1 在命令列執行 dumpbin exports yourdll.dll yourdll.def 2 編輯 yourdll.def 檔案,使之格式與.d...

使用Def檔案匯出Dll檔案

本文介紹如何使用def檔案製作dll。模組定義 def 檔案是包含乙個或多個描述 dll 各種屬性的 module 語句的文字檔案。如果不使用 declspec dllexport 關鍵字匯出 dll 的函式,則 dll 需要 def 檔案。def 檔案必須至少包含下列模組定義語句 步驟 1.新建乙...

使用Def檔案匯出Dll檔案

本文介紹如何使用def檔案製作dll。模組定義 def 檔案是包含乙個或多個描述 dll 各種屬性的 module 語句的文字檔案。如果不使用 declspec dllexport 關鍵字匯出 dll 的函式,則 dll 需要 def 檔案。def 檔案必須至少包含下列模組定義語句 步驟 1.新建乙...