• 动态链接库的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

  • 相关阅读:
    Redis实战(十)Redis常见问题及解决方案
    小团队构建大网站:中小研发团队架构实践
    Asp.net core 3.0
    图解TCP/IP
    TCP/IP协议
    Grid画边框
    WPF常用方法,事件驱动和控件遍历
    WPF中的画图
    WPF中的常用类汇总:
    WPF中的VisualTreeHelper
  • 原文地址:https://www.cnblogs.com/larrylawrence/p/4118063.html
Copyright © 2020-2023  润新知