Static libraries

Static libraries

本文关键字:libraries Static      更新时间:2023-10-16

当我想调用一些Windows函数时,如MessageBox,我可以从user32.dll中导入它并调用(与LoadLibrary和GetProcAddress)。但是Visual c++也使用了一个静态库,所以我不需要手动加载dll和函数。它们是如何工作的?它们是否包含每次调用函数时调用LoadLibrary/GetProcAddress的包装器?

您所指的"静态库"实际上是一个导入库。这种类型的库包含记录,这些记录告诉链接器每个函数实际存在于哪个库中,并且本身不包含任何代码。链接器在可执行文件中创建导入记录,加载器在加载时解析这些记录。这修复了运行时使用的地址,因此您的代码不需要显式调用LoadLibraryGetProcAddress

不,它们只允许与dll使用静态链接。可执行文件包含从其他DLL文件中需要的函数列表,因此当加载可执行文件时,加载器解析该列表并使用LoadLibraryGetProcAddress解析每个函数,将结果保存到静态表(IAT,导入地址表)。这只做一次。还有一个DLL的"延迟加载"的概念,只有当函数第一次被调用时才会解析地址,但它很少使用。

以这种方式,DLL的lib文件只包含构建该列表(导出函数的名称)所需的信息。