链接过程概述&ELF目标文件格式

目录

 

一、链接过程概述

二、目标文件格式 

1.三类目标文件

2.目标文件格式

3.ELF文件格式

4.链接视图

5.执行视图

6.example:

三、可执行文件的存储器映像


一、链接过程概述

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:

符号表

节头表

程序头表



三、可执行文件的存储器映像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hnu哈哈

请接受直女的么么哒????

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值