2
0
mirror of https://frontier.innolan.net/github/amigaos-cross-toolchain6.git synced 2024-10-19 10:29:55 +00:00

Nicer print-out.

This commit is contained in:
Krystian Bacławski
2013-05-25 11:59:15 +02:00
parent 9167be7ecc
commit 5b23cc3588

View File

@ -4,6 +4,7 @@ from collections import namedtuple, defaultdict
import inspect
import struct
import sys
import textwrap
class HunkMap(object):
@ -13,37 +14,37 @@ class HunkMap(object):
# lading such executables is attempted under <V39 dos, it will fail with a
# bad hunk type.
HUNKB_ADVISORY = 29
HUNKB_CHIP = 30
HUNKB_FAST = 31
HUNKB_CHIP = 30
HUNKB_FAST = 31
HUNKF_ADVISORY = 1 << HUNKB_ADVISORY
HUNKF_CHIP = 1 << HUNKB_CHIP
HUNKF_FAST = 1 << HUNKB_FAST
HUNKF_CHIP = 1 << HUNKB_CHIP
HUNKF_FAST = 1 << HUNKB_FAST
HUNK_UNIT = 999
HUNK_NAME = 1000
HUNK_CODE = 1001
HUNK_DATA = 1002
HUNK_BSS = 1003
HUNK_RELOC32 = 1004
HUNK_RELOC16 = 1005
HUNK_RELOC8 = 1006
HUNK_EXT = 1007
HUNK_SYMBOL = 1008
HUNK_DEBUG = 1009
HUNK_END = 1010
HUNK_HEADER = 1011
HUNK_OVERLAY = 1013
HUNK_BREAK = 1014
HUNK_DREL32 = 1015
HUNK_DREL16 = 1016
HUNK_DREL8 = 1017
HUNK_LIB = 1018
HUNK_INDEX = 1019
HUNK_UNIT = 999
HUNK_NAME = 1000
HUNK_CODE = 1001
HUNK_DATA = 1002
HUNK_BSS = 1003
HUNK_RELOC32 = 1004
HUNK_RELOC16 = 1005
HUNK_RELOC8 = 1006
HUNK_EXT = 1007
HUNK_SYMBOL = 1008
HUNK_DEBUG = 1009
HUNK_END = 1010
HUNK_HEADER = 1011
HUNK_OVERLAY = 1013
HUNK_BREAK = 1014
HUNK_DREL32 = 1015
HUNK_DREL16 = 1016
HUNK_DREL8 = 1017
HUNK_LIB = 1018
HUNK_INDEX = 1019
HUNK_RELOC32SHORT = 1020
HUNK_RELRELOC32 = 1021
HUNK_ABSRELOC16 = 1022
HUNK_PPC_CODE = 1257
HUNK_RELRELOC26 = 1260
HUNK_RELRELOC32 = 1021
HUNK_ABSRELOC16 = 1022
HUNK_PPC_CODE = 1257
HUNK_RELRELOC26 = 1260
@classmethod
def GetName(cls, number):
@ -69,22 +70,22 @@ class HunkMap(object):
class HunkExtMap(object):
EXT_SYMB = 0 # symbol table
EXT_DEF = 1 # relocatable definition
EXT_ABS = 2 # Absolute definition
EXT_RES = 3 # no longer supported
EXT_REF32 = 129 # 32 bit absolute reference to symbol
EXT_COMMON = 130 # 32 bit absolute reference to COMMON block
EXT_REF16 = 131 # 16 bit PC-relative reference to symbol
EXT_REF8 = 132 # 8 bit PC-relative reference to symbol
EXT_DEXT32 = 133 # 32 bit data relative reference
EXT_DEXT16 = 134 # 16 bit data relative reference
EXT_DEXT8 = 135 # 8 bit data relative reference
EXT_RELREF32 = 136 # 32 bit PC-relative reference to symbol
EXT_RELCOMMON = 137 # 32 bit PC-relative reference to COMMON block
EXT_ABSREF16 = 138 # 16 bit absolute reference to symbol
EXT_ABSREF8 = 139 # 8 bit absolute reference to symbol
EXT_RELREF26 = 229
EXT_SYMB = 0 # symbol table
EXT_DEF = 1 # relocatable definition
EXT_ABS = 2 # Absolute definition
EXT_RES = 3 # no longer supported
EXT_REF32 = 129 # 32 bit absolute reference to symbol
EXT_COMMON = 130 # 32 bit absolute reference to COMMON block
EXT_REF16 = 131 # 16 bit PC-relative reference to symbol
EXT_REF8 = 132 # 8 bit PC-relative reference to symbol
EXT_DEXT32 = 133 # 32 bit data relative reference
EXT_DEXT16 = 134 # 16 bit data relative reference
EXT_DEXT8 = 135 # 8 bit data relative reference
EXT_RELREF32 = 136 # 32 bit PC-relative reference to symbol
EXT_RELCOMMON = 137 # 32 bit PC-relative reference to COMMON block
EXT_ABSREF16 = 138 # 16 bit absolute reference to symbol
EXT_ABSREF8 = 139 # 8 bit absolute reference to symbol
EXT_RELREF26 = 229
@classmethod
def GetName(cls, number):
@ -112,38 +113,38 @@ Header = namedtuple('Header', 'residents hunks first last specifiers')
class HunkParser(object):
def __init__(self, hunkfile):
self.data = hunkfile.read()
self.data = hunkfile.read()
self.index = 0
def ReadLong(self):
data = struct.unpack('>I', self.data[self.index : self.index + 4])[0]
data = struct.unpack('>I', self.data[self.index:self.index + 4])[0]
self.index += 4
return data
def ReadWord(self):
data = struct.unpack('>H', self.data[self.index : self.index + 2])[0]
data = struct.unpack('>H', self.data[self.index:self.index + 2])[0]
self.index += 2
return data
def ReadInt(self):
data = struct.unpack('>i', self.data[self.index : self.index + 4])[0]
data = struct.unpack('>i', self.data[self.index:self.index + 4])[0]
self.index += 4
return data
def ReadBytes(self, n = None):
def ReadBytes(self, n=None):
if n is None:
n = self.ReadLong() * 4
data = self.data[self.index : self.index + n]
data = self.data[self.index:self.index + n]
self.index += n
return data
def ReadString(self, n = None):
def ReadString(self, n=None):
return self.ReadBytes(n).strip('\0')
def ReadSymbol(self, length):
symbol = self.ReadString(length)
value = self.ReadInt()
return {symbol : value}
value = self.ReadInt()
return (symbol, value)
def ReadSymbols(self):
symbols = []
@ -160,12 +161,12 @@ class HunkParser(object):
def ReadSymbolRefs(self, length):
symbol = self.ReadString(length)
count = self.ReadLong()
refs = [self.ReadLong() for i in range(count)]
return {symbol : refs}
count = self.ReadLong()
refs = [self.ReadLong() for i in range(count)]
return (symbol, refs)
def ReadHunkExt(self):
hunks = defaultdict(dict)
hunks = defaultdict(list)
while True:
longs = self.ReadLong()
@ -184,7 +185,7 @@ class HunkParser(object):
else:
raise NotImplementedError('%s not handled.' % extName)
hunks[extName].update(data)
hunks[extName].append(data)
return hunks
@ -199,7 +200,7 @@ class HunkParser(object):
hunkRef = self.ReadLong()
offsets = [self.ReadLong() for i in range(longs)]
relocs.update({hunkRef : offsets})
relocs.update({hunkRef: offsets})
return relocs
@ -215,7 +216,7 @@ class HunkParser(object):
hunkRef = self.ReadWord()
offsets = [self.ReadWord() for i in range(words)]
relocs.update({hunkRef : offsets})
relocs.update({hunkRef: offsets})
if (self.index - start) & 3:
self.index += 2
@ -235,7 +236,7 @@ class HunkParser(object):
hunks = self.ReadLong()
first = self.ReadLong()
last = self.ReadLong()
last = self.ReadLong()
specifiers = [self.ReadLong() for i in range(last - first + 1)]
return Header(residents, hunks, first, last, specifiers)
@ -272,7 +273,8 @@ class HunkParser(object):
data = self.ReadHeader()
elif name in ['HUNK_NAME', 'HUNK_UNIT']:
data = self.ReadString()
elif name in ['HUNK_CODE', 'HUNK_PPC_CODE', 'HUNK_DATA', 'HUNK_DEBUG', 'HUNK_INDEX']:
elif name in ['HUNK_CODE', 'HUNK_PPC_CODE', 'HUNK_DATA', 'HUNK_DEBUG',
'HUNK_INDEX']:
data = self.ReadBytes()
elif name == 'HUNK_OVERLAY':
data = self.ReadOverlay()
@ -302,8 +304,34 @@ if __name__ == '__main__':
if hunk.name == 'HUNK_EXT':
for name, symbols in hunk.data.items():
print ' ', name
for symbol, value in symbols.items():
print ' ', symbol, '=', value
else:
if hunk.data:
sl = max(len(s) for s, _ in symbols)
for symbol, value in symbols:
print ' ', symbol.ljust(sl, ' '), '=', value
elif hunk.name == 'HUNK_END':
print ''
elif hunk.data:
if isinstance(hunk.data, dict):
for k, nums in hunk.data.items():
prefix = ' %d: ' % k
print textwrap.fill(', '.join(str(n) for n in nums),
width=80,
initial_indent=prefix,
subsequent_indent=' ' * len(prefix))
elif isinstance(hunk.data, str):
hexch = ['%.2x' % ord(c) for c in hunk.data]
ascii = []
for c in hunk.data:
if ord(c) >= 32 and ord(c) < 127:
ascii.append(c)
else:
ascii.append('.')
for i in range(0, len(hexch), 16):
print ' {0} |{1}|'.format(
' '.join(hexch[i:i + 16]).ljust(47, ' '),
''.join(ascii[i:i + 16]))
elif isinstance(hunk.data, list):
namelen = max(len(name) for name, _ in hunk.data) + 1
for name, offset in hunk.data:
print ' {0}: {1}'.format(name.ljust(namelen, ' '), offset)
else:
print ' ', repr(hunk.data)