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的动态链接器在完成该模块的链接时。
这里需要注意的是: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的动态链接器在完成该模块的链接时。
浙公网安备 33010602011771号