Chinaunix首页 | 论坛 | 博客
  • 博客访问: 387447
  • 博文数量: 75
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-03 18:24
文章分类

全部博文(75)

文章存档

2019年(1)

2018年(20)

2017年(14)

2016年(10)

2015年(30)

分类: LINUX

2018-07-03 22:36:49


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <elf.h>

  3. /**/
  4. int parse_elf_header(Elf32_Ehdr *pElf_header)
  5. {
  6.     /*文件标志*/
  7.     if((pElf_header->e_ident[EI_MAG0] != 0x7f) || (pElf_header->e_ident[EI_MAG1] != 'E') || (pElf_header->e_ident[EI_MAG2] != 'L') || (pElf_header->e_ident[EI_MAG3] != 'F'))
  8.     {
  9.         printf("This not elf file\n");
  10.         return -1;
  11.     }

  12.     /*File class byte*/
  13.     if(pElf_header->e_ident[EI_CLASS] == ELFCLASSNONE)
  14.     {
  15.         printf("File class:Invalid class\n");
  16.     }
  17.     else if(pElf_header->e_ident[EI_CLASS] == ELFCLASS32)
  18.     {
  19.         printf("File class:32-bit objects\n");
  20.     }
  21.     else if(pElf_header->e_ident[EI_CLASS] == ELFCLASS64)
  22.     {
  23.         printf("File class:64-bit objects\n");
  24.     }

  25.     /*Data encoding byte*/
  26.     if(pElf_header->e_ident[EI_DATA] == ELFDATANONE)
  27.     {
  28.         printf("Data encoding:Invalid data encoding\n");
  29.     }
  30.     else if(pElf_header->e_ident[EI_DATA] == ELFDATA2LSB)
  31.     {
  32.         printf("Data encoding:little endian\n");
  33.     }
  34.     else if(pElf_header->e_ident[EI_DATA] == ELFDATA2MSB)
  35.     {
  36.         printf("Data encoding:big endian\n");
  37.     }

  38.     /**/
  39.     printf("version:%d\n", pElf_header->e_ident[EI_VERSION]);

  40.     /*OS ABI identification*/
  41.     printf("OS ABI identification:%d\n", pElf_header->e_ident[EI_OSABI]);

  42.     /*ABI version*/
  43.     printf("ABI version:%d\n", pElf_header->e_ident[EI_ABIVERSION]);

  44.     /*Legal values for e_type (object file type)*/
  45.     if(pElf_header->e_type == ET_REL)
  46.     {
  47.         printf("object file type:Relocatable file\n");
  48.     }
  49.     else if(pElf_header->e_type == ET_EXEC)
  50.     {
  51.         printf("object file type:Executable file\n");
  52.     }
  53.     else if(pElf_header->e_type == ET_DYN)
  54.     {
  55.         printf("object file type:Shared object file\n");
  56.     }
  57.     else if(pElf_header->e_type == ET_CORE)
  58.     {
  59.         printf("object file type:Core file\n");
  60.     }

  61.     /* Legal values for e_machine (architecture). */
  62.     if(pElf_header->e_machine == EM_M32)
  63.     {
  64.         printf("machine:AT&T WE 32100\n");
  65.     }
  66.     else if(pElf_header->e_machine == EM_SPARC)
  67.     {
  68.         printf("machine:SUN SPARC\n");
  69.     }
  70.     else if(pElf_header->e_machine == EM_386)
  71.     {
  72.         printf("machine:Intel 80386\n");
  73.     }
  74.     else if(pElf_header->e_machine == EM_68K)
  75.     {
  76.         printf("machine:Motorola m68k family\n");
  77.     }
  78.     else if(pElf_header->e_machine == EM_88K)
  79.     {
  80.         printf("machine:Motorola m88k family\n");
  81.     }
  82.     else if(pElf_header->e_machine == EM_860)
  83.     {
  84.         printf("machine:Intel 80860\n");
  85.     }
  86.     else if(pElf_header->e_machine == EM_MIPS)
  87.     {
  88.         printf("machine:MIPS R3000 big-endian\n");
  89.     }
  90.     else if(pElf_header->e_machine == EM_S370)
  91.     {
  92.         printf("machine:IBM System/370\n");
  93.     }
  94.     else if(pElf_header->e_machine == EM_MIPS_RS3_LE)
  95.     {
  96.         printf("machine:MIPS R3000 little-endian\n");
  97.     }

  98.     /*e_version*/
  99.     printf("version:%d\n", pElf_header->e_version);

  100.     /*e_entry*/
  101.     printf("Entry point virtual address:0x%08x\n", pElf_header->e_entry);

  102.     /*e_phoff*/
  103.     printf("Program header table file offset:0x%08x\n", pElf_header->e_phoff);

  104.     /*e_shoff*/
  105.     printf("Section header table file offset:0x%08x\n", pElf_header->e_shoff);

  106.     /*e_flags*/
  107.     printf("Processor-specific flags:%d\n", pElf_header->e_flags);
  108.     /*e_ehsize*/
  109.     printf("ELF header size in bytes:%d\n", pElf_header->e_ehsize);
  110.     /*e_phentsize*/
  111.     printf("Program header table entry size:%d\n", pElf_header->e_phentsize);
  112.     /*e_phnum*/
  113.     printf("Program header table entry count:%d\n", pElf_header->e_phnum);
  114.     /*e_shentsize*/
  115.     printf("Section header table entry size :%d\n", pElf_header->e_shentsize);
  116.     /*e_shnum*/
  117.     printf("Section header table entry count:%d\n", pElf_header->e_shnum);
  118.     /*e_shstrndx*/
  119.     printf("Section header string table index:%d\n", pElf_header->e_shstrndx);

  120.     return 0;
  121. }

  122. /**/
  123. int main(int argc, char **argv)
  124. {
  125.     int ret_val = -1;
  126.     FILE *fp = NULL;
  127.     Elf32_Ehdr elf_header;
  128.     
  129.     
  130.     if(argc != 2)
  131.     {
  132.         printf("usage:%s elf_file\n", argv[0]);
  133.         return -1;
  134.     }

  135.     /**/
  136.     fp = fopen(argv[1], "r");
  137.     if(fp == NULL)
  138.     {
  139.         printf("fopen Failed\n");
  140.         goto _OVER_;
  141.     }

  142.     
  143.     /**/
  144.     ret_val = fread((void *)&elf_header, 1, sizeof(Elf32_Ehdr), fp);
  145.     if(ret_val != sizeof(Elf32_Ehdr))
  146.     {
  147.         printf("fread Failed(%d)\n", ret_val);
  148.         goto _OVER_;
  149.     }

  150.     /**/
  151.     parse_elf_header(&elf_header);

  152. _OVER_:
  153.     if(fp != NULL)
  154.     {
  155.         fclose(fp);
  156.     }
  157.     return ret_val;

  158. }


分析可重定位目标文件:
root@tay-virtual-machine:/home/tay/workspace/parase_elf_file# ./parse_elf_file parse_elf_file.o 
parse_elf_header
File class:32-bit objects
Data encoding:little endian
version:1
OS ABI identification:0
ABI version:0
object file type:Relocatable file
machine:Intel 80386
version:1
Entry point virtual address:0x00000000
Program header table file offset:0x00000000
Section header table file offset:0x00000e48
Processor-specific flags:0
ELF header size in bytes:52
Program header table entry size:0
Program header table entry count:0
Section header table entry size :40
Section header table entry count:13
Section header string table index:10

分析可执行目标文件:
root@tay-virtual-machine:/home/tay/workspace/parase_elf_file# ./parse_elf_file parse_elf_file
parse_elf_header
File class:32-bit objects
Data encoding:little endian
version:1
OS ABI identification:0
ABI version:0
object file type:Executable file
machine:Intel 80386
version:1
Entry point virtual address:0x08048450
Program header table file offset:0x00000034
Section header table file offset:0x000028e0
Processor-specific flags:0
ELF header size in bytes:52
Program header table entry size:32
Program header table entry count:9
Section header table entry size :40
Section header table entry count:30
Section header string table index:27


阅读(3311) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~