鏈接-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

參考

  • <<程序員的自我修改--鏈接,裝載與庫>> 書
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章