前言
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 ): 節頭表中要用的字符串, 例如節名
爲了闡述這東西是如何給外界使用, 下面給出一個類比 ,
參考
- <<程序員的自我修改--鏈接,裝載與庫>> 書