diff --git a/amitools/binfmt/Relocate.py b/amitools/binfmt/Relocate.py index f5e3d5e..063e64f 100644 --- a/amitools/binfmt/Relocate.py +++ b/amitools/binfmt/Relocate.py @@ -56,12 +56,12 @@ class Relocate: for segment in segs: # allocate new buffer data = bytearray(segment.size) - self._copy_data(data, segment) + self._copy_data(data, segment, addrs) self._reloc_data(data, segment, addrs) datas.append(data) return datas - def _copy_data(self, data, segment, offset=0): + def _copy_data(self, data, segment, addrs, offset=0): # allocate segment data size = segment.size src_data = segment.data @@ -98,8 +98,8 @@ class Relocate: self._write_long(data, offset, addr) if self.verbose: print( - "#%02d + %06x: %06x (delta) + @%06x (#%02d) -> %06x" - % (my_id, offset, delta, to_addr, to_id, addr) + "#%02d @%06x +%06x: %06x (delta) to @%06x (#%02d) -> %06x" + % (my_id, my_addr, offset, delta, to_addr, to_id, addr) ) def _read_long(self, data, offset): diff --git a/amitools/binfmt/elf/DwarfDebugLine.py b/amitools/binfmt/elf/DwarfDebugLine.py index 9a22320..09e1f6e 100644 --- a/amitools/binfmt/elf/DwarfDebugLine.py +++ b/amitools/binfmt/elf/DwarfDebugLine.py @@ -26,14 +26,17 @@ class LineState: return state def __str__(self): - return "[address=%08x file=%d line=%d column=%d is_stmt=%s basic_block=%s end_sequence=%d]" % ( - self.address, - self.file, - self.line, - self.column, - self.is_stmt, - self.basic_block, - self.end_sequence, + return ( + "[address=%08x file=%d line=%d column=%d is_stmt=%s basic_block=%s end_sequence=%d]" + % ( + self.address, + self.file, + self.line, + self.column, + self.is_stmt, + self.basic_block, + self.end_sequence, + ) ) diff --git a/amitools/binfmt/hunk/BinFmtHunk.py b/amitools/binfmt/hunk/BinFmtHunk.py index 4733945..bdc8727 100644 --- a/amitools/binfmt/hunk/BinFmtHunk.py +++ b/amitools/binfmt/hunk/BinFmtHunk.py @@ -153,7 +153,11 @@ class BinFmtHunk: def _add_hunk_relocs(self, blks, seg, all_segs): """add relocations to a segment""" for blk in blks: - if blk.blk_id not in (Hunk.HUNK_ABSRELOC32, Hunk.HUNK_RELOC32SHORT): + if blk.blk_id not in ( + Hunk.HUNK_ABSRELOC32, + Hunk.HUNK_RELOC32SHORT, + Hunk.HUNK_RELRELOC32, + ): raise HunkParseError("Invalid Relocations for BinImage: %d" % blk_id) relocs = blk.relocs for r in relocs: @@ -164,9 +168,14 @@ class BinFmtHunk: rl = seg.get_reloc(to_seg) if rl == None: rl = Relocations(to_seg) + # type + if blk.blk_id == Hunk.HUNK_RELRELOC32: + reloc_type = BIN_IMAGE_RELOC_PC32 + else: + reloc_type = BIN_IMAGE_RELOC_32 # add offsets for o in offsets: - r = Reloc(o) + r = Reloc(o, reloc_type) rl.add_reloc(r) seg.add_reloc(to_seg, rl) diff --git a/amitools/binfmt/hunk/Hunk.py b/amitools/binfmt/hunk/Hunk.py index 593d331..569814a 100644 --- a/amitools/binfmt/hunk/Hunk.py +++ b/amitools/binfmt/hunk/Hunk.py @@ -60,6 +60,7 @@ loadseg_valid_begin_hunks = [HUNK_CODE, HUNK_DATA, HUNK_BSS, HUNK_PPC_CODE] loadseg_valid_extra_hunks = [ HUNK_ABSRELOC32, HUNK_RELOC32SHORT, + HUNK_RELRELOC32, HUNK_DEBUG, HUNK_SYMBOL, HUNK_NAME, diff --git a/amitools/binfmt/hunk/HunkBlockFile.py b/amitools/binfmt/hunk/HunkBlockFile.py index b6a6622..cd73fcf 100644 --- a/amitools/binfmt/hunk/HunkBlockFile.py +++ b/amitools/binfmt/hunk/HunkBlockFile.py @@ -620,6 +620,7 @@ hunk_block_type_map = { HUNK_DATA: HunkSegmentBlock, HUNK_BSS: HunkSegmentBlock, HUNK_ABSRELOC32: HunkRelocLongBlock, + HUNK_RELRELOC32: HunkRelocWordBlock, HUNK_RELOC32SHORT: HunkRelocWordBlock, HUNK_END: HunkEndBlock, HUNK_DEBUG: HunkDebugBlock, diff --git a/amitools/binfmt/hunk/HunkLoadSegFile.py b/amitools/binfmt/hunk/HunkLoadSegFile.py index 6ac7d7f..dc95a8e 100644 --- a/amitools/binfmt/hunk/HunkLoadSegFile.py +++ b/amitools/binfmt/hunk/HunkLoadSegFile.py @@ -118,7 +118,7 @@ class HunkSegment: if self.debug_infos is None: self.debug_infos = [] self.debug_infos.append(debug_info) - elif blk_id in (HUNK_ABSRELOC32, HUNK_RELOC32SHORT): + elif blk_id in (HUNK_ABSRELOC32, HUNK_RELOC32SHORT, HUNK_RELRELOC32): if self.reloc_blks is None: self.reloc_blks = [] self.reloc_blks.append(blk) diff --git a/amitools/binfmt/hunk/HunkReader.py b/amitools/binfmt/hunk/HunkReader.py index f4a0edf..a2340a4 100644 --- a/amitools/binfmt/hunk/HunkReader.py +++ b/amitools/binfmt/hunk/HunkReader.py @@ -3,7 +3,6 @@ import os import struct import io -from types import * from .Hunk import * @@ -23,14 +22,14 @@ class HunkReader: self.units = None def get_struct_summary(self, obj): - if type(obj) == ListType: + if type(obj) is list: result = [] for a in obj: v = self.get_struct_summary(a) if v != None: result.append(v) return "[" + ",".join(result) + "]" - elif type(obj) == DictType: + elif type(obj) is dict: if "type_name" in obj: type_name = obj["type_name"] return type_name.replace("HUNK_", "") @@ -658,8 +657,7 @@ class HunkReader: result = self.parse_bss(f, hunk) # ----- HUNK_ ----- elif ( - hunk_type == HUNK_RELRELOC32 - or hunk_type == HUNK_ABSRELOC16 + hunk_type == HUNK_ABSRELOC16 or hunk_type == HUNK_RELRELOC8 or hunk_type == HUNK_RELRELOC16 or hunk_type == HUNK_ABSRELOC32 @@ -670,7 +668,7 @@ class HunkReader: ): result = self.parse_reloc(f, hunk) # ---- HUNK_ ----- - elif hunk_type == HUNK_RELOC32SHORT: + elif hunk_type == HUNK_RELOC32SHORT or hunk_type == HUNK_RELRELOC32: result = self.parse_reloc_short(f, hunk) # ----- HUNK_SYMBOL ----- elif hunk_type == HUNK_SYMBOL: diff --git a/amitools/binfmt/hunk/HunkRelocate.py b/amitools/binfmt/hunk/HunkRelocate.py index 634b83a..1fde57d 100644 --- a/amitools/binfmt/hunk/HunkRelocate.py +++ b/amitools/binfmt/hunk/HunkRelocate.py @@ -65,21 +65,28 @@ class HunkRelocate: if ( hunk["type"] == Hunk.HUNK_ABSRELOC32 or hunk["type"] == Hunk.HUNK_DREL32 + or hunk["type"] == Hunk.HUNK_RELRELOC32 ): reloc = hunk["reloc"] for hunk_num in reloc: # get address of other hunk hunk_addr = addr[hunk_num] offsets = reloc[hunk_num] + relative = hunk["type"] == Hunk.HUNK_RELRELOC32 + my_addr = addr[hunk_no] for offset in offsets: - self.relocate32(hunk_no, data, offset, hunk_addr) + self.relocate32( + hunk_no, data, offset, hunk_addr, my_addr, relative + ) datas.append(data.raw) return datas - def relocate32(self, hunk_no, data, offset, hunk_addr): + def relocate32(self, hunk_no, data, offset, hunk_addr, my_addr, relative): delta = self.read_long(data, offset) addr = hunk_addr + delta + if relative: + addr -= my_addr + offset self.write_long(data, offset, addr) if self.verbose: print( diff --git a/amitools/tools/hunktool.py b/amitools/tools/hunktool.py index 1a6c935..2aa3701 100755 --- a/amitools/tools/hunktool.py +++ b/amitools/tools/hunktool.py @@ -186,9 +186,9 @@ class Relocate(HunkCommand): print("Sizes: ", " ".join(["%06x" % (x) for x in sizes])) print("Data: ", " ".join(["%06x" % (len(x)) for x in datas])) print("Total: ", "%06x" % (rel.get_total_size())) - if args.hexdump: - for d in datas: - print_hex(d) + if self.args.hexdump: + for d, a in zip(datas, addrs): + print_hex(d, base_addr=a) return True diff --git a/amitools/vamos/error.py b/amitools/vamos/error.py index 59e8192..e52265d 100644 --- a/amitools/vamos/error.py +++ b/amitools/vamos/error.py @@ -12,7 +12,7 @@ class InvalidMemoryAccessError(VamosError): def __str__(self): return "Invalid Memory Access %s(%d): %06x" % ( self.access_type, - 2 ** self.width, + 2**self.width, self.addr, ) diff --git a/amitools/vamos/libcore/profile.py b/amitools/vamos/libcore/profile.py index c8f67e9..3aa8e25 100644 --- a/amitools/vamos/libcore/profile.py +++ b/amitools/vamos/libcore/profile.py @@ -91,13 +91,16 @@ class LibFuncProfileData(object): return self.tag def __repr__(self): - return "LibProfileFuncData(func_id=%r,add_samples=%r):num=%r,sum=%r,deltas=%r,tag=%r" % ( - self.func_id, - self.add_samples, - self.num, - self.sum, - self.deltas, - self.tag, + return ( + "LibProfileFuncData(func_id=%r,add_samples=%r):num=%r,sum=%r,deltas=%r,tag=%r" + % ( + self.func_id, + self.add_samples, + self.num, + self.sum, + self.deltas, + self.tag, + ) ) def dump(self, name): diff --git a/amitools/vamos/machine/hwaccess.py b/amitools/vamos/machine/hwaccess.py index 1633c2f..aa02fb5 100644 --- a/amitools/vamos/machine/hwaccess.py +++ b/amitools/vamos/machine/hwaccess.py @@ -6,7 +6,7 @@ class HWAccessError(InvalidMemoryAccessError): def __str__(self): return "Invalid HW Access %s(%d): %06x" % ( self.access_type, - 2 ** self.width, + 2**self.width, self.addr, ) diff --git a/amitools/vamos/trace/mgr.py b/amitools/vamos/trace/mgr.py index 434b37b..4267d00 100644 --- a/amitools/vamos/trace/mgr.py +++ b/amitools/vamos/trace/mgr.py @@ -136,7 +136,7 @@ class TraceManager(object): log.info( "%s(%d): %06x: %s %6s [%s] %s", mode, - 2 ** width, + 2**width, addr, val, text,