Windows应用程序是否需要在编译时了解DLL

时间:2017-09-22 21:20:38

标签: windows dll linker

我搜索了网页,但对我的查询有不同的答案。我不是Windows的专家,但我想完全理解它。

当为Windows编译应用程序时,需要运行时链接库(DLL),比如使用核心库kernel32.dll或其他一些用户创建的dll,应用程序是否需要知道dll在运行时之前存在。

我已经读过dll必须附带一个.lib文件,该文件必须在编译时链接,但在某处它表明不需要.lib文件。

应用程序是否只是执行并期望它会找到dll中所需的函数,如果找不到则会失败?

提前致谢。

1 个答案:

答案 0 :(得分:-1)

动态链接函数列表保存在PECOFF可执行文件的导入部分中,与可选标头中的第二个目录项一起定义。该部分的常用名称为 .idata IMPORT 。 导入目录中保存的唯一必要信息是

  1. 功能名称
  2. 动态库的文件名(无路径)
  3. 所以答案是否定的,链接器不需要知道关于DLL的任何信息,并且它不一定需要在链接时存在。在运行时找到引用的DLL是加载器的工作(并且报告错误最终在库中找不到入口点FunctionName。)

    由于较旧的编译器和链接器缺少声明导入函数及其DLL的指令,因此存在导入库.lib,因此它们需要包含导入定义间接代理的链接库跳到IAT。但好的链接器不需要这个,因为这些信息可以在运行中创建