Home | History | Annotate | Download | only in Inputs
      1 #!/usr/bin/env python
      2 
      3 # Generates ELF, COFF and MachO object files for different architectures
      4 # containing all relocations:
      5 #
      6 # ELF:   i386, x86_64, ppc64, aarch64, arm, mips, mips64el
      7 # COFF:  i386, x86_64
      8 # MachO: i386, x86_64, arm
      9 # (see end of file for triples)
     10 #
     11 # To simplify generation, object files are generated with just the proper
     12 # number of relocations through repeated instructions. Afterwards, the
     13 # relocations in the object file are patched to their proper value.
     14 
     15 import operator
     16 import shutil
     17 import StringIO
     18 import struct
     19 import subprocess
     20 import sys
     21 
     22 class EnumType(type):
     23   def __init__(self, name, bases = (), attributes = {}):
     24     super(EnumType, self).__init__(name, bases, attributes)
     25 
     26     type.__setattr__(self, '_map', {})
     27     type.__setattr__(self, '_nameMap', {})
     28 
     29     for symbol in attributes:
     30       if symbol.startswith('__') or symbol.endswith('__'):
     31         continue
     32 
     33       value = attributes[symbol]
     34 
     35       # MyEnum.symbol == value
     36       type.__setattr__(self, symbol, value)
     37       self._nameMap[symbol] = value
     38 
     39       # The first symbol with the given value is authoritative.
     40       if not (value in self._map):
     41         # MyEnum[value] == symbol
     42         self._map[value] = symbol
     43 
     44   # Not supported (Enums are immutable).
     45   def __setattr__(self, name, value):
     46     raise NotSupportedException, self.__setattr__
     47 
     48   # Not supported (Enums are immutable).
     49   def __delattr__(self, name):
     50     raise NotSupportedException, self.__delattr__
     51 
     52   # Gets the enum symbol for the specified value.
     53   def __getitem__(self, value):
     54     symbol = self._map.get(value)
     55     if symbol is None:
     56       raise KeyError, value
     57     return symbol
     58 
     59   # Gets the enum symbol for the specified value or none.
     60   def lookup(self, value):
     61     symbol = self._map.get(value)
     62     return symbol
     63 
     64   # Not supported (Enums are immutable).
     65   def __setitem__(self, value, symbol):
     66     raise NotSupportedException, self.__setitem__
     67 
     68   # Not supported (Enums are immutable).
     69   def __delitem__(self, value):
     70     raise NotSupportedException, self.__delitem__
     71 
     72   def entries(self):
     73     # sort by (value, name)
     74     def makeKey(item):
     75       return (item[1], item[0])
     76     e = []
     77     for pair in sorted(self._nameMap.iteritems(), key=makeKey):
     78       e.append(pair)
     79     return e
     80 
     81   def __iter__(self):
     82     for e in self.entries():
     83       yield e
     84 
     85 Enum = EnumType('Enum', (), {})
     86 
     87 class BinaryReader:
     88   def __init__(self, path):
     89     self.file = open(path, "r+b", 0)
     90     self.isLSB = None
     91     self.is64Bit = None
     92     self.isN64 = False
     93 
     94   def tell(self):
     95     return self.file.tell()
     96 
     97   def seek(self, pos):
     98     self.file.seek(pos)
     99 
    100   def read(self, N):
    101     data = self.file.read(N)
    102     if len(data) != N:
    103       raise ValueError, "Out of data!"
    104     return data
    105 
    106   def int8(self):
    107     return ord(self.read(1))
    108 
    109   def uint8(self):
    110     return ord(self.read(1))
    111 
    112   def int16(self):
    113     return struct.unpack('><'[self.isLSB] + 'h', self.read(2))[0]
    114 
    115   def uint16(self):
    116     return struct.unpack('><'[self.isLSB] + 'H', self.read(2))[0]
    117 
    118   def int32(self):
    119     return struct.unpack('><'[self.isLSB] + 'i', self.read(4))[0]
    120 
    121   def uint32(self):
    122     return struct.unpack('><'[self.isLSB] + 'I', self.read(4))[0]
    123 
    124   def int64(self):
    125     return struct.unpack('><'[self.isLSB] + 'q', self.read(8))[0]
    126 
    127   def uint64(self):
    128     return struct.unpack('><'[self.isLSB] + 'Q', self.read(8))[0]
    129 
    130   def writeUInt8(self, value):
    131     self.file.write(struct.pack('><'[self.isLSB] + 'B', value))
    132 
    133   def writeUInt16(self, value):
    134     self.file.write(struct.pack('><'[self.isLSB] + 'H', value))
    135 
    136   def writeUInt32(self, value):
    137     self.file.write(struct.pack('><'[self.isLSB] + 'I', value))
    138 
    139   def writeUInt64(self, value):
    140     self.file.write(struct.pack('><'[self.isLSB] + 'Q', value))
    141 
    142   def word(self):
    143     if self.is64Bit:
    144       return self.uint64()
    145     else:
    146       return self.uint32()
    147 
    148   def writeWord(self, value):
    149     if self.is64Bit:
    150       self.writeUInt64(value)
    151     else:
    152       self.writeUInt32(value)
    153 
    154 class StringTable:
    155   def __init__(self, strings):
    156     self.string_table = strings
    157 
    158   def __getitem__(self, index):
    159     end = self.string_table.index('\x00', index)
    160     return self.string_table[index:end]
    161 
    162 class ElfSection:
    163   def __init__(self, f):
    164     self.sh_name = f.uint32()
    165     self.sh_type = f.uint32()
    166     self.sh_flags = f.word()
    167     self.sh_addr = f.word()
    168     self.sh_offset = f.word()
    169     self.sh_size = f.word()
    170     self.sh_link = f.uint32()
    171     self.sh_info = f.uint32()
    172     self.sh_addralign = f.word()
    173     self.sh_entsize = f.word()
    174 
    175   def patch(self, f, relocs):
    176     if self.sh_type == 4 or self.sh_type == 9: # SHT_RELA / SHT_REL
    177       self.patchRelocs(f, relocs)
    178 
    179   def patchRelocs(self, f, relocs):
    180     entries = self.sh_size // self.sh_entsize
    181 
    182     for index in range(entries):
    183       f.seek(self.sh_offset + index * self.sh_entsize)
    184       r_offset = f.word()
    185 
    186       if index < len(relocs):
    187         ri = index
    188       else:
    189         ri = 0
    190 
    191       if f.isN64:
    192         r_sym =   f.uint32()
    193         r_ssym =  f.uint8()
    194         f.seek(f.tell())
    195         f.writeUInt8(relocs[ri][1])
    196         f.writeUInt8(relocs[ri][1])
    197         f.writeUInt8(relocs[ri][1])
    198       else:
    199         pos = f.tell()
    200         r_info = f.word()
    201 
    202         r_type = relocs[ri][1]
    203         if f.is64Bit:
    204           r_info = (r_info & 0xFFFFFFFF00000000) | (r_type & 0xFFFFFFFF)
    205         else:
    206           r_info = (r_info & 0xFF00) | (r_type & 0xFF)
    207 
    208         print("    %s" % relocs[ri][0])
    209         f.seek(pos)
    210         f.writeWord(r_info)
    211 
    212 
    213 class CoffSection:
    214   def __init__(self, f):
    215     self.raw_name                = f.read(8)
    216     self.virtual_size            = f.uint32()
    217     self.virtual_address         = f.uint32()
    218     self.raw_data_size           = f.uint32()
    219     self.pointer_to_raw_data     = f.uint32()
    220     self.pointer_to_relocations  = f.uint32()
    221     self.pointer_to_line_numbers = f.uint32()
    222     self.relocation_count        = f.uint16()
    223     self.line_number_count       = f.uint16()
    224     self.characteristics         = f.uint32()
    225 
    226 
    227 def compileAsm(filename, triple, src):
    228   cmd = ["llvm-mc", "-triple=" + triple, "-filetype=obj", "-o", filename]
    229   print("  Running: " + " ".join(cmd))
    230   p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
    231   p.communicate(input=src)
    232   p.wait()
    233 
    234 def compileIR(filename, triple, src):
    235   cmd = ["llc", "-mtriple=" + triple, "-filetype=obj", "-o", filename]
    236   print("  Running: " + " ".join(cmd))
    237   p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
    238   p.communicate(input=src)
    239   p.wait()
    240 
    241 
    242 def craftElf(filename, triple, relocs, dummyReloc):
    243   print("Crafting " + filename + " for " + triple)
    244   if type(dummyReloc) is tuple:
    245     preSrc, dummyReloc, relocsPerDummy = dummyReloc
    246     src = preSrc + "\n"
    247     for i in range((len(relocs) + relocsPerDummy - 1) / relocsPerDummy):
    248       src += dummyReloc.format(i) + "\n"
    249     compileIR(filename, triple, src)
    250   else:
    251     src = (dummyReloc + "\n") * len(relocs)
    252     compileAsm(filename, triple, src)
    253 
    254   print("  Patching relocations...")
    255   patchElf(filename, relocs)
    256 
    257 def patchElf(path, relocs):
    258   f = BinaryReader(path)
    259 
    260   magic = f.read(4)
    261   assert magic == '\x7FELF'
    262 
    263   fileclass = f.uint8()
    264   if fileclass == 1:
    265     f.is64Bit = False
    266   elif fileclass == 2:
    267     f.is64Bit = True
    268   else:
    269     raise ValueError, "Unknown file class %x" % fileclass
    270 
    271   byteordering = f.uint8()
    272   if byteordering == 1:
    273       f.isLSB = True
    274   elif byteordering == 2:
    275       f.isLSB = False
    276   else:
    277       raise ValueError, "Unknown byte ordering %x" % byteordering
    278 
    279   f.seek(18)
    280   e_machine = f.uint16()
    281   if e_machine == 0x0008 and f.is64Bit: # EM_MIPS && 64 bit
    282       f.isN64 = True
    283 
    284   e_version = f.uint32()
    285   e_entry = f.word()
    286   e_phoff = f.word()
    287   e_shoff = f.word()
    288   e_flags = f.uint32()
    289   e_ehsize = f.uint16()
    290   e_phentsize = f.uint16()
    291   e_phnum = f.uint16()
    292   e_shentsize = f.uint16()
    293   e_shnum = f.uint16()
    294   e_shstrndx = f.uint16()
    295 
    296   sections = []
    297   for index in range(e_shnum):
    298     f.seek(e_shoff + index * e_shentsize)
    299     s = ElfSection(f)
    300     sections.append(s)
    301 
    302   f.seek(sections[e_shstrndx].sh_offset)
    303   shstrtab = StringTable(f.read(sections[e_shstrndx].sh_size))
    304 
    305   strtab = None
    306   for section in sections:
    307     if shstrtab[section.sh_name] == ".strtab":
    308       f.seek(section.sh_offset)
    309       strtab = StringTable(f.read(section.sh_size))
    310       break
    311 
    312   for index in range(e_shnum):
    313     sections[index].patch(f, relocs)
    314 
    315 
    316 def craftCoff(filename, triple, relocs, dummyReloc):
    317   print("Crafting " + filename + " for " + triple)
    318   src = (dummyReloc + "\n") * len(relocs)
    319   compileAsm(filename, triple, src)
    320 
    321   print("  Patching relocations...")
    322   patchCoff(filename, relocs)
    323 
    324 def patchCoff(path, relocs):
    325   f = BinaryReader(path)
    326   f.isLSB = True
    327 
    328   machine_type            = f.uint16()
    329   section_count           = f.uint16()
    330 
    331   # Zero out timestamp to prevent churn when regenerating COFF files.
    332   f.writeUInt32(0)
    333 
    334   f.seek(20)
    335   sections = [CoffSection(f) for idx in range(section_count)]
    336 
    337   section = sections[0]
    338   f.seek(section.pointer_to_relocations)
    339   for i in range(section.relocation_count):
    340     virtual_addr = f.uint32()
    341     symtab_idx   = f.uint32()
    342     print("    %s" % relocs[i][0])
    343     f.writeUInt16(relocs[i][1])
    344 
    345 
    346 def craftMacho(filename, triple, relocs, dummyReloc):
    347   print("Crafting " + filename + " for " + triple)
    348 
    349   if type(dummyReloc) is tuple:
    350     srcType, preSrc, dummyReloc, relocsPerDummy = dummyReloc
    351     src = preSrc + "\n"
    352     for i in range((len(relocs) + relocsPerDummy - 1) / relocsPerDummy):
    353       src += dummyReloc.format(i) + "\n"
    354     if srcType == "asm":
    355       compileAsm(filename, triple, src)
    356     elif srcType == "ir":
    357       compileIR(filename, triple, src)
    358   else:
    359     src = (dummyReloc + "\n") * len(relocs)
    360     compileAsm(filename, triple, src)
    361 
    362   print("  Patching relocations...")
    363   patchMacho(filename, relocs)
    364 
    365 def patchMacho(filename, relocs):
    366   f = BinaryReader(filename)
    367 
    368   magic = f.read(4)
    369   if magic == '\xFE\xED\xFA\xCE':
    370     f.isLSB, f.is64Bit = False, False
    371   elif magic == '\xCE\xFA\xED\xFE':
    372     f.isLSB, f.is64Bit = True, False
    373   elif magic == '\xFE\xED\xFA\xCF':
    374     f.isLSB, f.is64Bit = False, True
    375   elif magic == '\xCF\xFA\xED\xFE':
    376     f.isLSB, f.is64Bit = True, True
    377   else:
    378     raise ValueError,"Not a Mach-O object file: %r (bad magic)" % path
    379 
    380   cputype = f.uint32()
    381   cpusubtype = f.uint32()
    382   filetype = f.uint32()
    383   numLoadCommands = f.uint32()
    384   loadCommandsSize = f.uint32()
    385   flag = f.uint32()
    386   if f.is64Bit:
    387     reserved = f.uint32()
    388 
    389   start = f.tell()
    390 
    391   for i in range(numLoadCommands):
    392     patchMachoLoadCommand(f, relocs)
    393 
    394   if f.tell() - start != loadCommandsSize:
    395     raise ValueError,"%s: warning: invalid load commands size: %r" % (
    396       sys.argv[0], loadCommandsSize)
    397 
    398 def patchMachoLoadCommand(f, relocs):
    399   start = f.tell()
    400   cmd = f.uint32()
    401   cmdSize = f.uint32()
    402 
    403   if cmd == 1:
    404     patchMachoSegmentLoadCommand(f, relocs)
    405   elif cmd == 25:
    406     patchMachoSegmentLoadCommand(f, relocs)
    407   else:
    408     f.read(cmdSize - 8)
    409 
    410   if f.tell() - start != cmdSize:
    411     raise ValueError,"%s: warning: invalid load command size: %r" % (
    412       sys.argv[0], cmdSize)
    413 
    414 def patchMachoSegmentLoadCommand(f, relocs):
    415   segment_name = f.read(16)
    416   vm_addr = f.word()
    417   vm_size = f.word()
    418   file_offset = f.word()
    419   file_size = f.word()
    420   maxprot = f.uint32()
    421   initprot = f.uint32()
    422   numSections = f.uint32()
    423   flags = f.uint32()
    424   for i in range(numSections):
    425     patchMachoSection(f, relocs)
    426 
    427 def patchMachoSection(f, relocs):
    428   section_name = f.read(16)
    429   segment_name = f.read(16)
    430   address = f.word()
    431   size = f.word()
    432   offset = f.uint32()
    433   alignment = f.uint32()
    434   relocOffset = f.uint32()
    435   numReloc = f.uint32()
    436   flags = f.uint32()
    437   reserved1 = f.uint32()
    438   reserved2 = f.uint32()
    439   if f.is64Bit:
    440     reserved3 = f.uint32()
    441 
    442   prev_pos = f.tell()
    443 
    444   f.seek(relocOffset)
    445   for i in range(numReloc):
    446     ri = i < len(relocs) and i or 0
    447     print("    %s" % relocs[ri][0])
    448     word1 = f.uint32()
    449     pos = f.tell()
    450     value = f.uint32()
    451     f.seek(pos)
    452     value = (value & 0x0FFFFFFF) | ((relocs[ri][1] & 0xF) << 28)
    453     f.writeUInt32(value)
    454   f.seek(prev_pos)
    455 
    456 
    457 class Relocs_Elf_X86_64(Enum):
    458   R_X86_64_NONE       = 0
    459   R_X86_64_64         = 1
    460   R_X86_64_PC32       = 2
    461   R_X86_64_GOT32      = 3
    462   R_X86_64_PLT32      = 4
    463   R_X86_64_COPY       = 5
    464   R_X86_64_GLOB_DAT   = 6
    465   R_X86_64_JUMP_SLOT  = 7
    466   R_X86_64_RELATIVE   = 8
    467   R_X86_64_GOTPCREL   = 9
    468   R_X86_64_32         = 10
    469   R_X86_64_32S        = 11
    470   R_X86_64_16         = 12
    471   R_X86_64_PC16       = 13
    472   R_X86_64_8          = 14
    473   R_X86_64_PC8        = 15
    474   R_X86_64_DTPMOD64   = 16
    475   R_X86_64_DTPOFF64   = 17
    476   R_X86_64_TPOFF64    = 18
    477   R_X86_64_TLSGD      = 19
    478   R_X86_64_TLSLD      = 20
    479   R_X86_64_DTPOFF32   = 21
    480   R_X86_64_GOTTPOFF   = 22
    481   R_X86_64_TPOFF32    = 23
    482   R_X86_64_PC64       = 24
    483   R_X86_64_GOTOFF64   = 25
    484   R_X86_64_GOTPC32    = 26
    485   R_X86_64_GOT64      = 27
    486   R_X86_64_GOTPCREL64 = 28
    487   R_X86_64_GOTPC64    = 29
    488   R_X86_64_GOTPLT64   = 30
    489   R_X86_64_PLTOFF64   = 31
    490   R_X86_64_SIZE32     = 32
    491   R_X86_64_SIZE64     = 33
    492   R_X86_64_GOTPC32_TLSDESC = 34
    493   R_X86_64_TLSDESC_CALL    = 35
    494   R_X86_64_TLSDESC    = 36
    495   R_X86_64_IRELATIVE  = 37
    496 
    497 class Relocs_Elf_i386(Enum):
    498   R_386_NONE          = 0
    499   R_386_32            = 1
    500   R_386_PC32          = 2
    501   R_386_GOT32         = 3
    502   R_386_PLT32         = 4
    503   R_386_COPY          = 5
    504   R_386_GLOB_DAT      = 6
    505   R_386_JUMP_SLOT     = 7
    506   R_386_RELATIVE      = 8
    507   R_386_GOTOFF        = 9
    508   R_386_GOTPC         = 10
    509   R_386_32PLT         = 11
    510   R_386_TLS_TPOFF     = 14
    511   R_386_TLS_IE        = 15
    512   R_386_TLS_GOTIE     = 16
    513   R_386_TLS_LE        = 17
    514   R_386_TLS_GD        = 18
    515   R_386_TLS_LDM       = 19
    516   R_386_16            = 20
    517   R_386_PC16          = 21
    518   R_386_8             = 22
    519   R_386_PC8           = 23
    520   R_386_TLS_GD_32     = 24
    521   R_386_TLS_GD_PUSH   = 25
    522   R_386_TLS_GD_CALL   = 26
    523   R_386_TLS_GD_POP    = 27
    524   R_386_TLS_LDM_32    = 28
    525   R_386_TLS_LDM_PUSH  = 29
    526   R_386_TLS_LDM_CALL  = 30
    527   R_386_TLS_LDM_POP   = 31
    528   R_386_TLS_LDO_32    = 32
    529   R_386_TLS_IE_32     = 33
    530   R_386_TLS_LE_32     = 34
    531   R_386_TLS_DTPMOD32  = 35
    532   R_386_TLS_DTPOFF32  = 36
    533   R_386_TLS_TPOFF32   = 37
    534   R_386_TLS_GOTDESC   = 39
    535   R_386_TLS_DESC_CALL = 40
    536   R_386_TLS_DESC      = 41
    537   R_386_IRELATIVE     = 42
    538   R_386_NUM           = 43
    539 
    540 class Relocs_Elf_PPC32(Enum):
    541   R_PPC_NONE                  = 0
    542   R_PPC_ADDR32                = 1
    543   R_PPC_ADDR24                = 2
    544   R_PPC_ADDR16                = 3
    545   R_PPC_ADDR16_LO             = 4
    546   R_PPC_ADDR16_HI             = 5
    547   R_PPC_ADDR16_HA             = 6
    548   R_PPC_ADDR14                = 7
    549   R_PPC_ADDR14_BRTAKEN        = 8
    550   R_PPC_ADDR14_BRNTAKEN       = 9
    551   R_PPC_REL24                 = 10
    552   R_PPC_REL14                 = 11
    553   R_PPC_REL14_BRTAKEN         = 12
    554   R_PPC_REL14_BRNTAKEN        = 13
    555   R_PPC_REL32                 = 26
    556   R_PPC_TPREL16_LO            = 70
    557   R_PPC_TPREL16_HA            = 72
    558 
    559 class Relocs_Elf_PPC64(Enum):
    560   R_PPC64_NONE                = 0
    561   R_PPC64_ADDR32              = 1
    562   R_PPC64_ADDR16_LO           = 4
    563   R_PPC64_ADDR16_HI           = 5
    564   R_PPC64_ADDR14              = 7
    565   R_PPC64_REL24               = 10
    566   R_PPC64_REL32               = 26
    567   R_PPC64_ADDR64              = 38
    568   R_PPC64_ADDR16_HIGHER       = 39
    569   R_PPC64_ADDR16_HIGHEST      = 41
    570   R_PPC64_REL64               = 44
    571   R_PPC64_TOC16               = 47
    572   R_PPC64_TOC16_LO            = 48
    573   R_PPC64_TOC16_HA            = 50
    574   R_PPC64_TOC                 = 51
    575   R_PPC64_ADDR16_DS           = 56
    576   R_PPC64_ADDR16_LO_DS        = 57
    577   R_PPC64_TOC16_DS            = 63
    578   R_PPC64_TOC16_LO_DS         = 64
    579   R_PPC64_TLS                 = 67
    580   R_PPC64_TPREL16_LO          = 70
    581   R_PPC64_TPREL16_HA          = 72
    582   R_PPC64_DTPREL16_LO         = 75
    583   R_PPC64_DTPREL16_HA         = 77
    584   R_PPC64_GOT_TLSGD16_LO      = 80
    585   R_PPC64_GOT_TLSGD16_HA      = 82
    586   R_PPC64_GOT_TLSLD16_LO      = 84
    587   R_PPC64_GOT_TLSLD16_HA      = 86
    588   R_PPC64_GOT_TPREL16_LO_DS   = 88
    589   R_PPC64_GOT_TPREL16_HA      = 90
    590   R_PPC64_TLSGD               = 107
    591   R_PPC64_TLSLD               = 108
    592 
    593 class Relocs_Elf_AArch64(Enum):
    594   R_AARCH64_NONE                        = 0
    595   R_AARCH64_ABS64                       = 0x101
    596   R_AARCH64_ABS32                       = 0x102
    597   R_AARCH64_ABS16                       = 0x103
    598   R_AARCH64_PREL64                      = 0x104
    599   R_AARCH64_PREL32                      = 0x105
    600   R_AARCH64_PREL16                      = 0x106
    601   R_AARCH64_MOVW_UABS_G0                = 0x107
    602   R_AARCH64_MOVW_UABS_G0_NC             = 0x108
    603   R_AARCH64_MOVW_UABS_G1                = 0x109
    604   R_AARCH64_MOVW_UABS_G1_NC             = 0x10a
    605   R_AARCH64_MOVW_UABS_G2                = 0x10b
    606   R_AARCH64_MOVW_UABS_G2_NC             = 0x10c
    607   R_AARCH64_MOVW_UABS_G3                = 0x10d
    608   R_AARCH64_MOVW_SABS_G0                = 0x10e
    609   R_AARCH64_MOVW_SABS_G1                = 0x10f
    610   R_AARCH64_MOVW_SABS_G2                = 0x110
    611   R_AARCH64_LD_PREL_LO19                = 0x111
    612   R_AARCH64_ADR_PREL_LO21               = 0x112
    613   R_AARCH64_ADR_PREL_PG_HI21            = 0x113
    614   R_AARCH64_ADR_PREL_PG_HI21_NC         = 0x114
    615   R_AARCH64_ADD_ABS_LO12_NC             = 0x115
    616   R_AARCH64_LDST8_ABS_LO12_NC           = 0x116
    617   R_AARCH64_TSTBR14                     = 0x117
    618   R_AARCH64_CONDBR19                    = 0x118
    619   R_AARCH64_JUMP26                      = 0x11a
    620   R_AARCH64_CALL26                      = 0x11b
    621   R_AARCH64_LDST16_ABS_LO12_NC          = 0x11c
    622   R_AARCH64_LDST32_ABS_LO12_NC          = 0x11d
    623   R_AARCH64_LDST64_ABS_LO12_NC          = 0x11e
    624   R_AARCH64_MOVW_PREL_G0                = 0x11f
    625   R_AARCH64_MOVW_PREL_G0_NC             = 0x120
    626   R_AARCH64_MOVW_PREL_G1                = 0x121
    627   R_AARCH64_MOVW_PREL_G1_NC             = 0x122
    628   R_AARCH64_MOVW_PREL_G2                = 0x123
    629   R_AARCH64_MOVW_PREL_G2_NC             = 0x124
    630   R_AARCH64_MOVW_PREL_G3                = 0x125
    631   R_AARCH64_LDST128_ABS_LO12_NC         = 0x12b
    632   R_AARCH64_MOVW_GOTOFF_G0              = 0x12c
    633   R_AARCH64_MOVW_GOTOFF_G0_NC           = 0x12d
    634   R_AARCH64_MOVW_GOTOFF_G1              = 0x12e
    635   R_AARCH64_MOVW_GOTOFF_G1_NC           = 0x12f
    636   R_AARCH64_MOVW_GOTOFF_G2              = 0x130
    637   R_AARCH64_MOVW_GOTOFF_G2_NC           = 0x131
    638   R_AARCH64_MOVW_GOTOFF_G3              = 0x132
    639   R_AARCH64_GOTREL64                    = 0x133
    640   R_AARCH64_GOTREL32                    = 0x134
    641   R_AARCH64_GOT_LD_PREL19               = 0x135
    642   R_AARCH64_LD64_GOTOFF_LO15            = 0x136
    643   R_AARCH64_ADR_GOT_PAGE                = 0x137
    644   R_AARCH64_LD64_GOT_LO12_NC            = 0x138
    645   R_AARCH64_LD64_GOTPAGE_LO15           = 0x139
    646   R_AARCH64_TLSGD_ADR_PREL21            = 0x200
    647   R_AARCH64_TLSGD_ADR_PAGE21            = 0x201
    648   R_AARCH64_TLSGD_ADD_LO12_NC           = 0x202
    649   R_AARCH64_TLSGD_MOVW_G1               = 0x203
    650   R_AARCH64_TLSGD_MOVW_G0_NC            = 0x204
    651   R_AARCH64_TLSLD_ADR_PREL21            = 0x205
    652   R_AARCH64_TLSLD_ADR_PAGE21            = 0x206
    653   R_AARCH64_TLSLD_ADD_LO12_NC           = 0x207
    654   R_AARCH64_TLSLD_MOVW_G1               = 0x208
    655   R_AARCH64_TLSLD_MOVW_G0_NC            = 0x209
    656   R_AARCH64_TLSLD_LD_PREL19             = 0x20a
    657   R_AARCH64_TLSLD_MOVW_DTPREL_G2        = 0x20b
    658   R_AARCH64_TLSLD_MOVW_DTPREL_G1        = 0x20c
    659   R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC     = 0x20d
    660   R_AARCH64_TLSLD_MOVW_DTPREL_G0        = 0x20e
    661   R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC     = 0x20f
    662   R_AARCH64_TLSLD_ADD_DTPREL_HI12       = 0x210
    663   R_AARCH64_TLSLD_ADD_DTPREL_LO12       = 0x211
    664   R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC    = 0x212
    665   R_AARCH64_TLSLD_LDST8_DTPREL_LO12     = 0x213
    666   R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC  = 0x214
    667   R_AARCH64_TLSLD_LDST16_DTPREL_LO12    = 0x215
    668   R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC = 0x216
    669   R_AARCH64_TLSLD_LDST32_DTPREL_LO12    = 0x217
    670   R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC = 0x218
    671   R_AARCH64_TLSLD_LDST64_DTPREL_LO12    = 0x219
    672   R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC = 0x21a
    673   R_AARCH64_TLSIE_MOVW_GOTTPREL_G1      = 0x21b
    674   R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC   = 0x21c
    675   R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21   = 0x21d
    676   R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 0x21e
    677   R_AARCH64_TLSIE_LD_GOTTPREL_PREL19    = 0x21f
    678   R_AARCH64_TLSLE_MOVW_TPREL_G2         = 0x220
    679   R_AARCH64_TLSLE_MOVW_TPREL_G1         = 0x221
    680   R_AARCH64_TLSLE_MOVW_TPREL_G1_NC      = 0x222
    681   R_AARCH64_TLSLE_MOVW_TPREL_G0         = 0x223
    682   R_AARCH64_TLSLE_MOVW_TPREL_G0_NC      = 0x224
    683   R_AARCH64_TLSLE_ADD_TPREL_HI12        = 0x225
    684   R_AARCH64_TLSLE_ADD_TPREL_LO12        = 0x226
    685   R_AARCH64_TLSLE_ADD_TPREL_LO12_NC     = 0x227
    686   R_AARCH64_TLSLE_LDST8_TPREL_LO12      = 0x228
    687   R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC   = 0x229
    688   R_AARCH64_TLSLE_LDST16_TPREL_LO12     = 0x22a
    689   R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC  = 0x22b
    690   R_AARCH64_TLSLE_LDST32_TPREL_LO12     = 0x22c
    691   R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC  = 0x22d
    692   R_AARCH64_TLSLE_LDST64_TPREL_LO12     = 0x22e
    693   R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC  = 0x22f
    694   R_AARCH64_TLSDESC_LD_PREL19           = 0x230
    695   R_AARCH64_TLSDESC_ADR_PREL21          = 0x231
    696   R_AARCH64_TLSDESC_ADR_PAGE21          = 0x232
    697   R_AARCH64_TLSDESC_LD64_LO12_NC        = 0x233
    698   R_AARCH64_TLSDESC_ADD_LO12_NC         = 0x234
    699   R_AARCH64_TLSDESC_OFF_G1              = 0x235
    700   R_AARCH64_TLSDESC_OFF_G0_NC           = 0x236
    701   R_AARCH64_TLSDESC_LDR                 = 0x237
    702   R_AARCH64_TLSDESC_ADD                 = 0x238
    703   R_AARCH64_TLSDESC_CALL                = 0x239
    704   R_AARCH64_TLSLE_LDST128_TPREL_LO12    = 0x23a
    705   R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC = 0x23b
    706   R_AARCH64_TLSLD_LDST128_DTPREL_LO12   = 0x23c
    707   R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC = 0x23d
    708   R_AARCH64_COPY                        = 0x400
    709   R_AARCH64_GLOB_DAT                    = 0x401
    710   R_AARCH64_JUMP_SLOT                   = 0x402
    711   R_AARCH64_RELATIVE                    = 0x403
    712   R_AARCH64_TLS_DTPREL64                = 0x404
    713   R_AARCH64_TLS_DTPMOD64                = 0x405
    714   R_AARCH64_TLS_TPREL64                 = 0x406
    715   R_AARCH64_TLSDESC                     = 0x407
    716   R_AARCH64_IRELATIVE                   = 0x408
    717 
    718 class Relocs_Elf_ARM(Enum):
    719   R_ARM_NONE                  = 0x00
    720   R_ARM_PC24                  = 0x01
    721   R_ARM_ABS32                 = 0x02
    722   R_ARM_REL32                 = 0x03
    723   R_ARM_LDR_PC_G0             = 0x04
    724   R_ARM_ABS16                 = 0x05
    725   R_ARM_ABS12                 = 0x06
    726   R_ARM_THM_ABS5              = 0x07
    727   R_ARM_ABS8                  = 0x08
    728   R_ARM_SBREL32               = 0x09
    729   R_ARM_THM_CALL              = 0x0a
    730   R_ARM_THM_PC8               = 0x0b
    731   R_ARM_BREL_ADJ              = 0x0c
    732   R_ARM_TLS_DESC              = 0x0d
    733   R_ARM_THM_SWI8              = 0x0e
    734   R_ARM_XPC25                 = 0x0f
    735   R_ARM_THM_XPC22             = 0x10
    736   R_ARM_TLS_DTPMOD32          = 0x11
    737   R_ARM_TLS_DTPOFF32          = 0x12
    738   R_ARM_TLS_TPOFF32           = 0x13
    739   R_ARM_COPY                  = 0x14
    740   R_ARM_GLOB_DAT              = 0x15
    741   R_ARM_JUMP_SLOT             = 0x16
    742   R_ARM_RELATIVE              = 0x17
    743   R_ARM_GOTOFF32              = 0x18
    744   R_ARM_BASE_PREL             = 0x19
    745   R_ARM_GOT_BREL              = 0x1a
    746   R_ARM_PLT32                 = 0x1b
    747   R_ARM_CALL                  = 0x1c
    748   R_ARM_JUMP24                = 0x1d
    749   R_ARM_THM_JUMP24            = 0x1e
    750   R_ARM_BASE_ABS              = 0x1f
    751   R_ARM_ALU_PCREL_7_0         = 0x20
    752   R_ARM_ALU_PCREL_15_8        = 0x21
    753   R_ARM_ALU_PCREL_23_15       = 0x22
    754   R_ARM_LDR_SBREL_11_0_NC     = 0x23
    755   R_ARM_ALU_SBREL_19_12_NC    = 0x24
    756   R_ARM_ALU_SBREL_27_20_CK    = 0x25
    757   R_ARM_TARGET1               = 0x26
    758   R_ARM_SBREL31               = 0x27
    759   R_ARM_V4BX                  = 0x28
    760   R_ARM_TARGET2               = 0x29
    761   R_ARM_PREL31                = 0x2a
    762   R_ARM_MOVW_ABS_NC           = 0x2b
    763   R_ARM_MOVT_ABS              = 0x2c
    764   R_ARM_MOVW_PREL_NC          = 0x2d
    765   R_ARM_MOVT_PREL             = 0x2e
    766   R_ARM_THM_MOVW_ABS_NC       = 0x2f
    767   R_ARM_THM_MOVT_ABS          = 0x30
    768   R_ARM_THM_MOVW_PREL_NC      = 0x31
    769   R_ARM_THM_MOVT_PREL         = 0x32
    770   R_ARM_THM_JUMP19            = 0x33
    771   R_ARM_THM_JUMP6             = 0x34
    772   R_ARM_THM_ALU_PREL_11_0     = 0x35
    773   R_ARM_THM_PC12              = 0x36
    774   R_ARM_ABS32_NOI             = 0x37
    775   R_ARM_REL32_NOI             = 0x38
    776   R_ARM_ALU_PC_G0_NC          = 0x39
    777   R_ARM_ALU_PC_G0             = 0x3a
    778   R_ARM_ALU_PC_G1_NC          = 0x3b
    779   R_ARM_ALU_PC_G1             = 0x3c
    780   R_ARM_ALU_PC_G2             = 0x3d
    781   R_ARM_LDR_PC_G1             = 0x3e
    782   R_ARM_LDR_PC_G2             = 0x3f
    783   R_ARM_LDRS_PC_G0            = 0x40
    784   R_ARM_LDRS_PC_G1            = 0x41
    785   R_ARM_LDRS_PC_G2            = 0x42
    786   R_ARM_LDC_PC_G0             = 0x43
    787   R_ARM_LDC_PC_G1             = 0x44
    788   R_ARM_LDC_PC_G2             = 0x45
    789   R_ARM_ALU_SB_G0_NC          = 0x46
    790   R_ARM_ALU_SB_G0             = 0x47
    791   R_ARM_ALU_SB_G1_NC          = 0x48
    792   R_ARM_ALU_SB_G1             = 0x49
    793   R_ARM_ALU_SB_G2             = 0x4a
    794   R_ARM_LDR_SB_G0             = 0x4b
    795   R_ARM_LDR_SB_G1             = 0x4c
    796   R_ARM_LDR_SB_G2             = 0x4d
    797   R_ARM_LDRS_SB_G0            = 0x4e
    798   R_ARM_LDRS_SB_G1            = 0x4f
    799   R_ARM_LDRS_SB_G2            = 0x50
    800   R_ARM_LDC_SB_G0             = 0x51
    801   R_ARM_LDC_SB_G1             = 0x52
    802   R_ARM_LDC_SB_G2             = 0x53
    803   R_ARM_MOVW_BREL_NC          = 0x54
    804   R_ARM_MOVT_BREL             = 0x55
    805   R_ARM_MOVW_BREL             = 0x56
    806   R_ARM_THM_MOVW_BREL_NC      = 0x57
    807   R_ARM_THM_MOVT_BREL         = 0x58
    808   R_ARM_THM_MOVW_BREL         = 0x59
    809   R_ARM_TLS_GOTDESC           = 0x5a
    810   R_ARM_TLS_CALL              = 0x5b
    811   R_ARM_TLS_DESCSEQ           = 0x5c
    812   R_ARM_THM_TLS_CALL          = 0x5d
    813   R_ARM_PLT32_ABS             = 0x5e
    814   R_ARM_GOT_ABS               = 0x5f
    815   R_ARM_GOT_PREL              = 0x60
    816   R_ARM_GOT_BREL12            = 0x61
    817   R_ARM_GOTOFF12              = 0x62
    818   R_ARM_GOTRELAX              = 0x63
    819   R_ARM_GNU_VTENTRY           = 0x64
    820   R_ARM_GNU_VTINHERIT         = 0x65
    821   R_ARM_THM_JUMP11            = 0x66
    822   R_ARM_THM_JUMP8             = 0x67
    823   R_ARM_TLS_GD32              = 0x68
    824   R_ARM_TLS_LDM32             = 0x69
    825   R_ARM_TLS_LDO32             = 0x6a
    826   R_ARM_TLS_IE32              = 0x6b
    827   R_ARM_TLS_LE32              = 0x6c
    828   R_ARM_TLS_LDO12             = 0x6d
    829   R_ARM_TLS_LE12              = 0x6e
    830   R_ARM_TLS_IE12GP            = 0x6f
    831   R_ARM_PRIVATE_0             = 0x70
    832   R_ARM_PRIVATE_1             = 0x71
    833   R_ARM_PRIVATE_2             = 0x72
    834   R_ARM_PRIVATE_3             = 0x73
    835   R_ARM_PRIVATE_4             = 0x74
    836   R_ARM_PRIVATE_5             = 0x75
    837   R_ARM_PRIVATE_6             = 0x76
    838   R_ARM_PRIVATE_7             = 0x77
    839   R_ARM_PRIVATE_8             = 0x78
    840   R_ARM_PRIVATE_9             = 0x79
    841   R_ARM_PRIVATE_10            = 0x7a
    842   R_ARM_PRIVATE_11            = 0x7b
    843   R_ARM_PRIVATE_12            = 0x7c
    844   R_ARM_PRIVATE_13            = 0x7d
    845   R_ARM_PRIVATE_14            = 0x7e
    846   R_ARM_PRIVATE_15            = 0x7f
    847   R_ARM_ME_TOO                = 0x80
    848   R_ARM_THM_TLS_DESCSEQ16     = 0x81
    849   R_ARM_THM_TLS_DESCSEQ32     = 0x82
    850   R_ARM_IRELATIVE             = 0xa0
    851 
    852 class Relocs_Elf_Mips(Enum):
    853   R_MIPS_NONE              =  0
    854   R_MIPS_16                =  1
    855   R_MIPS_32                =  2
    856   R_MIPS_REL32             =  3
    857   R_MIPS_26                =  4
    858   R_MIPS_HI16              =  5
    859   R_MIPS_LO16              =  6
    860   R_MIPS_GPREL16           =  7
    861   R_MIPS_LITERAL           =  8
    862   R_MIPS_GOT16             =  9
    863   R_MIPS_PC16              = 10
    864   R_MIPS_CALL16            = 11
    865   R_MIPS_GPREL32           = 12
    866   R_MIPS_SHIFT5            = 16
    867   R_MIPS_SHIFT6            = 17
    868   R_MIPS_64                = 18
    869   R_MIPS_GOT_DISP          = 19
    870   R_MIPS_GOT_PAGE          = 20
    871   R_MIPS_GOT_OFST          = 21
    872   R_MIPS_GOT_HI16          = 22
    873   R_MIPS_GOT_LO16          = 23
    874   R_MIPS_SUB               = 24
    875   R_MIPS_INSERT_A          = 25
    876   R_MIPS_INSERT_B          = 26
    877   R_MIPS_DELETE            = 27
    878   R_MIPS_HIGHER            = 28
    879   R_MIPS_HIGHEST           = 29
    880   R_MIPS_CALL_HI16         = 30
    881   R_MIPS_CALL_LO16         = 31
    882   R_MIPS_SCN_DISP          = 32
    883   R_MIPS_REL16             = 33
    884   R_MIPS_ADD_IMMEDIATE     = 34
    885   R_MIPS_PJUMP             = 35
    886   R_MIPS_RELGOT            = 36
    887   R_MIPS_JALR              = 37
    888   R_MIPS_TLS_DTPMOD32      = 38
    889   R_MIPS_TLS_DTPREL32      = 39
    890   R_MIPS_TLS_DTPMOD64      = 40
    891   R_MIPS_TLS_DTPREL64      = 41
    892   R_MIPS_TLS_GD            = 42
    893   R_MIPS_TLS_LDM           = 43
    894   R_MIPS_TLS_DTPREL_HI16   = 44
    895   R_MIPS_TLS_DTPREL_LO16   = 45
    896   R_MIPS_TLS_GOTTPREL      = 46
    897   R_MIPS_TLS_TPREL32       = 47
    898   R_MIPS_TLS_TPREL64       = 48
    899   R_MIPS_TLS_TPREL_HI16    = 49
    900   R_MIPS_TLS_TPREL_LO16    = 50
    901   R_MIPS_GLOB_DAT          = 51
    902   R_MIPS_COPY              = 126
    903   R_MIPS_JUMP_SLOT         = 127
    904   R_MIPS_NUM               = 218
    905 
    906 class Relocs_Elf_Hexagon(Enum):
    907   R_HEX_NONE              =  0
    908   R_HEX_B22_PCREL         =  1
    909   R_HEX_B15_PCREL         =  2
    910   R_HEX_B7_PCREL          =  3
    911   R_HEX_LO16              =  4
    912   R_HEX_HI16              =  5
    913   R_HEX_32                =  6
    914   R_HEX_16                =  7
    915   R_HEX_8                 =  8
    916   R_HEX_GPREL16_0         =  9
    917   R_HEX_GPREL16_1         =  10
    918   R_HEX_GPREL16_2         =  11
    919   R_HEX_GPREL16_3         =  12
    920   R_HEX_HL16              =  13
    921   R_HEX_B13_PCREL         =  14
    922   R_HEX_B9_PCREL          =  15
    923   R_HEX_B32_PCREL_X       =  16
    924   R_HEX_32_6_X            =  17
    925   R_HEX_B22_PCREL_X       =  18
    926   R_HEX_B15_PCREL_X       =  19
    927   R_HEX_B13_PCREL_X       =  20
    928   R_HEX_B9_PCREL_X        =  21
    929   R_HEX_B7_PCREL_X        =  22
    930   R_HEX_16_X              =  23
    931   R_HEX_12_X              =  24
    932   R_HEX_11_X              =  25
    933   R_HEX_10_X              =  26
    934   R_HEX_9_X               =  27
    935   R_HEX_8_X               =  28
    936   R_HEX_7_X               =  29
    937   R_HEX_6_X               =  30
    938   R_HEX_32_PCREL          =  31
    939   R_HEX_COPY              =  32
    940   R_HEX_GLOB_DAT          =  33
    941   R_HEX_JMP_SLOT          =  34
    942   R_HEX_RELATIVE          =  35
    943   R_HEX_PLT_B22_PCREL     =  36
    944   R_HEX_GOTREL_LO16       =  37
    945   R_HEX_GOTREL_HI16       =  38
    946   R_HEX_GOTREL_32         =  39
    947   R_HEX_GOT_LO16          =  40
    948   R_HEX_GOT_HI16          =  41
    949   R_HEX_GOT_32            =  42
    950   R_HEX_GOT_16            =  43
    951   R_HEX_DTPMOD_32         =  44
    952   R_HEX_DTPREL_LO16       =  45
    953   R_HEX_DTPREL_HI16       =  46
    954   R_HEX_DTPREL_32         =  47
    955   R_HEX_DTPREL_16         =  48
    956   R_HEX_GD_PLT_B22_PCREL  =  49
    957   R_HEX_GD_GOT_LO16       =  50
    958   R_HEX_GD_GOT_HI16       =  51
    959   R_HEX_GD_GOT_32         =  52
    960   R_HEX_GD_GOT_16         =  53
    961   R_HEX_IE_LO16           =  54
    962   R_HEX_IE_HI16           =  55
    963   R_HEX_IE_32             =  56
    964   R_HEX_IE_GOT_LO16       =  57
    965   R_HEX_IE_GOT_HI16       =  58
    966   R_HEX_IE_GOT_32         =  59
    967   R_HEX_IE_GOT_16         =  60
    968   R_HEX_TPREL_LO16        =  61
    969   R_HEX_TPREL_HI16        =  62
    970   R_HEX_TPREL_32          =  63
    971   R_HEX_TPREL_16          =  64
    972   R_HEX_6_PCREL_X         =  65
    973   R_HEX_GOTREL_32_6_X     =  66
    974   R_HEX_GOTREL_16_X       =  67
    975   R_HEX_GOTREL_11_X       =  68
    976   R_HEX_GOT_32_6_X        =  69
    977   R_HEX_GOT_16_X          =  70
    978   R_HEX_GOT_11_X          =  71
    979   R_HEX_DTPREL_32_6_X     =  72
    980   R_HEX_DTPREL_16_X       =  73
    981   R_HEX_DTPREL_11_X       =  74
    982   R_HEX_GD_GOT_32_6_X     =  75
    983   R_HEX_GD_GOT_16_X       =  76
    984   R_HEX_GD_GOT_11_X       =  77
    985   R_HEX_IE_32_6_X         =  78
    986   R_HEX_IE_16_X           =  79
    987   R_HEX_IE_GOT_32_6_X     =  80
    988   R_HEX_IE_GOT_16_X       =  81
    989   R_HEX_IE_GOT_11_X       =  82
    990   R_HEX_TPREL_32_6_X      =  83
    991   R_HEX_TPREL_16_X        =  84
    992   R_HEX_TPREL_11_X        =  85
    993 
    994 class Relocs_Elf_Lanai(Enum):
    995   R_LANAI_NONE = 0
    996   R_LANAI_21   = 1
    997   R_LANAI_21_F = 2
    998   R_LANAI_25   = 3
    999   R_LANAI_32   = 4
   1000   R_LANAI_HI16 = 5
   1001   R_LANAI_LO16 = 6
   1002 
   1003 class Relocs_Coff_i386(Enum):
   1004   IMAGE_REL_I386_ABSOLUTE = 0x0000
   1005   IMAGE_REL_I386_DIR16    = 0x0001
   1006   IMAGE_REL_I386_REL16    = 0x0002
   1007   IMAGE_REL_I386_DIR32    = 0x0006
   1008   IMAGE_REL_I386_DIR32NB  = 0x0007
   1009   IMAGE_REL_I386_SEG12    = 0x0009
   1010   IMAGE_REL_I386_SECTION  = 0x000A
   1011   IMAGE_REL_I386_SECREL   = 0x000B
   1012   IMAGE_REL_I386_TOKEN    = 0x000C
   1013   IMAGE_REL_I386_SECREL7  = 0x000D
   1014   IMAGE_REL_I386_REL32    = 0x0014
   1015 
   1016 class Relocs_Coff_X86_64(Enum):
   1017   IMAGE_REL_AMD64_ABSOLUTE  = 0x0000
   1018   IMAGE_REL_AMD64_ADDR64    = 0x0001
   1019   IMAGE_REL_AMD64_ADDR32    = 0x0002
   1020   IMAGE_REL_AMD64_ADDR32NB  = 0x0003
   1021   IMAGE_REL_AMD64_REL32     = 0x0004
   1022   IMAGE_REL_AMD64_REL32_1   = 0x0005
   1023   IMAGE_REL_AMD64_REL32_2   = 0x0006
   1024   IMAGE_REL_AMD64_REL32_3   = 0x0007
   1025   IMAGE_REL_AMD64_REL32_4   = 0x0008
   1026   IMAGE_REL_AMD64_REL32_5   = 0x0009
   1027   IMAGE_REL_AMD64_SECTION   = 0x000A
   1028   IMAGE_REL_AMD64_SECREL    = 0x000B
   1029   IMAGE_REL_AMD64_SECREL7   = 0x000C
   1030   IMAGE_REL_AMD64_TOKEN     = 0x000D
   1031   IMAGE_REL_AMD64_SREL32    = 0x000E
   1032   IMAGE_REL_AMD64_PAIR      = 0x000F
   1033   IMAGE_REL_AMD64_SSPAN32   = 0x0010
   1034 
   1035 class Relocs_Coff_ARM(Enum):
   1036   IMAGE_REL_ARM_ABSOLUTE  = 0x0000
   1037   IMAGE_REL_ARM_ADDR32    = 0x0001
   1038   IMAGE_REL_ARM_ADDR32NB  = 0x0002
   1039   IMAGE_REL_ARM_BRANCH24  = 0x0003
   1040   IMAGE_REL_ARM_BRANCH11  = 0x0004
   1041   IMAGE_REL_ARM_TOKEN     = 0x0005
   1042   IMAGE_REL_ARM_BLX24     = 0x0008
   1043   IMAGE_REL_ARM_BLX11     = 0x0009
   1044   IMAGE_REL_ARM_SECTION   = 0x000E
   1045   IMAGE_REL_ARM_SECREL    = 0x000F
   1046   IMAGE_REL_ARM_MOV32A    = 0x0010
   1047   IMAGE_REL_ARM_MOV32T    = 0x0011
   1048   IMAGE_REL_ARM_BRANCH20T = 0x0012
   1049   IMAGE_REL_ARM_BRANCH24T = 0x0014
   1050   IMAGE_REL_ARM_BLX23T    = 0x0015
   1051 
   1052 
   1053 class Relocs_Macho_i386(Enum):
   1054   RIT_Vanilla                     = 0
   1055   RIT_Pair                        = 1
   1056   RIT_Difference                  = 2
   1057   RIT_Generic_PreboundLazyPointer = 3
   1058   RIT_Generic_LocalDifference     = 4
   1059   RIT_Generic_TLV                 = 5
   1060 
   1061 class Relocs_Macho_X86_64(Enum):
   1062   RIT_X86_64_Unsigned   = 0
   1063   RIT_X86_64_Signed     = 1
   1064   RIT_X86_64_Branch     = 2
   1065   RIT_X86_64_GOTLoad    = 3
   1066   RIT_X86_64_GOT        = 4
   1067   RIT_X86_64_Subtractor = 5
   1068   RIT_X86_64_Signed1    = 6
   1069   RIT_X86_64_Signed2    = 7
   1070   RIT_X86_64_Signed4    = 8
   1071   RIT_X86_64_TLV        = 9
   1072 
   1073 class Relocs_Macho_ARM(Enum):
   1074   RIT_Vanilla                     = 0
   1075   RIT_Pair                        = 1
   1076   RIT_Difference                  = 2
   1077   RIT_ARM_LocalDifference         = 3
   1078   RIT_ARM_PreboundLazyPointer     = 4
   1079   RIT_ARM_Branch24Bit             = 5
   1080   RIT_ARM_ThumbBranch22Bit        = 6
   1081   RIT_ARM_ThumbBranch32Bit        = 7
   1082   RIT_ARM_Half                    = 8
   1083   RIT_ARM_HalfDifference          = 9
   1084 
   1085 class Relocs_Macho_PPC(Enum):
   1086   PPC_RELOC_VANILLA        = 0
   1087   PPC_RELOC_PAIR           = 1
   1088   PPC_RELOC_BR14           = 2
   1089   PPC_RELOC_BR24           = 3
   1090   PPC_RELOC_HI16           = 4
   1091   PPC_RELOC_LO16           = 5
   1092   PPC_RELOC_HA16           = 6
   1093   PPC_RELOC_LO14           = 7
   1094   PPC_RELOC_SECTDIFF       = 8
   1095   PPC_RELOC_PB_LA_PTR      = 9
   1096   PPC_RELOC_HI16_SECTDIFF  = 10
   1097   PPC_RELOC_LO16_SECTDIFF  = 11
   1098   PPC_RELOC_HA16_SECTDIFF  = 12
   1099   PPC_RELOC_JBSR           = 13
   1100   PPC_RELOC_LO14_SECTDIFF  = 14
   1101   PPC_RELOC_LOCAL_SECTDIFF = 15
   1102 
   1103 
   1104 craftElf("relocs.obj.elf-x86_64",   "x86_64-pc-linux-gnu",         Relocs_Elf_X86_64.entries(), "leaq sym@GOTTPOFF(%rip), %rax")
   1105 craftElf("relocs.obj.elf-i386",     "i386-pc-linux-gnu",           Relocs_Elf_i386.entries(),   "mov sym@GOTOFF(%ebx), %eax")
   1106 #craftElf("relocs-elf-ppc32",   "powerpc-unknown-linux-gnu",   Relocs_Elf_PPC32.entries(), ...)
   1107 craftElf("relocs.obj.elf-ppc64",   "powerpc64-unknown-linux-gnu", Relocs_Elf_PPC64.entries(),
   1108          ("@t = thread_local global i32 0, align 4", "define i32* @f{0}() nounwind {{ ret i32* @t }}", 2))
   1109 craftElf("relocs.obj.elf-aarch64",  "aarch64",                     Relocs_Elf_AArch64.entries(), "movz x0, #:abs_g0:sym")
   1110 craftElf("relocs.obj.elf-arm",      "arm-unknown-unknown",         Relocs_Elf_ARM.entries(), "b sym")
   1111 craftElf("relocs.obj.elf-mips",     "mips-unknown-linux",          Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)")
   1112 craftElf("relocs.obj.elf-mips64el", "mips64el-unknown-linux",        Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)")
   1113 #craftElf("relocs.obj.elf-hexagon",  "hexagon-unknown-unknown",     Relocs_Elf_Hexagon.entries(), ...)
   1114 #craftElf("relocs.obj.elf-lanai",   "lanai-unknown-unknown",   Relocs_Elf_Lanai.entries(), "mov hi(x), %r4")
   1115 
   1116 craftCoff("relocs.obj.coff-i386",   "i386-pc-win32",   Relocs_Coff_i386.entries(),   "mov foo@imgrel(%ebx, %ecx, 4), %eax")
   1117 craftCoff("relocs.obj.coff-x86_64", "x86_64-pc-win32", Relocs_Coff_X86_64.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax")
   1118 #craftCoff("relocs.obj.coff-arm",    "arm-pc-win32",    Relocs_Coff_ARM.entries(), "...")
   1119 
   1120 craftMacho("relocs.obj.macho-i386",   "i386-apple-darwin9", Relocs_Macho_i386.entries(),
   1121           ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1))
   1122 craftMacho("relocs.obj.macho-x86_64", "x86_64-apple-darwin9", Relocs_Macho_X86_64.entries(),
   1123           ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1))
   1124 craftMacho("relocs.obj.macho-arm",    "armv7-apple-darwin10", Relocs_Macho_ARM.entries(), "bl sym")
   1125 #craftMacho("relocs.obj.macho-ppc",   "powerpc-apple-darwin10", Relocs_Macho_PPC.entries(), ...)
   1126