mirror of
https://github.com/LIV2/amitools.git
synced 2025-12-05 22:22:45 +00:00
added RELRELOC32 support in hunk loader
This commit is contained in:
parent
56d71f3872
commit
d5a2eedc9a
@ -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):
|
||||
|
||||
@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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_<reloc> -----
|
||||
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_<reloc short> -----
|
||||
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:
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
@ -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,
|
||||
)
|
||||
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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,
|
||||
)
|
||||
|
||||
|
||||
@ -136,7 +136,7 @@ class TraceManager(object):
|
||||
log.info(
|
||||
"%s(%d): %06x: %s %6s [%s] %s",
|
||||
mode,
|
||||
2 ** width,
|
||||
2**width,
|
||||
addr,
|
||||
val,
|
||||
text,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user