0%

PE与ELF

关于PE和ELF(特指可执行文件)的结构分布,网上有很多资料介绍,这里就不再重复描述,仅记录一些自己认为重要的点,现在记录的内容不是最终的内容,会在不断加深对二者结构的认识过程中不断更新。

下面的表格是个人用来进行比较的点(简记):

PE ELF(特指可执行文件)
静态时文件结构 Dos头->DosStub->Nt头->节表头->文件对齐的节区;是一种顺序的结构 ELF头->Segment头(程序头表)->Segments(Sections)->节表头;Segment与Section重合,不是一种顺序的结构,程序头表与节表头均指向文件中心位置
加载时文件结构 Dos头->DosStub->Nt头->节表头->内存对齐的节区 Loadable Segments
导入表填充含义 .idata中的IAT字段填充;填充时机:加载时 .got.plt中的字段填充;填充时机:延迟加载
重定位 PE加载时,使用绝对地址的全局变量或者跳转都需要实现一个减去原基地址,加上新基地址的操作。需要重定位的数据保存在.reloc段中 本质上是got表填充。ELF加载时,首先填充got表的数据;延迟加载的机制填充got.plt的函数字段。需要重定位的数据保存在.relc.dyn和relc.plt中
获取导出函数地址 解析dll的PE文件,从导出表EAT中获取函数地址 利用so的dynsym与dynstr比较符号名称,从dynsym获取符号对应的函数相对偏移

二者的重定位含义完全不同的原因:ELF中的全局变量等数据,用的是相对偏移而不是绝对偏移。PE使用的是绝对偏移。