详解模块定义文件---摘自MSDN

来源:互联网 发布:jade软件安装 编辑:程序博客网 时间:2024/05/19 11:45

模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将__declspec(dllexport) 用作指定导出函数的手段。

在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用 .def 文件。

如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。

模块定义语句的规则

下列语法规则适用于 .def 文件中的所有语句。其他适用于特定语句的规则与各语句一起加以说明。

语句、属性关键字和用户指定的标识符区分大小写。

包含空格或分号 (;) 的长文件名必须用引号 (") 引起。

使用一个或多个空格、制表符或换行符,将语句关键字同其参数分开和将各语句分开。指定参数的冒号 (:) 或等号(=) 两旁有零个或多个空格、制表符或换行符。

如果使用 NAME 或 LIBRARY 语句,则这些语句必须位于所有其他语句之前。

在 .def 文件中,SECTIONS 和 EXPORTS 语句可以出现多次。每个语句都可以采用多个规范,各规范间必须用一个或多个空格、制表符或换行符分开。语句关键字必须在第一个规范的前面出现一次,并且可以在每个附加规范的前面重复。

许多语句都具有等效的 LINK 命令行选项。有关其他详细信息,请参见相应的 LINK 选项说明。

.def 文件中的注释由每个注释行开始处的分号 (;) 指定。注释不能与语句共享一行,但可以在多行语句的规范间出现。((SECTIONS 和 EXPORTS 为多行语句。)

以十进制或十六进制为基础指定数值参数。

如果字符串参数与保留字匹配,则必须用双引号 (") 将字符串参数引起。


参考:http://msdn.microsoft.com/zh-cn/library/28d6s79h(v=VS.80).aspx

 

EXPORTS

EXPORTS 关键字可以在第一个定义所在的同一行或前一行上。.def 文件可以包含一个或多个 EXPORTS 语句。

导出 definitions 的语法为:

entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]

entryname 是要导出的函数名或变量名。这是必选项。如果导出的名称与 DLL 中的名称不同,则通过internalname 指定 DLL 中导出的名称。例如,如果 DLL 导出函数 func1(),要将它用作 func2(),则应指定:

EXPORTS

func2=func1

@ordinal 允许指定是序号而不是函数名将进入 DLL 的导出表。这有助于最小化 DLL 的大小。.LIB 文件将包含序号与函数之间的映射,这使您得以像通常在使用 DLL 的项目中那样使用函数名。

可选的 NONAME 关键字允许只按序号导出,并减小结果 DLL 中导出表的大小。但是,如果要在 DLL 上使用GetProcAddress,则必须知道序号,因为名称将无效。

可选的 PRIVATE 关键字禁止将 entryname 放到由 LINK 生成的导入库中。它对同样是由 LINK 生成的图像中的导出无效。

可选的 DATA 关键字指定导出的是数据,而不是代码。例如,可以导出数据变量,如下所示:

EXPORTS

i DATA

当对同一导出使用 PRIVATE 和 DATA 时,PRIVATE 必须位于 DATA 的前面。

有三种导出定义的方法,按照建议的使用顺序依次为:

源代码中的 __declspec(dllexport) 关键字

.def 文件中的 EXPORTS 语句

LINK 命令中的 /EXPORT 规范

所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。

以下是 EXPORTS 节的示例:

EXPORTS

DllCanUnloadNow      @1     PRIVATE   DATA

DllWindowName = Name        DATA

DllGetClassObject    @4 NONAME   PRIVATE

DllRegisterServer    @7

DllUnregisterServer

注意,使用 .def 文件从 DLL 中导出变量时,不需要在变量上指定 __declspec(dllexport)。但是,在任何使用DLL 的文件中,仍必须在数据声明上使用 __declspec(dllimport)。

HEAPSIZE

/HEAP 选项设置堆的大小(以字节为单位)。此选项仅在生成 .exe 文件时使用。

reserve 参数指定虚拟内存中总的堆分配。默认堆大小为 1 MB。链接器将指定值向上舍入为最接近的 4 个字节。

可选 commit 参数取决于操作系统的解释。在 Windows NT/Windows 2000 中,它指定一次分配的物理内存的数量。提交的虚拟内存导致空间被保留在页面文件中。更高的 commit 值在应用程序需要更多堆空间时可节省时间,但会增加内存需求并有可能延长启动时间。

以十进制或 C 语言表示法指定 reserve 值和 commit 值。

通过带 HEAPSIZE 的模块定义文件也可以实现该功能。

在 Visual Studio 开发环境中设置此链接器选项

打开该项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。

单击“链接器”文件夹。

单击“系统”属性页。

修改“堆提交大小”属性。

以编程方式设置此链接器选项

LIBRARY

告知 LINK 创建 DLL。LINK 同时还创建导入库,除非生成中使用了 .exp 文件。

library 参数指定 DLL 的名称。也可以使用 /OUT 链接器选项指定 DLL 输出名。

BASE=address 参数设置操作系统用来加载 DLL 的基址。该参数重写 0x10000000 的默认 DLL 位置。有关基址的详细信息,请参见 /BASE 选项说明。

请记住,在生成 DLL 时使用 /DLL 链接器选项。

NAME (C/C++)

另一种指定输出文件名的方法是使用 /OUT 链接器选项,而另一种设置基址的方法是使用 /BASE 链接器选项。如果两种方法都指定了,则 /OUT 重写 NAME。

如果生成 DLL,NAME 将只影响 DLL 名。

SECTIONS (C/C++)

引入了一个由一个或多个 definitions(关于项目输出文件各节的访问说明符)组成的节。

每个定义必须在单独一行上。SECTIONS 关键字可以在第一个定义所在的同一行或前一行上。.def 文件可以包含一个或多个 SECTIONS 语句。

该 SECTIONS 语句为图像文件中的一节或多节设置属性,并可用于重写每种节类型的默认属性。

definitions 的格式为:

.section_name specifier

此处,.section_name 为程序图像中的节名,specifier 为下列一个或多个访问修饰符:

EXECUTE

READ

SHARED

WRITE

用空格分开修饰符名。例如:

SECTIONS

.rdata READ WRITE

SECTIONS 标记 definitions 节列表的开始位置。每个定义必须在单独一行上。SECTIONS 关键字可以在第一个定义所在的同一行或前一行上。.def 文件可以包含一个或多个 SECTIONS 语句。支持 SEGMENTS 关键字作为 SECTIONS的同义词。

Visual C++ 的早期版本支持:

section [CLASS 'classname'] specifier

出于兼容性考虑,支持 CLASS 关键字,但忽略了它。

另一种指定节属性的方法是使用 /SECTION 选项。

STACKSIZE

设置堆栈的大小(以字节为单位)。

另一种设置堆栈的方法是使用堆栈分配 (/STACK) 选项。有关 reserve 和 commit 参数的详细信息,请参见关于该选项的文档。

该选项对 DLL 无效。

STUB

当用于生成虚拟设备驱动程序 (VxD) 的模块定义文件时,STUB 允许指定包含将在 VxD 中使用的IMAGE_DOS_HEADER 结构(在 WINNT.H 中定义)而不是默认头的文件名。

另一种指定 filename 的方法是使用 /STUB 链接器选项。

在模块定义文件中,STUB 仅在生成 VxD 时有效。

VERSION (C/C++)

通知 LINK 将一个数字放到 .exe 文件或 DLL 的头中。

major 和 minor 参数是从 0 到 65,535 的范围内的十进制数。默认值为 0.0 版。

另一种指定版本号的方法是使用版本信息 (/VERSION) 选项。

保留字

下列字是为链接器保留的。仅当将这些名称用双引号 ("") 括起来时,它们才可用作 模块定义语句 中的参数。

APPLOADER1

INITINSTANCE2

PRELOAD

BASE

IOPL

PRIVATE

CODE

LIBRARY1

PROTMODE2

CONFORMING

LOADONCALL1

PURE1

DATA

LONGNAMES2

READONLY

DESCRIPTION

MOVABLE1

READWRITE

DEV386

MOVEABLE1

REALMODE1

DISCARDABLE

MULTIPLE

RESIDENT

DYNAMIC

NAME

RESIDENTNAME1

EXECUTE-ONLY

NEWFILES2

SECTIONS

EXECUTEONLY

NODATA1

SEGMENTS

EXECUTEREAD

NOIOPL1

SHARED

EXETYPE

NONAME

SINGLE

EXPORTS

NONCONFORMING1

STACKSIZE

FIXED1

NONDISCARDABLE

STUB

FUNCTIONS2

NONE

VERSION

HEAPSIZE

NONSHARED

WINDOWAPI

IMPORTS

NOTWINDOWCOMPAT1

WINDOWCOMPAT

IMPURE1

OBJECTS

WINDOWS

INCLUDE2

OLD1

 

1 链接器在遇到此术语时发出警告(“忽略”)。不过,该保留字仍然保留。

2 链接器忽略该字,但是不发出警告。

原创粉丝点击