动态链接库的ELF头分析

ELF(Executable and Linking Format)用于存储Linux程序。

ELF文件分三种类型: 1、目标文件(通常是.o); 2、可执行文件(我们的运行文件)   3、动态库(.so)

ELF头的各个字段:

typedef struct {
  unsigned char  e_ident[EI_NIDENT];  /* File identification. */
  Elf32_Half  e_type;    /* File type. */
  Elf32_Half  e_machine;  /* Machine architecture. */
  Elf32_Word  e_version;  /* ELF format version. */
  Elf32_Addr  e_entry;  /* Entry point. */
  Elf32_Off  e_phoff;  /* Program header file offset. */
  Elf32_Off  e_shoff;  /* Section header file offset. */
  Elf32_Word  e_flags;  /* Architecture-specific flags. */
  Elf32_Half  e_ehsize;  /* Size of ELF header in bytes. */
  Elf32_Half  e_phentsize;  /* Size of program header entry. */
  Elf32_Half  e_phnum;  /* Number of program header entries. */
  Elf32_Half  e_shentsize;  /* Size of section header entry. */
  Elf32_Half  e_shnum;  /* Number of section header entries. */
  Elf32_Half  e_shstrndx;  /* Section name strings section. */
} Elf32_Ehdr;

e_ident、e_type、e_machine、e_version、e_flags和e_ehsize字段比较固定;

e_entry 入口地址与文件类型有关(动态库就是0);

目前e_ehsize(ELF HEAD SIZE,32位系统上固定为52字节,也就是0x34;64位系统上是64字节) = 52字节;

e_shentsize = 40字节(固定的,也就是0x28);

e_phentsize = 32字节(0x20)。

e_shoff(未改动?)、e_shentsize(固定为0x28?)、e_shnum和e_shstrndx与链接视图有关;

e_phoff、e_phentsize和e_phnum与装载(执行)视图有关。

  (图片摘自看雪,下面reference list中的[1])

图中可以看出:Program header位于ELF header后面,Section Header位于ELF文件的尾部。那可以推出:

e_phoff (a.k.a Program header file offset) = sizeof(e_ehsize);  /* e_ehsize : Size of ELF header in bytes. */

整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) + 1;

暂到这里,后面有些看不下去了。。

-------------------------

e_shnum  =  (file_size  – e_shoff) / sizeof(Elf32_Shdr) ;  e_shstrndx = e_shnum -1; //Elf32_Shdr:节区头部表项的大小 = e_shentsize =0x28

 

 

 

参考:

[1]http://bbs.pediy.com/showthread.php?t=191649

[2]http://bbs.pediy.com/showthread.php?t=192874

[3]http://blog.csdn.net/hhhbbb/article/details/6855004

[4]http://baike.sogou.com/v12102619.htm

 

posted @ 2014-11-24 10:12  LarryLawrence  阅读(1822)  评论(0编辑  收藏  举报