ELF文件格式介绍

一 文件组成

     ELF文件由4部分组成,分别是ELF头,程序头表(ELF header) ,程序头表(Programme header table) ,节(Sections) ,和节头表(Sections) 。实际上一个文件中并不一定含有上述全部的内容,实际上只有ELF头文件的位置是固定的,其余各个部分的位置,大小等信息由ELF的各项值来决定。

 

   2文件头

   文件头共 52字节,描述了字的大小,生成该文件的系统的字节顺序,ELF头的大小,目标文件类型、机器类型等。
ELF Header结构体定义:
   #define EI_NIDENT        16
   typedef struct {
       unsigned char        e_ident[EI_NIDENT];         

                  最开头是16字节的e_ident,其中用以表示ELF文件的字符,以及其他一些与机器无关的信息。

                  开头的4字节是固定不变的,第一个字节值是0x7F,紧接着就是ELF三个字符,这四个字节表明这个文件是ELF文件。 
       Elf32_Half           e_type;

                  表示文件的类型, 值为2 表示为一个可执行文件。

           
       Elf32_Half           e_machine;
      

                 表示程序运行机器的体系结构

 

       Elf32_Word           e_version;

 

                   用以确定文件的版本


       Elf32_Addr           e_entry;

 

                 程序的入口地址


       Elf32_Off            e_phoff;

 

                  Programme header table 在文件中的偏移量(以字节计数),


       Elf32_Off            e_shoff;

 

                 Section Header table 在文件中的偏移量,(以字节计数)


       Elf32_Word           e_flags;

 

                 对IA32来说,此项为0

              
       Elf32_Half           e_ehsize;

 

               ELF header 的大小(以字节计数)

 

                 
       Elf32_Half           e_phentsize;

                     Programme header table 中的每一个条目(一个programme header)的大小,这里值为5 ,

              
       Elf32_Half           e_phnum;

                   Programme header table   有多少个条目                       


       Elf32_Half           e_shentsize;

                   Section header table 中的每一个条目的大小

               
       Elf32_Half           e_shnum;

 

                   Section header table 有多少个条目。
       Elf32_Half           e_shstrndx;

                   包含节名称的字符串表是第几个字节(从0开始数)。  

                 
   }  Elf32_Ehdr;

 

 

数据类型如下:

 

    名称                   大小               对齐                 用途

 Elf32_Addr           4                     4               无符号程序地址

 Elf32_Half             2                    2                无符号中等大小整数         

 Elf32_Off              4                     4                 无符号文件偏移 

 Elf32_Sword         4                     4                 有符号大整数

 Elf32_Word           4                     4                无符号大整数

 unsigned char        1                     1                 无符号小整数

 

3 Programme Header

      实际上Programmer header 描述的是系统准备程序运行所需的一个段(Segment),或其他的信息。

 

 

       结构体定义:

            

  typedef struct {
            

             Elf32_Word  p_type          当前Programmer header 所描述的段的类型。 

             Elf32_Off      p_offset        段的第一个字节在文件中的偏移。

             Elf32_Addr   p_vaddr        段的第一个字节在内存中的虚拟地址。

             Elf32_Addr   p_paddr        在物理地址定位相关的系统中,此项为物理地址保留。

             Elf32_Word  p_filesz         段在文件中的长度。

             Elf32_Word  p_memsz      段在内存中的长度。

             Elf32_Word  p_flags         与段相关的标志

             Elf32_Word p_align           根据此项值来确定段在文件中以及内存中如何对齐                   

 

综述 ,该字段描述的是一个段在文件中的位置、大小以及它被放进内存后所在的位置和大小,如果我们想把一个文件加载进内存的话,需要的就是这些数据。

 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值