__init__.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from types import *
  2. from constants import *
  3. from ctypes import *
  4. lelf=CDLL("libelf.so.1")
  5. __all__ = []
  6. all_objs = []
  7. class ElfError(Exception):
  8. def __init__(self, msg):
  9. self.msg = msg
  10. self.errno = elf_errno()
  11. self.elfmsg = elf_errmsg(self.errno)
  12. def __str__(self):
  13. return "ElfError(%d, %s): %s" % (self.errno, self.elfmsg, self.msg)
  14. __all__.append("ElfError")
  15. def nonNullDec(f):
  16. def decorated(*args):
  17. res = f(*args)
  18. try:
  19. a = res.contents
  20. all_objs.append(res)
  21. except ValueError: # NULL
  22. raise ElfError(f.__name__ + " returned NULL")
  23. return res
  24. return decorated
  25. def nonNegDec(f):
  26. def decorated(*args):
  27. res = f(*args)
  28. if 0 > res:
  29. raise ElfError(f.__name__ + " returned %d" % (res,))
  30. return res
  31. return decorated
  32. def badValDec(badVal):
  33. def decorator(f):
  34. def decorated(*args):
  35. res = f(*args)
  36. if res == badVal:
  37. raise ElfError(f.__name__ + " returned %s" % (str(res),))
  38. return res
  39. return decorated
  40. return decorator
  41. def define(f, argtypes, restype, err_decorator = None):
  42. f.argtypes = argtypes
  43. f.restype = restype
  44. name = f.__name__
  45. __all__.append(name)
  46. if (err_decorator != None):
  47. f = err_decorator(f)
  48. globals()[name] = f
  49. define(lelf.elf_version, [ c_int ], c_int )
  50. if (elf_version(EV_CURRENT) == EV_NONE):
  51. raise Exception("Version mismatch")
  52. off_t = c_size_t # TODO(dbounov): Figure out actual off_t type
  53. define(lelf.elf_begin, [ c_int, Elf_Cmd, ElfP ], ElfP)
  54. define(lelf.elf_getident, [ ElfP, POINTER(c_int) ], POINTER(Elf_IdentT), nonNullDec)
  55. define(lelf.elf_end, [ ElfP ], c_int, nonNegDec )
  56. define(lelf.elf_cntl, [ ElfP, c_int ], c_int, nonNegDec)
  57. define(lelf.elf_errmsg, [ c_int ], c_char_p)
  58. define(lelf.elf_errno, [ ], c_int)
  59. define(lelf.elf_fill, [ c_int ], None)
  60. define(lelf.elf_flagdata, [ Elf_DataP, c_int, c_uint ], c_uint)
  61. define(lelf.elf_flagehdr, [ ElfP, c_int, c_uint ], c_uint)
  62. define(lelf.elf_flagelf, [ ElfP, c_int, c_uint ], c_uint)
  63. define(lelf.elf_flagphdr, [ ElfP, c_int, c_uint ], c_uint)
  64. define(lelf.elf_flagscn, [ Elf_ScnP, c_int, c_uint ], c_uint)
  65. define(lelf.elf_flagshdr, [ Elf_ScnP, c_int, c_uint ], c_uint)
  66. define(lelf.elf_getarhdr, [ ElfP ], POINTER(Elf_Arhdr))
  67. #define(lelf.elf_getarsym, [ ], )
  68. define(lelf.elf_getbase, [ ElfP ], off_t, nonNegDec)
  69. define(lelf.elf_getdata, [ Elf_ScnP, Elf_DataP ], Elf_DataP)
  70. define(lelf.elf_getscn, [ ElfP, c_size_t ], Elf_ScnP, nonNullDec )
  71. define(lelf.elf_getshnum, [ ElfP, POINTER(c_size_t) ], c_int, nonNegDec )
  72. define(lelf.elf_getshstrndx, [ ElfP, POINTER(c_size_t) ], c_int, nonNegDec )
  73. define(lelf.elf_hash, [ c_char_p ], c_ulong)
  74. define(lelf.elf_kind, [ ElfP ], c_int )
  75. define(lelf.elf_memory, [ POINTER(c_char), c_size_t ], ElfP, nonNullDec)
  76. define(lelf.elf_ndxscn, [ Elf_ScnP ], c_size_t, badValDec(SHN_UNDEF))
  77. define(lelf.elf_newdata, [ Elf_ScnP ], Elf_DataP, nonNullDec)
  78. define(lelf.elf_newscn, [ ElfP ], Elf_ScnP, nonNullDec)
  79. #define(lelf.elf_next, [ ], )
  80. define(lelf.elf_nextscn, [ ElfP, Elf_ScnP ], Elf_ScnP)
  81. #define(lelf.elf_rand, [ ], )
  82. define(lelf.elf_rawdata, [ Elf_ScnP, Elf_DataP ], Elf_DataP)
  83. #define(lelf.elf_rawfile, [ ], )
  84. define(lelf.elf_strptr, [ ElfP, c_size_t, c_size_t ], c_char_p)
  85. define(lelf.elf_update, [ ElfP, c_int], off_t, nonNegDec)
  86. define(lelf.elf32_checksum, [ ElfP ], c_long)
  87. define(lelf.elf32_fsize, [ c_int, c_size_t, c_uint ], c_size_t, nonNegDec)
  88. define(lelf.elf32_getehdr, [ ElfP ], POINTER(Elf32_Ehdr), nonNullDec)
  89. define(lelf.elf32_getphdr, [ ElfP ], POINTER(Elf32_Phdr), nonNullDec)
  90. define(lelf.elf32_getshdr, [ Elf_ScnP ], POINTER(Elf32_Shdr), nonNullDec)
  91. define(lelf.elf32_newehdr, [ ElfP ], POINTER(Elf32_Ehdr), nonNullDec)
  92. define(lelf.elf32_newphdr, [ ElfP, c_size_t ], POINTER(Elf32_Phdr), nonNullDec)
  93. define(lelf.elf32_xlatetof, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec)
  94. define(lelf.elf32_xlatetom, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec)
  95. define(lelf.elf64_checksum, [ ElfP ], c_long )
  96. define(lelf.elf64_fsize, [ c_int, c_size_t, c_uint ], c_size_t, nonNegDec)
  97. define(lelf.elf64_getehdr,[ ElfP ], POINTER(Elf64_Ehdr), nonNullDec)
  98. define(lelf.elf64_getphdr, [ ElfP ], POINTER(Elf64_Phdr), nonNullDec)
  99. define(lelf.elf64_getshdr, [ Elf_ScnP ], POINTER(Elf64_Shdr), nonNullDec)
  100. define(lelf.elf64_newehdr, [ ElfP ], POINTER(Elf64_Ehdr), nonNullDec)
  101. define(lelf.elf64_newphdr, [ ElfP, c_size_t ], POINTER(Elf64_Phdr), nonNullDec)
  102. define(lelf.elf64_xlatetof, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec)
  103. define(lelf.elf64_xlatetom, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec)
  104. # NOTE(dbounov): Ignoring gelf functions for now
  105. #define(lelf.gelf_checksum, [ ], )
  106. #define(lelf.gelf_fsize, [ ], )
  107. #define(lelf.gelf_getcap, [ ], )
  108. #define(lelf.gelf_getclass, [ ], )
  109. #define(lelf.gelf_getdyn, [ ], )
  110. #define(lelf.gelf_getehdr, [ ], )
  111. #define(lelf.gelf_getmove, [ ], )
  112. #define(lelf.gelf_getphdr, [ ], )
  113. #define(lelf.gelf_getrel, [ ], )
  114. #define(lelf.gelf_getrela, [ ], )
  115. #define(lelf.gelf_getshdr, [ ], )
  116. #define(lelf.gelf_getsym, [ ], )
  117. #define(lelf.gelf_getsyminfo, [ ], )
  118. #define(lelf.gelf_getsymshndx, [ ], )
  119. #define(lelf.gelf_newehdr, [ ], )
  120. #define(lelf.gelf_newphdr, [ ], )
  121. #define(lelf.gelf_update_cap, [ ], )
  122. #define(lelf.gelf_update_dyn, [ ], )
  123. #define(lelf.gelf_update_ehdr, [ ], )
  124. #define(lelf.gelf_update_move, [ ], )
  125. #define(lelf.gelf_update_phdr, [ ], )
  126. #define(lelf.gelf_update_rel, [ ], )
  127. #define(lelf.gelf_update_rela, [ ], )
  128. #define(lelf.gelf_update_shdr, [ ], )
  129. #define(lelf.gelf_update_sym, [ ], )
  130. #define(lelf.gelf_update_symshndx, [ ], )
  131. #define(lelf.gelf_update_syminfo, [ ], )
  132. #define(lelf.gelf_xlatetof, [ ], )
  133. #define(lelf.gelf_xlatetom, [ ], )
  134. #define(lelf.nlist, [ ], )