summaryrefslogtreecommitdiff
path: root/tools/libelf
diff options
context:
space:
mode:
Diffstat (limited to 'tools/libelf')
-rw-r--r--tools/libelf/object.py182
1 files changed, 92 insertions, 90 deletions
diff --git a/tools/libelf/object.py b/tools/libelf/object.py
index ff09754a0a..f0294432c7 100644
--- a/tools/libelf/object.py
+++ b/tools/libelf/object.py
@@ -33,7 +33,7 @@ class Object:
path: Path = None
executable: bool = False
-def load_object_from_file(path, name, file) -> Object:
+def load_object_from_file(path, name, file, skip_symbols = False, skip_relocations = False) -> Object:
obj = Object()
obj.path = path
obj.name = name
@@ -135,98 +135,100 @@ def load_object_from_file(path, name, file) -> Object:
if section.name:
obj.sections[section.name] = section
- # Find all symbols
- for symtab in obj.sym_sections.values():
- if not symtab.header.sh_link in obj.str_sections:
- raise ElfException("symbol table '%s' is not referenceing a valid string table section (sh_link: %i)" % (
- symtab.name, symtab.header.sh_link))
-
- symtab.object_offset = len(obj.symbols)
- strtab = obj.str_sections[symtab.header.sh_link]
- for i,sym in enumerate(symtab.symbols):
- if i == 0:
- symbol = NullSymbol(sym)
+ if not skip_symbols:
+ # Find all symbols
+ for symtab in obj.sym_sections.values():
+ if not symtab.header.sh_link in obj.str_sections:
+ raise ElfException("symbol table '%s' is not referenceing a valid string table section (sh_link: %i)" % (
+ symtab.name, symtab.header.sh_link))
+
+ symtab.object_offset = len(obj.symbols)
+ strtab = obj.str_sections[symtab.header.sh_link]
+ for i,sym in enumerate(symtab.symbols):
+ if i == 0:
+ symbol = NullSymbol(sym)
+ symbol.object = obj
+ obj.symbols.append(symbol)
+ continue
+
+ name = None
+ if sym.st_name:
+ name = strtab.readString(sym.st_name)
+ symbol = None
+ if sym.st_shndx == elf.SHN_UNDEF:
+ symbol = UndefSymbol(sym, name)
+ elif sym.st_shndx == elf.SHN_ABS:
+ symbol = AbsoluteSymbol(sym, name, sym.st_value)
+ else:
+ if not sym.st_shndx in idx_sections:
+ raise ElfException("symbol '%s' has invalid section-id (st_shndx: %i)" % (name, sym.st_shndx))
+ s = idx_sections[sym.st_shndx]
+ symbol = OffsetSymbol(sym, name, idx_sections[sym.st_shndx], sym.st_value)
+
+ assert symbol
symbol.object = obj
+
+ if symbol.name:
+ obj.symbol_map[symbol.name].append(symbol)
+
obj.symbols.append(symbol)
- continue
-
- name = None
- if sym.st_name:
- name = strtab.readString(sym.st_name)
- symbol = None
- if sym.st_shndx == elf.SHN_UNDEF:
- symbol = UndefSymbol(sym, name)
- elif sym.st_shndx == elf.SHN_ABS:
- symbol = AbsoluteSymbol(sym, name, sym.st_value)
- else:
- if not sym.st_shndx in idx_sections:
- raise ElfException("symbol '%s' has invalid section-id (st_shndx: %i)" % (name, sym.st_shndx))
- s = idx_sections[sym.st_shndx]
- symbol = OffsetSymbol(sym, name, idx_sections[sym.st_shndx], sym.st_value)
-
- assert symbol
- symbol.object = obj
-
- if symbol.name:
- obj.symbol_map[symbol.name].append(symbol)
-
- obj.symbols.append(symbol)
-
- # Find all relocations
- for rela_section in obj.rela_sections.values():
- if not rela_section.header.sh_link in obj.sym_sections:
- raise ElfException("relocation section '%s' is not referenceing a valid symbol table section (sh_link: %i)" % (
- symtab.name, rela_section.header.sh_link))
- if not rela_section.header.sh_info in idx_sections:
- raise ElfException("relocation section '%s' is not referenceing a valid section (sh_info: %i)" % (
- symtab.name, rela_section.header.sh_info))
-
- symtab = obj.sym_sections[rela_section.header.sh_link]
- modify = idx_sections[rela_section.header.sh_info]
-
- section_relocations = []
- for rela in rela_section.relocations:
- type = elf.R_TYPE(rela.r_info)
- sym_id = elf.R_SYM(rela.r_info)
- if not type in RELOCATION_NAMES:
- raise ElfException("unsupported relocation type: 0x%02X (in '%s')" % (type, path))
-
- if sym_id < 0 or sym_id >= len(symtab.symbols):
- # report warning?
- # main.elf will generate relocation sections with invalid symbol indices
- # raise ElfException("invalid symbol index: %i (%i symbols)" % (sym_id, len(symtab.symbols)))
- continue
- symbol = obj.symbols[symtab.object_offset + sym_id]
-
- relocation = None
- if type == 1:
- relocation = R_PPC_ADDR32(type, symbol, modify, rela.r_offset, rela.r_addend)
- elif type == 3:
- relocation = R_PPC_ADDR16(type, symbol, modify, rela.r_offset, rela.r_addend)
- elif type == 4:
- relocation = R_PPC_ADDR16_LO(type, symbol, modify, rela.r_offset, rela.r_addend)
- elif type == 5:
- relocation = R_PPC_ADDR16_HI(type, symbol, modify, rela.r_offset, rela.r_addend)
- elif type == 6:
- relocation = R_PPC_ADDR16_HA(type, symbol, modify, rela.r_offset, rela.r_addend)
- elif type == 10:
- relocation = R_PPC_REL24(type, symbol, modify, rela.r_offset, rela.r_addend)
- elif type == 11:
- relocation = R_PPC_REL14(type, symbol, modify, rela.r_offset, rela.r_addend)
- elif type == 109:
- relocation = R_PPC_EMB_SDA21(type, symbol, modify, rela.r_offset, rela.r_addend)
- else:
- print("unsupported relocation type: 0x%02X \"%s\" (in '%s')" % (type, RELOCATION_NAMES[type], path), file = sys.stderr)
- continue
-
- assert relocation
- section_relocations.append(relocation)
- obj.relocations.append(relocation)
-
- obj.section_relocations.append((rela_section.name, section_relocations))
+
+ if not skip_relocations:
+ # Find all relocations
+ for rela_section in obj.rela_sections.values():
+ if not rela_section.header.sh_link in obj.sym_sections:
+ raise ElfException("relocation section '%s' is not referenceing a valid symbol table section (sh_link: %i)" % (
+ symtab.name, rela_section.header.sh_link))
+ if not rela_section.header.sh_info in idx_sections:
+ raise ElfException("relocation section '%s' is not referenceing a valid section (sh_info: %i)" % (
+ symtab.name, rela_section.header.sh_info))
+
+ symtab = obj.sym_sections[rela_section.header.sh_link]
+ modify = idx_sections[rela_section.header.sh_info]
+
+ section_relocations = []
+ for rela in rela_section.relocations:
+ type = elf.R_TYPE(rela.r_info)
+ sym_id = elf.R_SYM(rela.r_info)
+ if not type in RELOCATION_NAMES:
+ raise ElfException("unsupported relocation type: 0x%02X (in '%s')" % (type, path))
+
+ if sym_id < 0 or sym_id >= len(symtab.symbols):
+ # report warning?
+ # main.elf will generate relocation sections with invalid symbol indices
+ # raise ElfException("invalid symbol index: %i (%i symbols)" % (sym_id, len(symtab.symbols)))
+ continue
+ symbol = obj.symbols[symtab.object_offset + sym_id]
+
+ relocation = None
+ if type == 1:
+ relocation = R_PPC_ADDR32(type, symbol, modify, rela.r_offset, rela.r_addend)
+ elif type == 3:
+ relocation = R_PPC_ADDR16(type, symbol, modify, rela.r_offset, rela.r_addend)
+ elif type == 4:
+ relocation = R_PPC_ADDR16_LO(type, symbol, modify, rela.r_offset, rela.r_addend)
+ elif type == 5:
+ relocation = R_PPC_ADDR16_HI(type, symbol, modify, rela.r_offset, rela.r_addend)
+ elif type == 6:
+ relocation = R_PPC_ADDR16_HA(type, symbol, modify, rela.r_offset, rela.r_addend)
+ elif type == 10:
+ relocation = R_PPC_REL24(type, symbol, modify, rela.r_offset, rela.r_addend)
+ elif type == 11:
+ relocation = R_PPC_REL14(type, symbol, modify, rela.r_offset, rela.r_addend)
+ elif type == 109:
+ relocation = R_PPC_EMB_SDA21(type, symbol, modify, rela.r_offset, rela.r_addend)
+ else:
+ print("unsupported relocation type: 0x%02X \"%s\" (in '%s')" % (type, RELOCATION_NAMES[type], path), file = sys.stderr)
+ continue
+
+ assert relocation
+ section_relocations.append(relocation)
+ obj.relocations.append(relocation)
+
+ obj.section_relocations.append((rela_section.name, section_relocations))
return obj
-def load_object_from_path(path) -> Object:
+def load_object_from_path(path, skip_symbols = False, skip_relocations = False) -> Object:
with open(path, 'rb') as file:
- return load_object_from_file(path, path.parts[-1], file) \ No newline at end of file
+ return load_object_from_file(path, path.parts[-1], file, skip_symbols, skip_relocations) \ No newline at end of file