我搜索了网页,但对我的查询有不同的答案。我不是Windows的专家,但我想完全理解它。
当为Windows编译应用程序时,需要运行时链接库(DLL),比如使用核心库kernel32.dll或其他一些用户创建的dll,应用程序是否需要知道dll在运行时之前存在。
我已经读过dll必须附带一个.lib文件,该文件必须在编译时链接,但在某处它表明不需要.lib文件。
应用程序是否只是执行并期望它会找到dll中所需的函数,如果找不到则会失败?
提前致谢。
答案 0 :(得分:-1)
动态链接函数列表保存在PECOFF可执行文件的导入部分中,与可选标头中的第二个目录项一起定义。该部分的常用名称为 .idata 或 IMPORT 。 导入目录中保存的唯一必要信息是
所以答案是否定的,链接器不需要知道关于DLL的任何信息,并且它不一定需要在链接时存在。在运行时找到引用的DLL是加载器的工作(并且报告错误最终在库中找不到入口点FunctionName。)
由于较旧的编译器和链接器缺少声明导入函数及其DLL的指令,因此存在导入库.lib,因此它们需要包含导入定义和间接代理的链接库跳到IAT。但好的链接器不需要这个,因为这些信息可以在运行中创建。