cprover
elf_reader.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Read ELF
4 
5 Author:
6 
7 \*******************************************************************/
8 
11 
12 #include "elf_reader.h"
13 
14 #include <istream>
15 
16 elf_readert::elf_readert(std::istream &_in):in(_in)
17 {
18  // read 32-bit header
19  in.read(
20  reinterpret_cast<char*>(&elf32_header),
21  sizeof(elf32_header));
22 
23  if(!in)
24  throw "failed to read ELF header";
25 
26  if(elf32_header.e_ident[0]!=0x7f ||
27  elf32_header.e_ident[1]!='E' ||
28  elf32_header.e_ident[2]!='L' ||
29  elf32_header.e_ident[3]!='F')
30  throw "ELF header malformed (magic)"; // NOLINT(readability/throw)
31 
33 
34  if(elf_class==ELF32)
35  {
36  char ei_data=elf32_header.e_ident[5];
37 
38  if(ei_data==1)
39  little_endian=true;
40  else if(ei_data==2)
41  little_endian=false;
42  else
43  throw "ELF32 header malformed (EI_DATA)"; // NOLINT(readability/throw)
44 
45  if(elf32_header.e_version!=1)
46  throw "unknown ELF32 version";
47 
48  // get offset for section header
49  if(elf32_header.e_shoff==0 ||
51  throw "ELF32 without section header"; // NOLINT(readability/throw)
52 
55 
56  // iterate over these
57  for(std::size_t i=0; i<elf32_section_header_table.size(); i++)
58  {
59  // go to right place
61 
62  // read section header
63  in.read(
64  reinterpret_cast<char*>(&elf32_section_header_table[i]),
65  sizeof(Elf32_Shdr));
66  }
67 
68  // string table
69  unsigned string_table_nr=elf32_header.e_shstrndx;
70  if(string_table_nr>=elf32_section_header_table.size())
71  throw "ELF32 without string table"; // NOLINT(readability/throw)
72 
73  string_table_offset=section_offset(string_table_nr);
74  }
75  else if(elf_class==ELF64)
76  {
77  // read 64-bit header
78  in.seekg(0);
79  in.read(
80  reinterpret_cast<char*>(&elf64_header),
81  sizeof(elf64_header));
82 
83  char ei_data=elf64_header.e_ident[5];
84 
85  if(ei_data==1)
86  little_endian=true;
87  else if(ei_data==2)
88  little_endian=false;
89  else
90  throw "ELF64 header malformed (EI_DATA)"; // NOLINT(readability/throw)
91 
92  if(elf64_header.e_version!=1)
93  throw "unknown ELF64 version";
94 
95  // get offset for section header
96  if(elf64_header.e_shoff==0 ||
98  throw "ELF64 without section header"; // NOLINT(readability/throw)
99 
102 
103  // iterate over these
104  for(std::size_t i=0; i<elf64_section_header_table.size(); i++)
105  {
106  // go to right place
108 
109  // read section header
110  in.read(
111  reinterpret_cast<char*>(&elf64_section_header_table[i]),
112  sizeof(Elf64_Shdr));
113  }
114 
115  // string table
116  unsigned string_table_nr=elf64_header.e_shstrndx;
117  if(string_table_nr>=elf64_section_header_table.size())
118  throw "ELF64 without string table"; // NOLINT(readability/throw)
119 
120  string_table_offset=section_offset(string_table_nr);
121  }
122 }
123 
124 std::string elf_readert::get_string(std::streampos index) const
125 {
126  in.seekg(string_table_offset+index);
127 
128  std::string result;
129 
130  while(in)
131  {
132  char ch;
133  in.read(&ch, 1);
134  if(ch==0)
135  break;
136  result+=ch;
137  }
138 
139  return result;
140 }
141 
142 bool elf_readert::has_section(const std::string &name) const
143 {
144  for(std::size_t i=0; i<number_of_sections; i++)
145  if(section_name(i)==name)
146  return true;
147 
148  return false;
149 }
bool has_section(const std::string &name) const
Definition: elf_reader.cpp:142
bool little_endian
Definition: elf_reader.h:112
Elf64_Ehdr elf64_header
Definition: elf_reader.h:110
Elf64_Half e_shnum
Definition: elf_reader.h:68
Elf64_Half e_shstrndx
Definition: elf_reader.h:69
elf_classt elf_class
Definition: elf_reader.h:106
std::string section_name(std::size_t index) const
Definition: elf_reader.h:137
Read ELF.
Elf32_Half e_shstrndx
Definition: elf_reader.h:51
std::streampos section_offset(std::size_t index) const
Definition: elf_reader.h:144
std::string get_string(std::streampos index) const
Definition: elf_reader.cpp:124
unsigned char e_ident[16]
Definition: elf_reader.h:38
Elf64_Off e_shoff
Definition: elf_reader.h:62
Elf32_Half e_shentsize
Definition: elf_reader.h:49
Elf64_Half e_shentsize
Definition: elf_reader.h:67
elf64_section_header_tablet elf64_section_header_table
Definition: elf_reader.h:119
std::istream & in
Definition: elf_reader.h:154
Elf32_Half e_shnum
Definition: elf_reader.h:50
Elf32_Ehdr elf32_header
Definition: elf_reader.h:109
std::streampos string_table_offset
Definition: elf_reader.h:122
Elf64_Word e_version
Definition: elf_reader.h:59
Elf32_Word e_version
Definition: elf_reader.h:41
elf_readert(std::istream &_in)
Definition: elf_reader.cpp:16
std::size_t number_of_sections
Definition: elf_reader.h:135
elf32_section_header_tablet elf32_section_header_table
Definition: elf_reader.h:116
Elf32_Off e_shoff
Definition: elf_reader.h:44
unsigned char e_ident[16]
Definition: elf_reader.h:56