選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

58 行
2.0KB

  1. """Power C object file (.o/.obj) reader/writer.
  2. u16 code_len; code
  3. u16 n_reloc; u16 off[n] (u16 at off+1 is code-relative, += load base)
  4. u16 n_def; {name\0 u8 kind u16 off}
  5. u16 n_ref; {name\0 u16 kind u16 site} kind 0=abs16 1=hi 2=lo 4=abs+1 (site = opcode offset)
  6. u16 n_res; {name\0 u16 size}
  7. """
  8. import struct
  9. class Obj:
  10. def __init__(s):
  11. s.code=bytearray(); s.reloc=[]; s.defs=[]; s.refs=[]; s.res=[]
  12. @staticmethod
  13. def parse(data):
  14. o=Obj(); p=0
  15. def u16():
  16. nonlocal p
  17. v=data[p]|data[p+1]<<8; p+=2; return v
  18. def name():
  19. nonlocal p
  20. e=data.index(0,p); n=bytes(data[p:e]); p=e+1; return n
  21. n=u16(); o.code=bytearray(data[p:p+n]); p+=n
  22. k=u16(); o.reloc=[u16() for _ in range(k)]
  23. k=u16()
  24. for _ in range(k):
  25. nm=name(); kind=data[p]; p+=1; off=u16(); o.defs.append([nm,kind,off])
  26. k=u16()
  27. for _ in range(k):
  28. nm=name(); kind=u16(); off=u16(); o.refs.append([nm,kind,off])
  29. k=u16()
  30. for _ in range(k):
  31. nm=name(); sz=u16(); o.res.append([nm,sz])
  32. o.trailing=bytes(data[p:])
  33. return o
  34. def build(o):
  35. out=bytearray()
  36. def u16(v): out.extend((v&255,v>>8&255))
  37. u16(len(o.code)); out+=o.code
  38. u16(len(o.reloc)); [u16(x) for x in o.reloc]
  39. u16(len(o.defs))
  40. for nm,kind,off in o.defs: out+=nm+b'\0'+bytes([kind]); u16(off)
  41. u16(len(o.refs))
  42. for nm,kind,off in o.refs: out+=nm+b'\0'; u16(kind); u16(off)
  43. u16(len(o.res))
  44. for nm,sz in o.res: out+=nm+b'\0'; u16(sz)
  45. out+=o.trailing
  46. return bytes(out)
  47. def pn(b): return ''.join(chr(c) if 32<=c<127 else '<%02x>'%c for c in b)
  48. if __name__=='__main__':
  49. import sys
  50. for f in sys.argv[1:]:
  51. d=open(f,'rb').read(); o=Obj.parse(d)
  52. assert o.build()==d,'roundtrip mismatch '+f
  53. print(f,'code',len(o.code),'reloc',len(o.reloc),'defs',[(pn(a),b,hex(c)) for a,b,c in o.defs],'refs',len(o.refs),'res',o.res,'trail',len(o.trailing))

Powered by TurnKey Linux.