3.6 编译过程(3):符号表

本文详细解释了编译过程中符号表的作用,包括存储地址值、类型、大小等信息,介绍了ELF和BIN文件的区别,以及符号表的数据结构,涵盖了从词法分析到链接阶段的符号表生成过程。
摘要由CSDN通过智能技术生成

编译过程(3):符号表

1. 符号表的内容

在编译过程中,符号表用来保存源程序中各种符号的信息
主要包括符号的地址值、类型、占用空间的大小

2. 符号表的作用

  1. 辅助语义检查:看源程序是否有语义错误
  2. 辅助代码生成:地址与空间分配、符号决议、重定位

3. ELF文件和BIN文件

3.1 BIN文件

即raw binary文件.
– 只包含机器码,纯粹的程序文件,即镜像文件
– 类似的还有HEX文件
BIN文件运行,只需要将其加载到链接地址即可

3.2 ELF文件

除机器码外,还有一些额外信息
– 段的加载地址、运行地址
– 符号表、重定位表等
ELF文件运行,需要OS环境和加载器(loader、ld-linux.so)

4. 符号表数据结构

/arch/arm/include/asm/elf.h

typedef struct elf32_sym{
	Elf32_Word st_name;  //符号名,字符串表中的索引
	Elf32_Addr st_value;  //符号对应的值
	Elf32_Word st_size;  //符号大小,如int类型数据符号=4
	unsigned char st_info; //符号类型和绑定信息
	unsigned char st_other;
	Elf32_Half st_shndx;  //符号所在的段
} Elf32_Sym;

4.1 符号名

其值是,字符串表中的一个索引。通过该索引可以找符号到对应的字符串

# 查看字符串表
readelf -x .strtab sub.o
# 查看字节表
readelf -S 
# 查看符号表
readelf -s

节名字
保存在 shstrtab
如.text、.data、.bss、.comment等

4.2 符号值

  1. 在可重定位目标文件中:
    相对地址
  2. 在可执行目标文件中:
    绝对地址(对linux来说就是虚拟地址)

4.3 符号类型

OBJECT:符号关联的是一个数据对象:变量、数组或指针
FUNC:符号关联到一个函数或者过程
SECTION:符号关联到一个节的名字
FILE:符号关联一个文件名
NOTYPE:符号的类型未指定,其用于未定义引用

4.4 绑定属性

LOCAL:局部符号,目标文件内可见。多文件重名不冲突
GLOBAL:全局符号,在目标文件内部可见,也可以被其它文件引用
WEAK:弱符号,整个程序可见,多文件可重复定义。即使弱符号未定义,链接也不报错,将符号值设置为0

4.5 节索引

使用节索引来表明符号表中每个符号所在的section,将符号绑
定在该section

ABS:指定符号的绝对值,不需要重定位的符号
UNDEF:未定义符号,本模块引用,但在其它地方定义
COMMON:标识还未分配位置的未初始化的数据

5 符号表的生成

5.1 编译阶段

词法分析:遇到一个新声明的变量名、函数名,添加到符号表
语法分析:填充符号表的相关信息
语义分析:依据符号表作语义正确性检查

5.2 汇编阶段

汇编器会扫描汇编源文件生成各种表

5.3 链接阶段

将各个目标文件合并后,重新修改符号表中各符号的地址

6. 小结

6.1 目标文件构成

纯代码段:.text .data .rodata
文件描述信息段:.symtab .strtab .rel.text .rel.data ELF header
program header table section header table

6.2 目的

为后续的链接、运行过程提供必要的信息
链接器根据重定位表、符号表进行链接、重定位后续操作,生
成可以运行的可执行文件
加载器根据文件头、程序头信息,将程序加载到指定内存运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值