dll是什么文件格式,DLL 文件如何工作?

题图来自Unsplash,基于CC0协议
导读
DLL 文件是什么格式?其实它是一种被称为“动态链接库”的文件格式,实际上是微软的叫法,它的完整中文名叫动态链接库文件。这类文件的扩展名通常是 .dll、.dli、.olb 或 .ocx,在 Windows 系统中扮演着至关重要的角色。从技术角度来看,它本质上是一种包含了指令(代码)和数据的可执行代码库,但这些代码并不是用来自行“运行”程序的,而是被设计用来供其他程序在需要时调用的模块。
这对吧,会想到有些功能既然是重复使用的,我们就不必为每个程序重新编写一遍对吧?这就是DLL的作用所在。通过使用动态链接库,多个程序可以共享某些代码和资源,比如通用函数(如格式化日期、计算数学运算)、界面元素(如按钮、对话框)或设备驱动程序的功能。这样一来,Windows 可以通过相对少量的核心库来支持大量不同的应用程序。
是的,DLL 这个小字就是直接来自“Dynamic Link Library”,即“动态链接库”的英文缩写。这名称本身就道出了它的本质。动态链接表明,这些代码不是在应用程序开发阶段(编译时)被“绑定”到最终的可执行文件中的,而是通常在程序真正运行时(运行时)才被加载和连接到该应用程序的内存执行空间里的。这种延迟绑定有时能提高效率,尤其是在首次使用某个库功能时。
它到底是怎么工作的呢?想象一下,当你编写一个应用程序时,你可能会使用像文件操作、创建图形窗口这样的功能,这些功能通常也是其他程序也用到的通用功能。在你的可执行文件(如程序.exe)中,编译器通常不会被称为“动态链接库”的这些功能代码本身,但它知道你需要这些数据或这些函数(让任务执行起来的那种入口点)。所以它会带上一份清单,一份它到时候需要从外部获取什么(像函数名字、地址等等)。这叫做“导入一个库”。 然后操作系统让你写的程序开始运行,系统就会注意到你的程序说:“嘿,我需要这个.dll文件,它提供这些函数”。操作系统于是就去找相应的 dll 文件(比如 kernel32.dll 处理核心系统任务,user32.dll 处理界面,gdi32.dll 处理图形等等),然后把它的一些指令空间映射到你的程序所在的那个进程中去。现在能不能在这份被映射进去的 dll 空间里找到你需要的函数和(或者是其中的一些地址)?找到了。你就可以在运行的时候,像这样去调用它了。操作系统也是在这种运行时才把具体的调用路径真正对接起来。
说到差异,虽然你可能会听到 EXE 和 DLL。但是 EXE 文件是标准的“应用程序文件”,它是可以直接在操作系统上“运行”起来的,它有自己的、隔离的运行内存空间。而 DLL 本身并不“运行”,它只是代码和数据的一个集合,被“链接”到其他 EXE 或或许是字体服务、系统服务中。此外,DLL 和 EXE 文件在基本性质上有几个关键的不同点:用途上,EXE 的主要目的是执行任务达成用户指令;而 DLL 则是作为可重用代码的仓库,供其他程序调用。 在操作方式上,当你的应用程序在启动时,会通过“导入表”来列出它需要加载哪一个 DLL 文件,动态链接库管理单元(操作系统加载器)于是不声不响地在这个应用程序的“进程空间内”将其一些指令映射进来,这样才能调用这些函数。但虽然,它们一样的,也可以包含像图标、_cursor、字符串等通常属于程序内部“资源”的内容。如果更聚焦的话,就像对于任何一个操作系统(包括 Win),.exe 文件格式允许你启动一个程序执行起来,而 .dll 文件则更像是提供程序能调用的“服务包”供你使用。
© 版权声明
本文由盾科技原创,版权归 盾科技所有,未经允许禁止任何形式的转载。转载请联系candieraddenipc92@gmail.com