88import logging
99
1010from ...arch .arch_info import Endianness
11- from .headers import ElfMachine , HeaderTypes , SectionHeaderType , SymbolTableBinding , SymbolTableType
11+ from .headers import (
12+ ElfMachine ,
13+ HeaderTypes ,
14+ SectionHeaderType ,
15+ SymbolTableBinding ,
16+ SymbolTableType ,
17+ )
1218
1319
1420logger = logging .getLogger ("elf" )
@@ -40,15 +46,16 @@ def __getitem__(self, key):
4046 def parse_info (self ):
4147 if self .bits == 64 :
4248 self .symbol_id = self .header .r_info >> 32
43- self .type = self .header .r_info & 0xffffffff
49+ self .type = self .header .r_info & 0xFFFFFFFF
4450 else :
4551 self .symbol_id = self .header .r_info >> 8
46- self .type = self .header .r_info & 0xff
47-
52+ self .type = self .header .r_info & 0xFF
53+
4854 def connect_section (self , symbole_table , sections ):
4955 symbole = symbole_table [self .symbol_id ].header
5056 self .section = sections [symbole .st_shndx ].name
5157
58+
5259class ElfSymbol :
5360 def __init__ (self , header , i ):
5461 self .header = header
@@ -75,7 +82,8 @@ def __getitem__(self, key):
7582
7683 def parse_info (self ):
7784 self .binding = self .header .st_info >> 4
78- self .type = self .header .st_info & 0xf
85+ self .type = self .header .st_info & 0xF
86+
7987
8088class ElfSection :
8189 def __init__ (self , header ):
@@ -89,7 +97,12 @@ def __getitem__(self, key):
8997 elif key == "data" :
9098 return self .data
9199 elif key == "alignment" :
92- return hex (self .header .sh_addralign )
100+ if self .header .sh_addralign == 0 :
101+ return (
102+ "0x1" # set the alignment to 1 if there is none specified
103+ )
104+ else :
105+ return hex (self .header .sh_addralign )
93106 else :
94107 raise IndexError
95108
@@ -125,20 +138,33 @@ def __getitem__(self, key):
125138 if key == "arch" :
126139 return self .e_machine .name .lower ()
127140 elif key == "entry_symbol_id" :
128- return self .elf_header .e_entry # TODO: do not return when e_entry is 0
141+ return (
142+ self .elf_header .e_entry
143+ ) # TODO: do not return when e_entry is 0
129144 elif key == "sections" :
130145 return self .sections
131146 elif key == "relocations" :
132147 return self .relocations
133148 elif key == "symbols" :
134- return self .symbole_table
149+ if hasattr (self , "symbole_table" ):
150+ return self .symbole_table
151+ else :
152+ return []
135153 elif key == "images" :
136154 return []
137155 else :
138156 raise IndexError
139-
157+
140158 def __contains__ (self , key ):
141- return key in ["arch" , "entry_symbol_id" , "sections" , "relocations" , "symbols" ]
159+ if key == "entry_symbol_id" and self .elf_header .e_entry == 0 :
160+ return False
161+ return key in [
162+ "arch" ,
163+ "entry_symbol_id" ,
164+ "sections" ,
165+ "relocations" ,
166+ "symbols" ,
167+ ]
142168
143169 @staticmethod
144170 def load (f ):
@@ -176,7 +202,9 @@ def load(f):
176202 elf_file .read_strtab (f )
177203 for section in elf_file .sections :
178204 section .read_data (f )
179- section .name = elf_file .get_str (section .header ["sh_name" ], elf_file .strtab )
205+ section .name = elf_file .get_str (
206+ section .header ["sh_name" ], elf_file .strtab
207+ )
180208 typ = SectionHeaderType (section .header ["sh_type" ])
181209 if typ == SectionHeaderType .REL :
182210 f .seek (section .header ["sh_offset" ])
@@ -188,15 +216,23 @@ def load(f):
188216 elf_file .relocations .append (ElfRelocation (rh , bits = bits ))
189217 elif typ in [SectionHeaderType .SYMTAB , SectionHeaderType .DYNSYM ]:
190218 elf_file .symbole_table = elf_file .read_symtab (section )
191- elif typ == SectionHeaderType .STRTAB and section .name in [".strtab" , ".dynstr" ]:
219+ elif typ == SectionHeaderType .STRTAB and section .name in [
220+ ".strtab" ,
221+ ".dynstr" ,
222+ ]:
192223 elf_file .symstrtab = section .read_data (f )
193-
224+
194225 if "symbole_table" in vars (elf_file ):
195226 for relocation in elf_file .relocations :
196- relocation .connect_section (elf_file .symbole_table , elf_file .sections )
227+ relocation .connect_section (
228+ elf_file .symbole_table , elf_file .sections
229+ )
197230 for symbol in elf_file .symbole_table :
198- symbol .name = elf_file .get_str (symbol .header ["st_name" ], elf_file .symstrtab )
199- symbol .section = elf_file .sections [symbol .header .st_shndx ]
231+ symbol .name = elf_file .get_str (
232+ symbol .header ["st_name" ], elf_file .symstrtab
233+ )
234+ if symbol .header .st_shndx < len (elf_file .sections ):
235+ symbol .section = elf_file .sections [symbol .header .st_shndx ]
200236 return elf_file
201237
202238 def read_strtab (self , f ):
@@ -208,7 +244,8 @@ def read_symtab(self, sym_section):
208244 len (sym_section .data ) // self .header_types .SymbolTableEntry .size
209245 )
210246 table = [
211- ElfSymbol (self .header_types .SymbolTableEntry .read (f ), i ) for i in range (count )
247+ ElfSymbol (self .header_types .SymbolTableEntry .read (f ), i )
248+ for i in range (count )
212249 ]
213250 return table
214251
0 commit comments