链接与ELF文件格式的复习

本文详细解析了ELF文件结构及其链接过程,包括.text段、.data段、.bss段的作用,以及ELFHeader、段描述符、符号表结构等关键组成部分。阐述了链接的主要过程,如地址和空间分配、符号决议和重定位,并以ELF基本文件结构为例,深入浅出地解释了这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在这里复习一下链接的知识:

什么是链接(linking):把源代码形成的模块独立编译后组装成一个整体的的过程叫做链接。

链接主要过程包括:地址和空间分配(address and storage allocation),符号决议 - 决定使用同名符号中的哪一个(symbol resolution),重定位 -为开始不能决定地址的符号重定位到正确地址(relocation)

 

ELF基本文件结构:

  

.text段 - 存放程序代码(与程序数据分开,好处1、提高缓存命中;2、保证代码只读防止被以外修改;3、多个程序使用一段代码 - 动态链接库)

.data段 - 存放已初始化的全局数据(因为默认值为0,因此初始化为0的数据被认为是未初始化的)

.bss段  - 存放未初始化的全局数据和局部数据(在ELF文件中不占位置,只提供一个长度为符号表保存的符号占位,这样可以节省磁盘空间)

 

ELF Header结构:

typedef struct {

unsigned char e_ident[16];      ELF魔数,用于操作系统识别文件

ELF32_Half e_type;          ELF文件类型,有可重定位文件,可执行文件,共享文件

ELF32_Half e_machine;        ELF文件的CPU平台属性

ELF32_Word e_version;        ELF版本号,一般为常数1

ELF32_Addr e_entry;         入口地址,规定ELF程序的入口虚拟地址,可重定位文件一般没有入口地址,该值为0

ELF32_Off e_phoff;          --

ELF32_Off e_shoff;          段表在文件中的偏移               -- 用于程序装载(知道每个段的信息才能装

载程序)

ELF32_Word e_flags;         ELF标志位,用于标识一些ELF文件平台相关属性

ELF32_Half e_ehsize;          文件头大小

ELF32_Half e_phentsize;       --

ELF32_Half e_phnum;         --

ELF32_Half e_shentsize;       段表描述符的大小,一般等于sizeof(ELF32_Shdr)  -- 用于程序装载

ELF32_Half e_shnum;        段表描述符的数量                  -- 用于程序装载

ELF32_Half e_shstrndx;       段表字符串标所在的段在段表中的下标        -- 用于符号识别决议和重定位

} Elf32_Ehdr;

 

Elf32_Shdr段描述符结构

typedef struct

{

ELF32_Word sh_name;              段名,保存为string table段中偏移

ELF32_Word sh_type;               段类型,

ELF32_Word sh_flags;               段标志位,表示段 SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR

ELF32_Addr  sh_addr;               段虚拟地址,如果段可以被加载,这位加载后在进程空间中的虚拟地址

ELF32_Off     sh_offset;               段偏移,表示段在文件中的偏移,(用于加载程序)

ELF32_Word sh_size;                段的长度,(用于加载程序)

ELF32_Word sh_link;                 段链接信息,(用于指示链接信息)

ELF32_Word sh_info;                段链接信息,(用于指示链接信息)

ELF32_Word sh_addralign;            段地址对齐,要求段地址对齐

ELF32_Word sh_entsize;             项的长度,段中的项的固定长度

} Elf32_Shdr;

    

ELF符号表结构:

typedef struct {

Elf32_Word st_name;                 符号名,表示在string table中的偏移

Elf32_Addr st_value;                  符号相对应的值,这个值跟符号有关,可能是一个绝对值,也可能是一个地址,不同

的符号所对应的值的含义不同

Elf32_Word st_size;                   符号大小,对于保存数据的符号,该值为数据类型大小

unsigned char st_info;                 符号类型和绑定信息

unsigned char st_other;                 目前为0,不使用

Elf32_Half st_shndx;                  符号所在段

} Elf32_Sym;

 

这里的st_info包含符号类型和绑定信息

ELF中符号类型包括:

符号类型
宏定义名注释
STB_LOCAL0局部符号,对于外部模块不可见
STB_GLOBAL1全局符号,对于外部模块可见
STB_WEAK2弱引用符号,可被全局符号定义覆盖

ELF绑定信息包括:

 

绑定信息
宏定义名注释
STT_NOTYPE0未知符号
STT_OBJECT1对象(变量,数组)
STT_FUNC2函数
STT_SECTION3
STT_FILE4目标文件名

转载于:https://www.cnblogs.com/kirito/p/3561900.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值