程序员的自由修养(2)目标文件格式

文章目录

一、目标文件格式

1、目标文件的作用
2、COFF目标文件的核心结构

2.1、文件头(File Header)
2.2、节区(Sections)
2.3、符号表(Symbol Table)
2.4、重定位表(Relocation Table)

3、COFF文件的查看与分析
4、COFF的演进与对比
5、总结


前言:

目标文件(Object File)是编译过程中的关键中间产物,它承载了源代码转换后的机器指令、数据及链接所需的各种信息。本文将以Windows平台广泛采用的COFF格式为例,介绍目标文件的核心结构。

一、目标文件格式

1、目标文件的作用

目标文件(.obj.o)是编译器将源代码(如C/C++)编译后生成的二进制文件,但尚未链接为最终可执行程序。它的核心作用包括:

模块化编译:允许单独编译每个源文件,再通过链接器合并。
存储中间结果:包含机器码、数据、符号及调试信息。
支持静态库:静态库(如Windows的.lib)本质是目标文件的集合。

2、COFF目标文件的核心结构

COFF文件由多个逻辑部分组成,按顺序存储,主要包括以下内容:

2.1、文件头(File Header)

机器类型:标识目标平台(如x86、x64、ARM)。
节区数量:指明后续有多少个节区(Section)。
时间戳:文件创建时间。
符号表偏移:指向符号表的位置。
可选头大小:在目标文件中通常为0(PE可执行文件会扩展此部分)。

示例(16进制视图)

COFF Header:
  Machine:             x64
  Number of Sections:  3
  TimeStamp:           0x5F9A2C36
  SymbolTable Offset:  0x400
  NumberOfSymbols:     42

2.2、节区(Sections)

节区是目标文件的逻辑分段,每个节区存储不同类型的数据:

节区名 存储内容 属性
.text 编译后的机器指令(函数代码) 可执行、只读
.data 已初始化的全局/静态变量 可读写
.bss 未初始化的全局/静态变量(占位符) 不占用实际文件空间
.rdata 只读数据(如字符串常量) 只读
.debug 调试信息(可选) 仅供调试工具使用

2.3、符号表(Symbol Table)

函数和全局变量名:如mainglobal_var
节区局部符号:如静态变量。
外部引用:声明但未定义的符号(如调用的库函数)。

符号表示例

Symbol Name:  main
  Section:    .text (1)
  Type:       Function
  Value:      0x00001000

2.4、重定位表(Relocation Table)

标记需要链接器修正的地址(例如:函数调用、全局变量引用)。
在链接时,链接器会根据最终的内存布局修改这些地址。

重定位条目示例

Offset:  0x0000102A
  Type:  REL32
  Symbol: printf

3、COFF文件的查看与分析

在Windows平台,可使用Visual Studio的dumpbin工具查看COFF文件内容:

dumpbin /headers demo.obj      # 查看文件头
dumpbin /symbols demo.obj      # 查看符号表
dumpbin /disasm demo.obj       # 反汇编代码段

dumpbin 是 Visual Studio 自带的强大工具,可以详细分析 .obj 文件的结构。基本使用步骤,如下:

打开 VS 开发者命令提示符:在开始菜单搜索 “Developer Command Prompt for VS 2022” (或对应VS版本)
基本命令格式

dumpbin [选项] yourfile.obj

4、COFF的演进与对比

PE/COFF:Windows的可执行文件(.exe/.dll)在COFF基础上扩展,增加了运行所需的头部信息。
ELF:Linux的标准格式,比COFF更灵活,支持动态链接。
Mach-O:macOS/iOS的专用格式。

格式 平台 特点
COFF Windows旧版 简单,主要用于目标文件
PE/COFF Windows新版 支持DLL、ASLR等高级特性
ELF Linux/Unix 高度模块化,支持动态链接
Mach-O macOS/iOS 苹果生态专用

5、总结

目标文件是编译的中间产物,包含代码、数据、符号和重定位信息。
COFF是Windows目标文件的标准格式,结构清晰,分为文件头、节区、符号表和重定位表。
链接器的任务是合并多个目标文件,解析符号引用,生成可执行文件。
现代格式_PE/ELF/Mach-O均从COFF演进而来,适应不同操作系统的需求。

通过理解COFF目标文件的结构,可以更深入地掌握编译、链接的工作原理,为调试和性能优化奠定基础。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容