链接-ELF文件结构

前言

elf 中很多东西都用类似于java中 hashtable的结构来存储 ,例如储存各个节的信息有节头表 ,存储字符串,有字符串表等等.

概述

ELF header + 各种 section + section header table + String table + symbol table + 各种table

ELF 文件的总体结构
img

文件头

我们使用命令查看一下文件头
img

可以看到文件头定义了 ELF 魔术, 文件机器字节长度,版本, 程序头入口地址 ,段表位置(段表在哪个位置)及段的数量等等

文件头结构定义在 /usr/include/elf.h 文件中 ,

vim /usr/include/elf.h

img

它里面的变量的含义
img

img

其中最后一个字段时什么意思呢 ? elf 有各种节 ,所有节的名字放在一个段表字符串表的节里 ,既然 段表字符串表 也是一个节 ,那么它在节头表的哪个位置呢??于是这个字段存储的就是它在节头表的位置

节头表Section header table(又叫段表)

除了ELF头这个重要信息以外,节头表也保存着重要的信息,节头表是干嘛用的呢?它保存了各种段的基本属性结构 ,描述了各种段的信息 ,包括段段名,长度,在ELF 文件的偏移量, 读写权限以及其他属性

下面值得是节头表中每一项都有的属性。

1297993-20191128141253576-1060458734.png

下面是一个例子

1297993-20191128142027331-1549662621.png

其中的Addr指的就是装入到内存中的虚拟地址,就是第一张图里的 sh_addr.

1297993-20191128142229712-909611373.png

使用命令查看
img

重定位表

这个留在静态链接的时候介绍

字符串表

字符串表主要有两个 :

  • 字符串表(.strtab 表 String table): 普通的字段,比如符号的名字
  • 段表字符串表(.shstrtab 表 section header String header ): 节头表中要用的字符串, 例如节名

为了阐述这东西是如何给外界使用, 下面给出一个类比 ,

img

参考

  • <<程序员的自我修改--链接,装载与库>> 书
posted @ 2022-12-17 12:46  float123  阅读(54)  评论(0编辑  收藏  举报