前言
elf 中很多东西都用类似于java中 hashtable
的结构来存储 ,例如储存各个节的信息有节头表 ,存储字符串,有字符串表等等.
概述
ELF header + 各种 section + section header table + String table + symbol table + 各种table
ELF 文件的总体结构
文件头
我们使用命令查看一下文件头
可以看到文件头定义了 ELF 魔术, 文件机器字节长度,版本, 程序头入口地址 ,段表位置(段表在哪个位置)及段的数量等等
文件头结构定义在 /usr/include/elf.h
文件中 ,
vim /usr/include/elf.h
它里面的变量的含义
其中最后一个字段时什么意思呢 ? elf 有各种节 ,所有节的名字放在一个段表字符串表
的节里 ,既然 段表字符串表
也是一个节 ,那么它在节头表的哪个位置呢??于是这个字段存储的就是它在节头表的位置
节头表Section header table(又叫段表)
除了ELF头这个重要信息以外,节头表也保存着重要的信息,节头表是干嘛用的呢?它保存了各种段的基本属性结构 ,描述了各种段的信息 ,包括段段名,长度,在ELF 文件的偏移量, 读写权限以及其他属性
下面值得是节头表中每一项都有的属性。
下面是一个例子
其中的Addr指的就是装入到内存中的虚拟地址,就是第一张图里的 sh_addr.
使用命令查看
重定位表
这个留在静态链接的时候介绍
字符串表
字符串表主要有两个 :
- 字符串表(.strtab 表 String table): 普通的字段,比如符号的名字
- 段表字符串表(.shstrtab 表 section header String header ): 节头表中要用的字符串, 例如节名
为了阐述这东西是如何给外界使用, 下面给出一个类比 ,
参考
- <<程序员的自我修改--链接,装载与库>> 书