目标文件格式 (Object file)
- 可重定位目标文件 (Relocatable Object File)
- 这类文件包含了二进制程序码和数据,其形式可以再编一时与其他可重新店为目标文件合并起来,建立一个可执行的目标文件
- 可执行目标文件 (Executable Object File)
- 包含二进制程序码和数据,其形式可以直接复制到记忆体并执行
- 共享的目标文件 (Shared Object File)
- 一种特殊类型的可重定位目标文件,可在执行时期动态连结并载入到主记忆体,也可在载入到记忆体时期,才动态连结此档案
可执行目标文件格式
一个程序码Source code档案被Compile後,会依照指令和资料部份分开存到Obj File上不同的Section中。
Section 介绍
- .text, .bss, .data 是一般编译器之预设记忆体区段名称, linker script 会安排实际的记忆体位址给各个区段.
- .text 为唯读区段, 包含 Const string,及Arm 指令程序(程序码),安置於ROM
- .data 为可读写区段, 放置初值不为 0 的变数 (安置於 RAM中)
- RAM的内容会在断电、或是系统重置後消失,Reset的程序需从ROM取得data初值(Copy from ROM to RAM)
- .bss 为可读写区段, 放置初值为 0 的变数. Reset的程序.bss 区段会被清为 0
- stack 为堆叠区 一般是呼叫函数时的作业区 (返回位址暂存, 传递参数, 区域变数和返回值之储存区), heap 为堆积区 是呼叫 malloc() 时取得记忆区块的来源.
- symtal 一个符号表,它存放在程序中定义和引用函数和全域变数的讯息
- .rel.text 当Linker 把目标文件和其他文件组合时,需要修改那些 text 的位置(Relocation),可执行文件中并不需要重新为讯息,因此通常会省略
- rel.date 被程序块引用或定义的所有全域变数的 Relocation 讯息
- .debug 一个除错符号表 只有以 -g 选项调用编译器驱动程序时,才会有这个 section
- .strtab 字串表
- .dynamic 动态连结讯息
其他Section(还有很多未被列出)
可执行目标文件与可重定位目标文件的有甚麽差别 ?
- 多了 .init section 与 .fini section其中 .init 节中定义了一个 _init 函数,用於可执行目标文件执行初始化工作。.fini 包含程序终止要执行的指令
- 少了 .rel.text 和 .rel.data 节等重定位讯息
整个档有两个重要的段
唯读程序码段:(ELF header + .init .fini 节 + .text 节 + .rodata 节 )
可读写数据段:(.data 节 + .bss 节),由於在执行档时这两个段必须分配空间所以又可以叫做可装入段
参考资料
程序设计师的自我修养