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:
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user