程序编译过程_第1页
程序编译过程_第2页
程序编译过程_第3页
程序编译过程_第4页
程序编译过程_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 1 程序编译过程 程序编译过程 程序编译 程序的编译过程如下图 所示 分为预处理 编译 汇编 链接 等几个阶段 预处理 预处理相当于根 据预处理命令组装成新的 C 程序 不过 常以 i 为扩展名 编译 将得 到的 i 文件翻译成汇编代码 s 文件 汇编 将汇编文件翻译成机器指令 并打包成可重定位目标程序的 O 文件 该文件是二进制文件 字节编码是机器 指令 链接 将引用的其他 O 文件并入到我们程序所在的 o 文件中 处理得到最终的可执行文件 编译程序 把用高级程序设计语言书写的源程序 翻译成等价的计算机汇编语言或机器语 言书写的目标程序的翻译程序 汇编程序汇编代码 汇编语言编写的程 序 机器不能直接识别 要一种程序将 汇编语言翻译成机器语言 这种起翻译 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 2 作用的程序叫汇编程序 汇编程序是系 统软件中语言处理系统软件 目标程序 又称 目的程序 编译程序将源 程序编译成与之等价的机器码构成的 计算机能直接运行的程序 该程序叫目 标程序 链接器 linker 将一个个的目 标文件 或许还会有若干程序库 链 接在一 起生成一个完整的可执行文 件 在符号解析 symbol resolution 阶 段 链接器按照所有目标文件和库文件 出现在命令行中的顺序从左至右依次扫 描它们 在此期间它要维护若干个集合 1 集合 E 是将被合并到一起组成可执 行文件的所有目标文件集合 2 集合 U 是未解析符号 unresolved symbols 比如已经被引用但是还未被 定义的符号 的集合 3 集合 D 是所有之前已被加入到 E 的目标文 件定义的符号集合 一开始 E U D 都是空的 链接器的工作 过程 1 对命令行中的每一个 输入文件 f 链接器确定它是目标文 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 3 件还是库文件 如果它是目标文件 就 把 f 加入到 E 并把 f 中未解析的符 号和已定义的符号分别加入到 U D 集合中 然后处理下一个输入文件 2 如果 f 是一个库文件 链接器会尝 试把 U 中的所有未解析符号与 f 中各 目标模块定义的符号进行匹配 如果某 个目标模块 m 定义了一个 U 中的未 解析符号 那么就把 m 加入到 E 中 并把 m 中未解析的符号和已定义的符 号分别加入到 U D 集合中 不断 地对 f 中的所有目标模块重复这个过 程直至到达一个不动点 fixed point 此时 U 和 D 不再变化 而那些 未加入到 E 中的 f 里的目标模块就被 简单地丢弃 链接器继续处理下一输入 文件 3 如果处理过程中往 D 加入 一个已存在的符号 或者当扫描完所 有输入文件时 U 非空 链接器报错并 停止动作 否则 它把 E 中的所有目 标文件合并在一起生成可执行文件 这 种 翻译 通常有两种方式 即编译方式 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 4 和解释方式 编译方式是指利用事先编 好的一个称为编译程序的机器语言程序 作为系统软件存放在计算机内 当用户将高级语言编写的源程序输入计 算机后 编译程序便把源程序整个地翻 译成用 机器语言表示的与之等价的目 标程序 然后计算机再执行该目标程序 以完成源程序要处理的运算并取得结果 解释方式是指源程序进入计算机后 解释程序边扫描边解释 逐句输入逐句 翻译 计算机一句句执行 并不产生目 标程序 可执行文件格式 Microsoft 引进了 PE 文件格式 更经常 被称为 PE 格式 作为最初的 Win32 规 范的一部分 然而 PE 文件源自 VAX VMS 上早期的通用目标文件格式 Microsoft 编译器生成的 OBJ 文件 也使用 COFF 格式 PE 文件一 个非常好的地方就是它的数据结构在磁 盘上与在内存 逻辑地址空间 中一样 加载一个可执行文件到内存主要就是把 PE 文件中的某个部分映射到地址空间 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 5 中 如果你知道如何在一个 PE 文件中 找到某些内容 你几乎可以确定当文件 被加载进内存时可以找到同样的信息 注意到 PE 文件并不是作为单一的内存 映射文件被映射进内存的这一点非常重 要 相反 Windows 加载器查看 PE 文 件并确定文件中的哪些部分需要被映射 当映射进内存时 文件中的高偏移相对 于内存中的高地址 某项内容在磁盘文 件中的偏移可能与它被加载进内存之后 的偏移不同 但是将磁盘文件中的偏移 转换成内存偏移需要的所有信息都存在 当 PE 文件 Windows 加载器加载 进内存时 它在内存中被称为模块 文 件被映射到的内存的起始地址被称为 HMODULE 这是需要记住的一点 给 你一个 HMODULE 你就知道在那个地 址处到底有什么样的数据结构 并且你 可以根据 PE 文件的知识找到内存中所 有其它的数据结构 这个强大的功能可 以被用作其它用途 例如拦截 API 内存中的模块代表一个进程所需的可执 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 6 行文件中的所有代码 数据和资源 PE 文件中的其它部分可能会被读取 但并 不被映射进内存 一些部分可能根本就 不被映射 例如放在文件末尾的调试信 息 PE 文件头中的一个 域告诉系 统将这个可执行文件映射进内存时需要 占用多少内存 不被映射的数据放在文 件末尾 位于所有需要被映射的部分之 后 描述 PE 文件的关键位置是文 件 在这个头文件中 你能找到几乎所 有结构的定义 枚举类型以及使用 PE 文件或它在内存中的等价结构所需的定 义 有许多工具可以用来查看 PE 文件 Visual Studio 附带的 Dumpbin 和 Platform SDK 附带的 Depends 就是其中 的两个 PE 文件的节 PE 文件的节代表代码或某些类型的数据 虽然代码只能是代码 但数据却有许多 种不同类型 除了可读 可写的程序数据 外 节中其它类型的数据包括函数导入 表和导出表 资源以及重定位信息等 每个节都有它自己的一组内存属性 其 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 7 中包括节中是否包含代码 是只读的还 是可读 可写的以及节中的数据是否在所 有使用这个可执行文件的进程中是共享 的等等 一般说来 一个节中的 所有代码和数据在逻辑上是相关的 通 常一个 PE 文件中至少有两个节 一个 是代码节 另一个是数据节 一般在 PE 文件中至少还有一种其它类型的数 据节 第二部分中具体描述各种节 每个节都有一个惟一的名字 它通常用 来表示节的用途 例 如一个名为 rdata 的节 表明它是一个只读数据节 使用节名只 是为了方便人们处理文件 它对操作系 统来说无关紧要 一个名为 FOOBAR 的节可能实际上是一个代码节 就像 text 节一样 Microsoft 通常在它们的节 名前加一个圆点 但这并不是必须的 多少年来 Borland 链接器使用的节名 都是 CODE 和 DATA 节并不是 完全链接器生成的 在 OBJ 文件中就有 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 8 它们的身影 这通常是编译器放在那里 的 链接器的工作就是把 OBJ 文件和库 文件中所有需要的节组合成 PE 文件中 最终相应的节 例如你的工程中的每个 OBJ 文件可能都至少有一个包含代码的 text 节 链接器把各种 OBJ 文件中的所 有 text 节组合成单个的 text 节放入 PE 文件 同样 各种 OBJ 文件中的所有 data 节也被组合成 PE 文件中单个的 data 节 节有两种对齐值 一种是在 文件中的对齐值 另一种是在内存中的 对齐值 PE 文件头中指定了这两种值 它们可以不同 每个节的起始地址都是 对齐值的倍数 例如在 PE 文件中 典 型的对齐值是 0 x200 因此每个节的起 始起始地址都是 0 x200 的倍数 一旦映射进内存 节总是从页的边界开 始 也就是说 当 PE 文件被映射进内 存时 每个节的开头都对应于一个内存 页的开始 在 x86 CPU 上 页按 4KB 对齐 在 IA 64 上 页按 8KB 对齐 以 下是 PEDUMP 输出的 Windows XP 中 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 9 的 的 text 节和 data 节的情况 Section Table 01 text VirtSize VirtAddr raw data offs raw data size 02 data VirtSize CA VirtAddr raw data offs 00074C00 raw data size 上面的输 出表明 text 节的文件偏移是 0 x400 在内存中它比 KERNEL32 的加载地址 高 0 x1000 字节 同样 data 节的文件 偏移是 0 x74C00 它在内存中比 KERNEL32 的加载地址高 0 x76000 字节 可以创建一个 PE 文件 使它 的节在文件中的偏移与在内存中的偏移 相同 但这会使可执行文件相当大 不 过可以提高它在 Windows 9x 或 Windows Me 中的加载速度 使用默认 的 OPT WIN98 链接器选项就可以创建 这样的 PE 文件 在 Visual Studio NET 中 链接器可能使用也可能不使用这个 选项 这取决于文件是不是足够小 链接器一个比较有趣的功能就是合并节 如果两个节属性相似 相互兼容时 它 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 10 们通常会在链接时被合并成一个节 这 是通过链接器的 MERGE 选项来完成的 例如以下的链接器 选项会把 rdata 节和 text 节组合成单个的 text 节 MERGE rdata text 把节合并起来 的好处是可以节省在磁盘上和在内存中 的空间 每个节至少要在内存中占用一 个页面 如果你能将一个可执行文件中 节的数目从四个减少到三个 你很可能 就会少占用一页内存 当然 这取决于 那两个被合并的节中未使用的空间加起 来够不够一页 当你合并节时就 会发生一些有趣的情况 因为这并没有 硬性的和快速的规则可以遵守 例如 把 rdata 节合并到 text 节当然可以 但 是你不能把 rsrc 节 reloc 节或者 pdata 节合并到其它节中 在 Visual Studio NET 之前 你可以把 idata 节合并到其 它节中 但是在 Visual Studio NET 中 这是不允许的 但在创建程序的发行版 本时 链接器自己却经常把部分的 idata 节合并到其它节中 例如 rdata 节 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 11 于导入表要被 Windows 加载器改写 你可能想知道它们怎么能被放在只读节 中 这是因为在加载时系统临时将包含 导入表的那些页面的属性设置为可读 可 写 一旦导入表被初始化 这些页面就 会被设置成原来的属性 相对虚 拟地址 在可执行文件中 许多地 方都需要被指定一个在内存中的地址 例如在使用全局变量时需要它的地址 PE 文件可以被加 载到进程地址空 间中的任何地方 虽然它有一个首选地 址 但你却不能依赖可执行文件一定会 被加载到那个地址 因此就需要按一定 方式指定地址 使它们并不依赖于可执 行文件的加载地址 为了避免在 PE 文件中硬编码内存地址 因此就使 用了 RVA RVA 只是一个相对于 PE 文件在内存中的加载位置的偏移 例如 假定一个 EXE 文件被加载在 0 x 处 而 它的代码节在 0 x 处 那么这个代码节 的 RVA 就是 0 x 0 x 0 x1000 要把一个 RVA 转换成实际地址 只需 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 12 要简单地逆着上述过程进行 将 RVA 与实际加载地址相加就能得到实际的内 存地址 顺便说一下 按照 PE 格式中 的说法 实际的内存地址被称为虚拟地 址 另外一种考虑 VA 的方式就是把它 当成 RVA 加上首选加载地址 不要忘 了我前面说过加载地址与 HMODULE 是一回事 想在内存中探索一些 DLL 内部的数据结构吗 这里就是方法 用 DLL 的名称作为参数调用 GetModuleHandle 函数 它返回的 HMODULE 就是这个 DLL 的加载地址 你可以利用你学的关于 PE 文件结构的 知识在这个模块中找到你想找到的一切 数据目录 在可执行文件中有许多 数据结构需要被快速地定位 导入表 导出表 资源以及基址重定位信息等就 是一些明显的例子 所有这些广为人知 的结构都是以同样的方式被定位的 这 些位置被称为数据目录 struct IMAGE DATA DIRECTORY DWORD VirtualAddress 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 13 DWORD Size IMAGE DATA DIRECTORY PIMAGE DATA DIRECTORY define IMAGE NUMBEROF DIRECTORY E NTRIES 16 数据目录是一个有 16 个元素的结构数组 每个数组元素所 指代的内容已经被预先定义好了 文件 中的这些 IMAGE DIRECTORY ENTRY xxx 定 义就是数据目录的索引 下表描述了每 个 IMAGE DIRECTORY ENTRY xxx 值所指代的内容 它们指向的许多数据 结构将在的第二部分中详细描述 值 描述 IMAGE DIRECTORY ENTRY EXPOR T 指向导出表 IMAGE DIRECTORY ENTRY IMPOR T 指向导入表 IMAGE DIRECTORY ENTRY RESOU 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 14 RCE 指向资源 IMAGE DIRECTORY ENTRY EXCEP TION 指向异常处理程序表 它特定于 CPU 用于基于表的异常处 理 适用于除 x86 之外所有类型的 CPU IMAGE DIRECTORY ENTRY SECUR ITY 指向 WIN CERTIFICATE 结 构列表 此结构定义在 文件中 它 并不作为映像的一部分被映射进内存 因此 VirtualAddress 域是文件偏移 而 不是 RVA IMAGE DIRECTORY ENTRY BASER ELOC 指向基址重定位信息 IMAGE DIRECTORY ENTRY DEBUG 指向 IMAGE DEBUG DIRECTORY 结 构数组 其中的每个元素描述了映像中 的一些调试信息 要获得 IMAGE DEBUG DIRECTORY 结构的 数目 用 Size 域除以 IMAGE DEBUG DIRECTORY 结构的 大小 早期的 Borland 链接器将这个 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 15 IMAGE DATA DIRECTORY 项的 Size 域设置成 IMAGE DEBUG DIRECTORY 结构的 数目 而不是数组的大小 IMAGE DIRECTORY ENTRY ARCHI TECTURE 指向与平台相关的 数据 这个数据是一个 IMAGE ARCHITECTURE HEADER 结 构数组 x86 平台和 IA 64 平台并不使 用 但好像已经用于 DEC Compaq Alpha 平台 IMAGE DIRECTORY ENTRY GLOBA LPTR 在某些平台上 其 VirtualAddress 域保存的是全局指针的 RVA x86 平台上不使用 但 IA 64 平 台上使用 Size 域并未使用 要获取更 多关于 IA 64 GP 方面的信息 可以参 考 2000 年 11 月的 Under The Hood 专栏 IMAGE DIRECTORY ENTRY TLS 指向线程局部存储初始化节 IMAGE DIRECTORY ENTRY LOAD 精选公文范文 管理类 工作总结类 工作计划类文档 欢迎阅读下载 精选公文范文 管理类 工作总结类 工作计划类文档 感谢阅读下载 16 CONFIG 指向 IMAGE LOAD CONFIG DIRECTORY 结构 此结构中的信息特定于 Windows NT Windows 2000 和 Windows XP 如 果你的可执行文件要使用这个结构 需 要定义一个名称为 load config used 类型为 IMAGE LOAD CONFIG DIRECTORY 的全局结构体 对于非 x86 平台 这个 名称需要被定义成 load config used 如果你想使用 IMAGE LOAD CONFIG DIRECTORY 结构 必须使用这个技巧才能在你的 C 代码中得到正确的名字 链接器看 到的符号名一定要是 load config used C 编译器要在全 局符号前加一个下划线 另外 它还使 用类型信息来修饰全局符号 因此要使 一切正

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论