class Symtbl:
def __init__(self, **kwargs):
self.__dict__ = {**kwargs}
def adjust(self, off):
self.__dict__ = {k:v+off for k,v in self.__dict__.items()}
def rebase(self, sym):
self.adjust(-sym)
def __str__(self):
return __str__(self,self.__dict__)
class Memmap:
def __init__(self, tbl, sym, addr):
object.__setattr__(self,'__tbl__', tbl)
base = addr if sym == 'base' else addr - getattr(self.__tbl__, sym)
object.__setattr__(self,'base', base)
def __getattribute__(self, sym):
if sym == '__tbl__' or sym == 'base':
return object.__getattribute__(self, sym)
a = getattr(self.__tbl__, sym)
return self.base + a
def __setattr__(self, k, v):
raise TypeError('Memmaps are Read-Only! Modify offsets with Symtbl instead!')
def __str__(self):
s = __str__(self,self.__tbl__.__dict__)
pos = -1
for i in range(2):
pos = s.find('\n',pos+1)
s = s[:pos] + __tbl_format__.format(hex(self.base),'base') + s[pos:]
return s
__tbl_format__ = '\n{:<20} {:<20}'
def __str__(self,tbl):
s = 'symbols: ' + str(len(tbl))
s += __tbl_format__.format('ADDRESS', 'SYMBOL')
for sym,off in sorted(tbl.items(),key=lambda x:x[1]):
s += __tbl_format__.format(hex(getattr(self,sym)),sym)
return s