shaotao的历程 - 不断学习新知识

学习需要过程,而我需要一个博客来记录这个过程!

导航

DLL浅析(1)

windows下的DLL文件和EXE文件实际上是一个概念,都是PE格式的二进制文件。所不同的是:PE文件的头部有个符号为表示该文件是EXE还是DLL,
这里需要注意的是:windows下的DLL文件和EXE文件实际上是一个概念,也就是说:DLL文件不一定是.dll,也有可能是其他的文件:比如.ocx(ocx控件)
或是.cpl(控制面板程序)。最近我就遇到一种DLL文件,它是.lcf(用于处理国际化)。

  当一个PE(一般是DLL)需要将一些函数或变量提供给其他PE(一般是EXE,DLL)文件使用时,我们需要进行符号导出:
如:exports TestDLLExportFunction;在windows下编译器会生成导出表
typedef struct _IMAGE_EXPORT_DIRECTORY {
  DWORD   Characteristics;
  DWORD   TimeDateStamp;
  WORD     MajorVersion;
  WORD     MinorVersion;
  DWORD     Name;
  DWORD   Base;
  DWORD       NumberOfFunctions;
  DWORD       NumberOfNames;
  DWORD       AddressOfFunctions;
  DWORD   AddressOfNames;
  DWORD      AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY

  如果在某个程序中要使用来自DLL的函数,那么在Windows下就要使用导入表
typedef {
  DWORD       OriginalFirstThunk;
  DWORD       TimeDateStamp;
  DWORD   ForworderChain;
  DWORD       Name;
  DWORD       FirstThunk;
} IMAGE_IMPORT_DIRECTORY;

当某个PE(一般是EXE或DLL)文件被加载时,windows加载器的其中一个任务就是将所有需要导入的函数地址确定并且将导入表中的元素跳转到正确的地址,
而真正确定物理地址是在windows的动态链接器在完成该模块的链接时。

posted on 2009-10-16 15:36  shaotao  阅读(330)  评论(0)    收藏  举报