DLL 那些事

查看某个可执行文件在运行时都需要哪些DLL

dumpbin.exe -imports /path/to/exe

dumpbin 是visual studio 工具集的一个指令,可配合 everything.exe 来定位其具体路径

当一个可执行文件被启动时,操作系统加载程序将为该进程创建虚拟地址空间。然后,加载程序将可执行模块映射到进程的地址空间中。加载程序查看可执行模块的输入节,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。

由于输入节中包含一个DLL名而没有他的路径名。因此加载程序必须搜索用户的磁盘驱动器,找出DLL。下面是加载程序的搜索顺序:

  1. 包含可执行映像文件的目录
  2. 进程的当前目录
  3. Windows 系统目录
  4. Windows 目录
  5. PATH 环境变量中列出的各个目录

运行可执行模块

应该知道其他的东西也会影响加载程序对一个DLL的搜索。当DLL模块映射到进程的地址空间中时,加载程序要检查每个DLL的输入节。如果存在输入节(通常它确实是存在的),那么加载程序便继续搜索将其他必要的DLL模块映射到进程的地址空间中。加载程序将保持对DLL模块的跟踪,使模块的加载和映象只进行一次*尽管多个模块需要该模块)。

如果加载程序无法找到需要的DLL模块,用户会看到对应的错误提示对话框,说“某个DLL 没有找到”。

当所有的DLL 模块都找到并且映射到进程的地址空间中之后,加载程序就会对输入的符号全部引用。为此,它要再次查看每个模块的输入节。对于列出的每个符号,加载程序都要查看指定DLL的输出节,以确定该符号是否存在。如果该符号不存在(这种情况很少),那么加载程序就会弹出一个警告窗口,说找不到某个符号。

如果Windows 2000版本的消息框指明漏掉的是哪个函数,而不是显示用户难以识别的错误代码0xC000007B,那么这将是非常好的。也许下一个Windows版本就能做到这一点。

如果这个符号不存在,那么加载程序将要检索该符号的RVA,并添加DLL模块被加载到的虚拟地址空间(符号在进程的地址空间中的位置)。然后它将该虚拟地址保存在可执行模块的输入节中。这是,当代码引用一个输入符号时,它将查看调用模块的输入节,并且捕获输入符号的地址,这样它就能够成功地访问输入变量、函数或C++类成员函数。好了,动态链接完成,进程的主线程开始执行,应用程序终于也开始运行了!

相关文章

  • 没有相关文章 :(
0 条评论
发表一条评论