plt hook
ELF 文件结构
ELF文件由4部分组成,分别是
- ELF头(ELF header)、
- 程序头表(Program header table)、
- 节(Section)
- 节头表(Section header table)
汇编器的链接视角与程序的执行视角
链接视图角度看和执行视角看 ELF 文件
执行视图
链接视图-可重定位目标文件:包含代码、数据、定位信息(指出哪些符号引用处需要重定位)等。可被链接合并,生成可执行文件或共享目标文件(.so文件)或静态链接库文件(.a文件)。
执行视图-可执行目标文件
翻译后
ELF文件各个部分解释:
-
ELF头:描述整个文件的组织,说明文件类型、大小、各个节区表的偏移地址
-
程序头表(PHT):描述与程序执行直接相关的目标文件结构信息。用来在文件中定位各个段的映像。同时包含其他一些用来为程序创建映像所必须的信息
-
节/段(SHT):sections主要给Linker用,从链接的角度来描述elf文件。segments主要给Loader用,从加载的角度来描述elf文件。
-
Linker需要关心.text, .rel.text, .data, .rodata等等,关键是Linker需要做 relocation。
-
而Loader只需要知道Read/Write/Execute的属性,加载ELF文件时候,把多个sections组成segments来加载,所以一个segment包含若干个section。
-
节区头表:描述 文件节区的信息,大小、偏移等
3. 重定位
系统是如何加载的 ELF 文件的?
- 读 ELF 的程序头部表,把所有 PT_LOAD 的节区 mmap 到内存中。
- 从“.dynamic”中读取各信息项,计算并保存所有节区的虚拟地址,然后执行重定位操作。
- 最后 ELF 加载成功,引用计数加一。
.dynamic 来修复 section
未完待续