Skip to content

Commit f453769

Browse files
some more bug fixes in the ElfFile/ObjectFile conversion
1 parent e3a9081 commit f453769

3 files changed

Lines changed: 71 additions & 31 deletions

File tree

ppci/binutils/objectfile.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
def get_object(obj):
2828
"""Try hard to load an object"""
2929
if not isinstance(obj, ObjectFile):
30-
f = get_file(obj)
30+
f = get_file(obj, mode="rb")
3131
obj = ObjectFile.load(f)
3232
f.close()
3333
return obj
@@ -377,21 +377,24 @@ def save(self, output_file):
377377
@staticmethod
378378
def load(input_file):
379379
"""Load object file from file"""
380-
if is_json(input_file):
380+
# if is_json(input_file):
381+
# return deserialize(json.load(input_file))
382+
# else:
383+
# return deserialize(ElfFile.load(input_file))
384+
if isinstance(input_file, (io.StringIO)):
381385
return deserialize(json.load(input_file))
382-
else:
383-
return deserialize(ElfFile.load(input_file))
384386

385-
def is_json(file):
386-
if file.seekable() and file.readable():
387-
start = file.read(4)
388-
file.seek(0)
389-
if isinstance(start, bytes):
390-
return not b"ELF" in start
387+
if hasattr(input_file, "mode") and input_file.mode == "r":
388+
input_file.close()
389+
input_file = open(input_file.name, "rb")
390+
391+
start = input_file.read(4)
392+
input_file.seek(0)
393+
if b"ELF" in start:
394+
return deserialize(ElfFile.load(input_file))
391395
else:
392-
return not "ELF" in start
393-
else:
394-
return True
396+
return deserialize(json.load(input_file))
397+
395398

396399
def print_object(obj):
397400
"""Display an object in a user friendly manner"""

ppci/format/elf/file.py

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@
88
import logging
99

1010
from ...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

1420
logger = 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+
5259
class 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

8088
class 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

ppci/format/elf/headers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ def __init__(self, bits=64, endianness=Endianness.LITTLE):
357357
],
358358
)
359359
assert self.RelocationTableEntryWA.size == 12
360-
360+
361361
if bits == 64:
362362
self.RelocationTableEntry = header.mk_header(
363363
"RelocationTableEntry",

0 commit comments

Comments
 (0)