链接过程概述&ELF目标文件格式
目录
一、链接过程概述
1.合并相同的节
2.可执行文件存储器映像(磁盘中&虚存中)
二、目标文件格式
1.三类目标文件
①可重定位目标文件(.o)
- 其代码和数据可和其他可重定位文件合并为可执行文件
- 每个.o文件由对应的.c文件生成
- 每个.o文件代码和数据地址都从0开始
②可执行目标文件(Linux默认为a.out , Windows中的*.exe)
- 包含的代码和数据可以被直接复制到内存并被执行
- 代码和数据地址为虚拟地址空间中的地址
③共享的目标文件(Linux中的*.so)
- 特殊的可重定位目标文件,能在装入或运行时被装入到内存并自动被链接,称为共享库文件
2.目标文件格式
①目标代码( Object Code )指编译器和汇编器处理源代码后所生成的机器语言目标代码
②目标文件( Object File )指包含具标代码的文件,最早的目标文件格式是自有格式,非标准的
③标准的几种目标文件格式
- DOS操作系统(最简单) : COM格式(*.com) ,文件中仅包含代码和数据,且被加载到内存的固定位置(不采用虚拟地址)
- System V UNIX早期版本: COFF格式,文件中不仅包含代码和数据,还包含重定位信息、调试信息、符号表等其他信息,由一组严格定义的数据结构序列组成
- Windows: PE格式( COFF的变种) , 称为可移植可执行(Portable Executable,简称PE)
- Linux等类UNIX : ELF格式( COFF的变种) ,称为可执行可链接(Executable and Linkable Format ,简称ELF )
3.ELF文件格式
(1)tips:
①节(section)
是ELF文件中具有相同特征的最小可处理单位
.text节:代码
.data节:数据
.rodata:只读数据
.bss:未初始化数据
②段(segment )
程序头表描述节如何映射到存储段中,可多个节映射到同一段,如:
可合并.data节和.bss节,并映射到一个可读可写数据段中
③ELF头(52B)
- ELF魔数
- 版本
- 小端/大端
- 操作系统平台
- 目标文件的类型
- 机器结构类型
- 程序执行的入口地址
- 程序头表(段头表)的起始位置和长度
- 节头表的起始位置和长度等
④魔数:
文件开头几个字节通常用来确定文件的类型或格式
a.out的魔数: 01H 07H
PE格式魔数: 4DH 5AH
加载或读取文件时,可用魔数确认文件类型是否正确
⑤.bss节
●C语言规定:
未初始化的全局变量和局部静态变量的默认初始值为0
●将未初始化变量(.bss节)与已初始化变量(.data节)分开的好处
.data节中存放具体的初始值,需要占磁盘空间
.bss节中无需存放初始值,只要说明.bss中的每个变量将来在执行时占用几个字节即可,因此, .bss节实际上不占用磁盘空间,提高了磁盘空间利用率
●所有未初始化的全局变量和局部静态变量都被汇总到.bss节中,通过专门的“节头表( Section header table )”来说明应为.bss节预留多大的空间
●BSS ( Block Started by Symbol )最初是UA-SAP汇编程序中所用的一个伪指令,用于为符号预留一块内存空间
(2)两种视图:
①链接视图(可重定位): ②可执行视图:
4.链接视图
- 可被链接(合并)生成可执行文件或共享目标文件
- 静态链接库文件由若干个可重定位目标文件组成
- 包含代码、数据(已初始化的全局变量和局部静态变量.data和未初始化的全局变量和局部静态变量.bss )
- 包含重定位信息(指出哪些符号引用处需要定位)
- 文件扩展名为.o (相当于Windows中的.obj文件)
(1)可重定位目标文件ELF格式
(2)可重定位目标文件ELF文件头
(3)可重定位目标文件节头表
- 除ELF头之外,节头表是ELF可重定位目标文件中最重要的部分内容
- 描述每个节的节名、在文件中的偏移、大小、访问属性、对齐方式等
5.执行视图
- 包含代码、数据(已初始化.data和未初始化.bss )
- 定义的所有变量和函数已有确定地址(虚拟地址空间中的地址)
- 符号引用处已被重定位,以指向所引用的定义符号
- 没有文件扩展名或默认为a.out (相当于Windows中的.exe文件)
- 可被CPU直接执行,指令地址和指令给出的操作数地址都是虚拟地址
(1)ELF文件格式
与可重定位文件不同:
- ELF头里面有字段e_entry给出执行程序时第一条指令的地址(可重定位文件:0x0)
- 多了一个init节,定义了_init函数,可执行文件执行时的初始化。
- 程序头表:结构数组,每个元素是一个表项目。可执行文件要映射到存储器,一个段是一个连续的空间,程序头表里面描述了节和段的对应关系,还描述了段的信息。
- 少了两个.rel节(无需重定位)
(2)可执行文件的程序头表
6.example:
符号表
节头表
程序头表