added RELRELOC32 support in hunk loader

This commit is contained in:
Christian Vogelgsang 2022-03-21 11:28:07 +01:00
parent 56d71f3872
commit d5a2eedc9a
13 changed files with 58 additions and 36 deletions

View File

@ -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):

View File

@ -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,
)
)

View File

@ -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)

View File

@ -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,

View File

@ -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,

View File

@ -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)

View File

@ -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:

View File

@ -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(

View File

@ -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

View File

@ -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,
)

View File

@ -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):

View File

@ -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,
)

View File

@ -136,7 +136,7 @@ class TraceManager(object):
log.info(
"%s(%d): %06x: %s %6s [%s] %s",
mode,
2 ** width,
2**width,
addr,
val,
text,