读《程序员的自我修养》(五)

2010阅读 0评论2013-05-10 猪也有春天
分类:LINUX

第五章在之前初步熟悉Linux ELF文件格式的基础上,开始介绍了Windows下的目标文件和可执行文件PE/COFF的基本格式。所有内容对我来说也是全新扫盲了。
  Windows的可执行文件格式PE源于COFF,最主要的变化包括两点:
1、文件开头不再是COFF文件头,而是DOS MZ可执行文件格式的文件头和DOS桩代码——这点完全是为了当初与DOS下可执行文件的MZ格式兼容。
    虽然Windows下和DOS下的可执行文件都是exe后缀,但是二者其实完全不同,在纯DOS下是不能运行PE文件的,如果在纯DOS环境下运行PE格 式的exe文件,DOS操作系统在识别了PE格式的DOS MZ文件头之后,会跳转到DOS桩代码,执行结果为“This program cannot be run in DOS”后退出。
        反之,在Windows下则可以执行DOS下的exe文件,这是通过判断IMAGE_DOS_HEADER结构体中的 e_lfanew 域实现的。e_lfanew 域指出了PE文件真正的头在文件中的偏移量,对于纯DOS MZ可执行文件,该域永远为0,Windows可以调用DOS子系统来执行该程序。

2、原来的COFF文件头被扩展为了PE的文件头,其中既包括了COFF文件头 IMAGE_FILE_HEADER 结构体,同时增加了一个 IMAGE_OPTINAL_HEADER 扩展头结构——PE扩展头虽然名为OPTINAL,但是实际上对于PE和DLL文件来说是必不可少的,其定义在WinNt.h中,区分为32/64位两种。该结构体中最重要的是 IMAGE_DATA_DIRECTORY  DataDirectory[ IMAGE_NUMBEROF_DIRECTORY_ENTRIES ],这个结构体数组被称为“PE数据目录”,定义了PE程序加载执行时所需要的众多数据结构("XX表",例如导入表、导出表、资源表、异常表、重定位表等),每个IMAGE_DATA_DIRECTORY结构体描述一个这样的“XX表”,其数据域如下:
VirtualAddress —— XX表所在的起始虚拟地址
Size; —— XX表的长度
上一篇:读《程序员的自我修养》(四)
下一篇:读《程序员的自我修养》(六)