Add extensive relocation tests for llvm-readobj
[oota-llvm.git] / test / tools / llvm-readobj / Inputs / relocs.py
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   f.seek(20)
331   sections = [CoffSection(f) for idx in range(section_count)]
332
333   section = sections[0]
334   f.seek(section.pointer_to_relocations)
335   for i in range(section.relocation_count):
336     virtual_addr = f.uint32()
337     symtab_idx   = f.uint32()
338     print("    %s" % relocs[i][0])
339     f.writeUInt16(relocs[i][1])
340
341
342 def craftMacho(filename, triple, relocs, dummyReloc):
343   print("Crafting " + filename + " for " + triple)
344
345   if type(dummyReloc) is tuple:
346     srcType, preSrc, dummyReloc, relocsPerDummy = dummyReloc
347     src = preSrc + "\n"
348     for i in range((len(relocs) + relocsPerDummy - 1) / relocsPerDummy):
349       src += dummyReloc.format(i) + "\n"
350     if srcType == "asm":
351       compileAsm(filename, triple, src)
352     elif srcType == "ir":
353       compileIR(filename, triple, src)
354   else:
355     src = (dummyReloc + "\n") * len(relocs)
356     compileAsm(filename, triple, src)
357
358   print("  Patching relocations...")
359   patchMacho(filename, relocs)
360
361 def patchMacho(filename, relocs):
362   f = BinaryReader(filename)
363
364   magic = f.read(4)
365   if magic == '\xFE\xED\xFA\xCE':
366     f.isLSB, f.is64Bit = False, False
367   elif magic == '\xCE\xFA\xED\xFE':
368     f.isLSB, f.is64Bit = True, False
369   elif magic == '\xFE\xED\xFA\xCF':
370     f.isLSB, f.is64Bit = False, True
371   elif magic == '\xCF\xFA\xED\xFE':
372     f.isLSB, f.is64Bit = True, True
373   else:
374     raise ValueError,"Not a Mach-O object file: %r (bad magic)" % path
375
376   cputype = f.uint32()
377   cpusubtype = f.uint32()
378   filetype = f.uint32()
379   numLoadCommands = f.uint32()
380   loadCommandsSize = f.uint32()
381   flag = f.uint32()
382   if f.is64Bit:
383     reserved = f.uint32()
384
385   start = f.tell()
386
387   for i in range(numLoadCommands):
388     patchMachoLoadCommand(f, relocs)
389
390   if f.tell() - start != loadCommandsSize:
391     raise ValueError,"%s: warning: invalid load commands size: %r" % (
392       sys.argv[0], loadCommandsSize)
393
394 def patchMachoLoadCommand(f, relocs):
395   start = f.tell()
396   cmd = f.uint32()
397   cmdSize = f.uint32()
398
399   if cmd == 1:
400     patchMachoSegmentLoadCommand(f, relocs)
401   elif cmd == 25:
402     patchMachoSegmentLoadCommand(f, relocs)
403   else:
404     f.read(cmdSize - 8)
405
406   if f.tell() - start != cmdSize:
407     raise ValueError,"%s: warning: invalid load command size: %r" % (
408       sys.argv[0], cmdSize)
409
410 def patchMachoSegmentLoadCommand(f, relocs):
411   segment_name = f.read(16)
412   vm_addr = f.word()
413   vm_size = f.word()
414   file_offset = f.word()
415   file_size = f.word()
416   maxprot = f.uint32()
417   initprot = f.uint32()
418   numSections = f.uint32()
419   flags = f.uint32()
420   for i in range(numSections):
421     patchMachoSection(f, relocs)
422
423 def patchMachoSection(f, relocs):
424   section_name = f.read(16)
425   segment_name = f.read(16)
426   address = f.word()
427   size = f.word()
428   offset = f.uint32()
429   alignment = f.uint32()
430   relocOffset = f.uint32()
431   numReloc = f.uint32()
432   flags = f.uint32()
433   reserved1 = f.uint32()
434   reserved2 = f.uint32()
435   if f.is64Bit:
436     reserved3 = f.uint32()
437
438   prev_pos = f.tell()
439
440   f.seek(relocOffset)
441   for i in range(numReloc):
442     ri = i < len(relocs) and i or 0
443     print("    %s" % relocs[ri][0])
444     word1 = f.uint32()
445     pos = f.tell()
446     value = f.uint32()
447     f.seek(pos)
448     value = (value & 0x0FFFFFFF) | ((relocs[ri][1] & 0xF) << 28)
449     f.writeUInt32(value)
450   f.seek(prev_pos)
451
452
453 class Relocs_Elf_X86_64(Enum):
454   R_X86_64_NONE       = 0
455   R_X86_64_64         = 1
456   R_X86_64_PC32       = 2
457   R_X86_64_GOT32      = 3
458   R_X86_64_PLT32      = 4
459   R_X86_64_COPY       = 5
460   R_X86_64_GLOB_DAT   = 6
461   R_X86_64_JUMP_SLOT  = 7
462   R_X86_64_RELATIVE   = 8
463   R_X86_64_GOTPCREL   = 9
464   R_X86_64_32         = 10
465   R_X86_64_32S        = 11
466   R_X86_64_16         = 12
467   R_X86_64_PC16       = 13
468   R_X86_64_8          = 14
469   R_X86_64_PC8        = 15
470   R_X86_64_DTPMOD64   = 16
471   R_X86_64_DTPOFF64   = 17
472   R_X86_64_TPOFF64    = 18
473   R_X86_64_TLSGD      = 19
474   R_X86_64_TLSLD      = 20
475   R_X86_64_DTPOFF32   = 21
476   R_X86_64_GOTTPOFF   = 22
477   R_X86_64_TPOFF32    = 23
478   R_X86_64_PC64       = 24
479   R_X86_64_GOTOFF64   = 25
480   R_X86_64_GOTPC32    = 26
481   R_X86_64_GOT64      = 27
482   R_X86_64_GOTPCREL64 = 28
483   R_X86_64_GOTPC64    = 29
484   R_X86_64_GOTPLT64   = 30
485   R_X86_64_PLTOFF64   = 31
486   R_X86_64_SIZE32     = 32
487   R_X86_64_SIZE64     = 33
488   R_X86_64_GOTPC32_TLSDESC = 34
489   R_X86_64_TLSDESC_CALL    = 35
490   R_X86_64_TLSDESC    = 36
491   R_X86_64_IRELATIVE  = 37
492
493 class Relocs_Elf_i386(Enum):
494   R_386_NONE          = 0
495   R_386_32            = 1
496   R_386_PC32          = 2
497   R_386_GOT32         = 3
498   R_386_PLT32         = 4
499   R_386_COPY          = 5
500   R_386_GLOB_DAT      = 6
501   R_386_JUMP_SLOT     = 7
502   R_386_RELATIVE      = 8
503   R_386_GOTOFF        = 9
504   R_386_GOTPC         = 10
505   R_386_32PLT         = 11
506   R_386_TLS_TPOFF     = 14
507   R_386_TLS_IE        = 15
508   R_386_TLS_GOTIE     = 16
509   R_386_TLS_LE        = 17
510   R_386_TLS_GD        = 18
511   R_386_TLS_LDM       = 19
512   R_386_16            = 20
513   R_386_PC16          = 21
514   R_386_8             = 22
515   R_386_PC8           = 23
516   R_386_TLS_GD_32     = 24
517   R_386_TLS_GD_PUSH   = 25
518   R_386_TLS_GD_CALL   = 26
519   R_386_TLS_GD_POP    = 27
520   R_386_TLS_LDM_32    = 28
521   R_386_TLS_LDM_PUSH  = 29
522   R_386_TLS_LDM_CALL  = 30
523   R_386_TLS_LDM_POP   = 31
524   R_386_TLS_LDO_32    = 32
525   R_386_TLS_IE_32     = 33
526   R_386_TLS_LE_32     = 34
527   R_386_TLS_DTPMOD32  = 35
528   R_386_TLS_DTPOFF32  = 36
529   R_386_TLS_TPOFF32   = 37
530   R_386_TLS_GOTDESC   = 39
531   R_386_TLS_DESC_CALL = 40
532   R_386_TLS_DESC      = 41
533   R_386_IRELATIVE     = 42
534   R_386_NUM           = 43
535
536 class Relocs_Elf_MBlaze(Enum):
537   R_MICROBLAZE_NONE           = 0
538   R_MICROBLAZE_32             = 1
539   R_MICROBLAZE_32_PCREL       = 2
540   R_MICROBLAZE_64_PCREL       = 3
541   R_MICROBLAZE_32_PCREL_LO    = 4
542   R_MICROBLAZE_64             = 5
543   R_MICROBLAZE_32_LO          = 6
544   R_MICROBLAZE_SRO32          = 7
545   R_MICROBLAZE_SRW32          = 8
546   R_MICROBLAZE_64_NONE        = 9
547   R_MICROBLAZE_32_SYM_OP_SYM  = 10
548   R_MICROBLAZE_GNU_VTINHERIT  = 11
549   R_MICROBLAZE_GNU_VTENTRY    = 12
550   R_MICROBLAZE_GOTPC_64       = 13
551   R_MICROBLAZE_GOT_64         = 14
552   R_MICROBLAZE_PLT_64         = 15
553   R_MICROBLAZE_REL            = 16
554   R_MICROBLAZE_JUMP_SLOT      = 17
555   R_MICROBLAZE_GLOB_DAT       = 18
556   R_MICROBLAZE_GOTOFF_64      = 19
557   R_MICROBLAZE_GOTOFF_32      = 20
558   R_MICROBLAZE_COPY           = 21
559
560 class Relocs_Elf_PPC32(Enum):
561   R_PPC_NONE                  = 0
562   R_PPC_ADDR32                = 1
563   R_PPC_ADDR24                = 2
564   R_PPC_ADDR16                = 3
565   R_PPC_ADDR16_LO             = 4
566   R_PPC_ADDR16_HI             = 5
567   R_PPC_ADDR16_HA             = 6
568   R_PPC_ADDR14                = 7
569   R_PPC_ADDR14_BRTAKEN        = 8
570   R_PPC_ADDR14_BRNTAKEN       = 9
571   R_PPC_REL24                 = 10
572   R_PPC_REL14                 = 11
573   R_PPC_REL14_BRTAKEN         = 12
574   R_PPC_REL14_BRNTAKEN        = 13
575   R_PPC_REL32                 = 26
576   R_PPC_TPREL16_LO            = 70
577   R_PPC_TPREL16_HA            = 72
578
579 class Relocs_Elf_PPC64(Enum):
580   R_PPC64_NONE                = 0
581   R_PPC64_ADDR32              = 1
582   R_PPC64_ADDR16_LO           = 4
583   R_PPC64_ADDR16_HI           = 5
584   R_PPC64_ADDR14              = 7
585   R_PPC64_REL24               = 10
586   R_PPC64_REL32               = 26
587   R_PPC64_ADDR64              = 38
588   R_PPC64_ADDR16_HIGHER       = 39
589   R_PPC64_ADDR16_HIGHEST      = 41
590   R_PPC64_REL64               = 44
591   R_PPC64_TOC16               = 47
592   R_PPC64_TOC16_LO            = 48
593   R_PPC64_TOC16_HA            = 50
594   R_PPC64_TOC                 = 51
595   R_PPC64_ADDR16_DS           = 56
596   R_PPC64_ADDR16_LO_DS        = 57
597   R_PPC64_TOC16_DS            = 63
598   R_PPC64_TOC16_LO_DS         = 64
599   R_PPC64_TLS                 = 67
600   R_PPC64_TPREL16_LO          = 70
601   R_PPC64_TPREL16_HA          = 72
602   R_PPC64_DTPREL16_LO         = 75
603   R_PPC64_DTPREL16_HA         = 77
604   R_PPC64_GOT_TLSGD16_LO      = 80
605   R_PPC64_GOT_TLSGD16_HA      = 82
606   R_PPC64_GOT_TLSLD16_LO      = 84
607   R_PPC64_GOT_TLSLD16_HA      = 86
608   R_PPC64_GOT_TPREL16_LO_DS   = 88
609   R_PPC64_GOT_TPREL16_HA      = 90
610   R_PPC64_TLSGD               = 107
611   R_PPC64_TLSLD               = 108
612
613 class Relocs_Elf_AArch64(Enum):
614   R_AARCH64_NONE                        = 0x100
615   R_AARCH64_ABS64                       = 0x101
616   R_AARCH64_ABS32                       = 0x102
617   R_AARCH64_ABS16                       = 0x103
618   R_AARCH64_PREL64                      = 0x104
619   R_AARCH64_PREL32                      = 0x105
620   R_AARCH64_PREL16                      = 0x106
621   R_AARCH64_MOVW_UABS_G0                = 0x107
622   R_AARCH64_MOVW_UABS_G0_NC             = 0x108
623   R_AARCH64_MOVW_UABS_G1                = 0x109
624   R_AARCH64_MOVW_UABS_G1_NC             = 0x10a
625   R_AARCH64_MOVW_UABS_G2                = 0x10b
626   R_AARCH64_MOVW_UABS_G2_NC             = 0x10c
627   R_AARCH64_MOVW_UABS_G3                = 0x10d
628   R_AARCH64_MOVW_SABS_G0                = 0x10e
629   R_AARCH64_MOVW_SABS_G1                = 0x10f
630   R_AARCH64_MOVW_SABS_G2                = 0x110
631   R_AARCH64_LD_PREL_LO19                = 0x111
632   R_AARCH64_ADR_PREL_LO21               = 0x112
633   R_AARCH64_ADR_PREL_PG_HI21            = 0x113
634   R_AARCH64_ADD_ABS_LO12_NC             = 0x115
635   R_AARCH64_LDST8_ABS_LO12_NC           = 0x116
636   R_AARCH64_TSTBR14                     = 0x117
637   R_AARCH64_CONDBR19                    = 0x118
638   R_AARCH64_JUMP26                      = 0x11a
639   R_AARCH64_CALL26                      = 0x11b
640   R_AARCH64_LDST16_ABS_LO12_NC          = 0x11c
641   R_AARCH64_LDST32_ABS_LO12_NC          = 0x11d
642   R_AARCH64_LDST64_ABS_LO12_NC          = 0x11e
643   R_AARCH64_LDST128_ABS_LO12_NC         = 0x12b
644   R_AARCH64_ADR_GOT_PAGE                = 0x137
645   R_AARCH64_LD64_GOT_LO12_NC            = 0x138
646   R_AARCH64_TLSLD_MOVW_DTPREL_G2        = 0x20b
647   R_AARCH64_TLSLD_MOVW_DTPREL_G1        = 0x20c
648   R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC     = 0x20d
649   R_AARCH64_TLSLD_MOVW_DTPREL_G0        = 0x20e
650   R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC     = 0x20f
651   R_AARCH64_TLSLD_ADD_DTPREL_HI12       = 0x210
652   R_AARCH64_TLSLD_ADD_DTPREL_LO12       = 0x211
653   R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC    = 0x212
654   R_AARCH64_TLSLD_LDST8_DTPREL_LO12     = 0x213
655   R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC  = 0x214
656   R_AARCH64_TLSLD_LDST16_DTPREL_LO12    = 0x215
657   R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC = 0x216
658   R_AARCH64_TLSLD_LDST32_DTPREL_LO12    = 0x217
659   R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC = 0x218
660   R_AARCH64_TLSLD_LDST64_DTPREL_LO12    = 0x219
661   R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC = 0x21a
662   R_AARCH64_TLSIE_MOVW_GOTTPREL_G1      = 0x21b
663   R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC   = 0x21c
664   R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21   = 0x21d
665   R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 0x21e
666   R_AARCH64_TLSIE_LD_GOTTPREL_PREL19    = 0x21f
667   R_AARCH64_TLSLE_MOVW_TPREL_G2         = 0x220
668   R_AARCH64_TLSLE_MOVW_TPREL_G1         = 0x221
669   R_AARCH64_TLSLE_MOVW_TPREL_G1_NC      = 0x222
670   R_AARCH64_TLSLE_MOVW_TPREL_G0         = 0x223
671   R_AARCH64_TLSLE_MOVW_TPREL_G0_NC      = 0x224
672   R_AARCH64_TLSLE_ADD_TPREL_HI12        = 0x225
673   R_AARCH64_TLSLE_ADD_TPREL_LO12        = 0x226
674   R_AARCH64_TLSLE_ADD_TPREL_LO12_NC     = 0x227
675   R_AARCH64_TLSLE_LDST8_TPREL_LO12      = 0x228
676   R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC   = 0x229
677   R_AARCH64_TLSLE_LDST16_TPREL_LO12     = 0x22a
678   R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC  = 0x22b
679   R_AARCH64_TLSLE_LDST32_TPREL_LO12     = 0x22c
680   R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC  = 0x22d
681   R_AARCH64_TLSLE_LDST64_TPREL_LO12     = 0x22e
682   R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC  = 0x22f
683   R_AARCH64_TLSDESC_ADR_PAGE            = 0x232
684   R_AARCH64_TLSDESC_LD64_LO12_NC        = 0x233
685   R_AARCH64_TLSDESC_ADD_LO12_NC         = 0x234
686   R_AARCH64_TLSDESC_CALL                = 0x239
687
688 class Relocs_Elf_ARM(Enum):
689   R_ARM_NONE                  = 0x00
690   R_ARM_PC24                  = 0x01
691   R_ARM_ABS32                 = 0x02
692   R_ARM_REL32                 = 0x03
693   R_ARM_LDR_PC_G0             = 0x04
694   R_ARM_ABS16                 = 0x05
695   R_ARM_ABS12                 = 0x06
696   R_ARM_THM_ABS5              = 0x07
697   R_ARM_ABS8                  = 0x08
698   R_ARM_SBREL32               = 0x09
699   R_ARM_THM_CALL              = 0x0a
700   R_ARM_THM_PC8               = 0x0b
701   R_ARM_BREL_ADJ              = 0x0c
702   R_ARM_TLS_DESC              = 0x0d
703   R_ARM_THM_SWI8              = 0x0e
704   R_ARM_XPC25                 = 0x0f
705   R_ARM_THM_XPC22             = 0x10
706   R_ARM_TLS_DTPMOD32          = 0x11
707   R_ARM_TLS_DTPOFF32          = 0x12
708   R_ARM_TLS_TPOFF32           = 0x13
709   R_ARM_COPY                  = 0x14
710   R_ARM_GLOB_DAT              = 0x15
711   R_ARM_JUMP_SLOT             = 0x16
712   R_ARM_RELATIVE              = 0x17
713   R_ARM_GOTOFF32              = 0x18
714   R_ARM_BASE_PREL             = 0x19
715   R_ARM_GOT_BREL              = 0x1a
716   R_ARM_PLT32                 = 0x1b
717   R_ARM_CALL                  = 0x1c
718   R_ARM_JUMP24                = 0x1d
719   R_ARM_THM_JUMP24            = 0x1e
720   R_ARM_BASE_ABS              = 0x1f
721   R_ARM_ALU_PCREL_7_0         = 0x20
722   R_ARM_ALU_PCREL_15_8        = 0x21
723   R_ARM_ALU_PCREL_23_15       = 0x22
724   R_ARM_LDR_SBREL_11_0_NC     = 0x23
725   R_ARM_ALU_SBREL_19_12_NC    = 0x24
726   R_ARM_ALU_SBREL_27_20_CK    = 0x25
727   R_ARM_TARGET1               = 0x26
728   R_ARM_SBREL31               = 0x27
729   R_ARM_V4BX                  = 0x28
730   R_ARM_TARGET2               = 0x29
731   R_ARM_PREL31                = 0x2a
732   R_ARM_MOVW_ABS_NC           = 0x2b
733   R_ARM_MOVT_ABS              = 0x2c
734   R_ARM_MOVW_PREL_NC          = 0x2d
735   R_ARM_MOVT_PREL             = 0x2e
736   R_ARM_THM_MOVW_ABS_NC       = 0x2f
737   R_ARM_THM_MOVT_ABS          = 0x30
738   R_ARM_THM_MOVW_PREL_NC      = 0x31
739   R_ARM_THM_MOVT_PREL         = 0x32
740   R_ARM_THM_JUMP19            = 0x33
741   R_ARM_THM_JUMP6             = 0x34
742   R_ARM_THM_ALU_PREL_11_0     = 0x35
743   R_ARM_THM_PC12              = 0x36
744   R_ARM_ABS32_NOI             = 0x37
745   R_ARM_REL32_NOI             = 0x38
746   R_ARM_ALU_PC_G0_NC          = 0x39
747   R_ARM_ALU_PC_G0             = 0x3a
748   R_ARM_ALU_PC_G1_NC          = 0x3b
749   R_ARM_ALU_PC_G1             = 0x3c
750   R_ARM_ALU_PC_G2             = 0x3d
751   R_ARM_LDR_PC_G1             = 0x3e
752   R_ARM_LDR_PC_G2             = 0x3f
753   R_ARM_LDRS_PC_G0            = 0x40
754   R_ARM_LDRS_PC_G1            = 0x41
755   R_ARM_LDRS_PC_G2            = 0x42
756   R_ARM_LDC_PC_G0             = 0x43
757   R_ARM_LDC_PC_G1             = 0x44
758   R_ARM_LDC_PC_G2             = 0x45
759   R_ARM_ALU_SB_G0_NC          = 0x46
760   R_ARM_ALU_SB_G0             = 0x47
761   R_ARM_ALU_SB_G1_NC          = 0x48
762   R_ARM_ALU_SB_G1             = 0x49
763   R_ARM_ALU_SB_G2             = 0x4a
764   R_ARM_LDR_SB_G0             = 0x4b
765   R_ARM_LDR_SB_G1             = 0x4c
766   R_ARM_LDR_SB_G2             = 0x4d
767   R_ARM_LDRS_SB_G0            = 0x4e
768   R_ARM_LDRS_SB_G1            = 0x4f
769   R_ARM_LDRS_SB_G2            = 0x50
770   R_ARM_LDC_SB_G0             = 0x51
771   R_ARM_LDC_SB_G1             = 0x52
772   R_ARM_LDC_SB_G2             = 0x53
773   R_ARM_MOVW_BREL_NC          = 0x54
774   R_ARM_MOVT_BREL             = 0x55
775   R_ARM_MOVW_BREL             = 0x56
776   R_ARM_THM_MOVW_BREL_NC      = 0x57
777   R_ARM_THM_MOVT_BREL         = 0x58
778   R_ARM_THM_MOVW_BREL         = 0x59
779   R_ARM_TLS_GOTDESC           = 0x5a
780   R_ARM_TLS_CALL              = 0x5b
781   R_ARM_TLS_DESCSEQ           = 0x5c
782   R_ARM_THM_TLS_CALL          = 0x5d
783   R_ARM_PLT32_ABS             = 0x5e
784   R_ARM_GOT_ABS               = 0x5f
785   R_ARM_GOT_PREL              = 0x60
786   R_ARM_GOT_BREL12            = 0x61
787   R_ARM_GOTOFF12              = 0x62
788   R_ARM_GOTRELAX              = 0x63
789   R_ARM_GNU_VTENTRY           = 0x64
790   R_ARM_GNU_VTINHERIT         = 0x65
791   R_ARM_THM_JUMP11            = 0x66
792   R_ARM_THM_JUMP8             = 0x67
793   R_ARM_TLS_GD32              = 0x68
794   R_ARM_TLS_LDM32             = 0x69
795   R_ARM_TLS_LDO32             = 0x6a
796   R_ARM_TLS_IE32              = 0x6b
797   R_ARM_TLS_LE32              = 0x6c
798   R_ARM_TLS_LDO12             = 0x6d
799   R_ARM_TLS_LE12              = 0x6e
800   R_ARM_TLS_IE12GP            = 0x6f
801   R_ARM_PRIVATE_0             = 0x70
802   R_ARM_PRIVATE_1             = 0x71
803   R_ARM_PRIVATE_2             = 0x72
804   R_ARM_PRIVATE_3             = 0x73
805   R_ARM_PRIVATE_4             = 0x74
806   R_ARM_PRIVATE_5             = 0x75
807   R_ARM_PRIVATE_6             = 0x76
808   R_ARM_PRIVATE_7             = 0x77
809   R_ARM_PRIVATE_8             = 0x78
810   R_ARM_PRIVATE_9             = 0x79
811   R_ARM_PRIVATE_10            = 0x7a
812   R_ARM_PRIVATE_11            = 0x7b
813   R_ARM_PRIVATE_12            = 0x7c
814   R_ARM_PRIVATE_13            = 0x7d
815   R_ARM_PRIVATE_14            = 0x7e
816   R_ARM_PRIVATE_15            = 0x7f
817   R_ARM_ME_TOO                = 0x80
818   R_ARM_THM_TLS_DESCSEQ16     = 0x81
819   R_ARM_THM_TLS_DESCSEQ32     = 0x82
820
821 class Relocs_Elf_Mips(Enum):
822   R_MIPS_NONE              =  0
823   R_MIPS_16                =  1
824   R_MIPS_32                =  2
825   R_MIPS_REL32             =  3
826   R_MIPS_26                =  4
827   R_MIPS_HI16              =  5
828   R_MIPS_LO16              =  6
829   R_MIPS_GPREL16           =  7
830   R_MIPS_LITERAL           =  8
831   R_MIPS_GOT16             =  9
832   R_MIPS_PC16              = 10
833   R_MIPS_CALL16            = 11
834   R_MIPS_GPREL32           = 12
835   R_MIPS_SHIFT5            = 16
836   R_MIPS_SHIFT6            = 17
837   R_MIPS_64                = 18
838   R_MIPS_GOT_DISP          = 19
839   R_MIPS_GOT_PAGE          = 20
840   R_MIPS_GOT_OFST          = 21
841   R_MIPS_GOT_HI16          = 22
842   R_MIPS_GOT_LO16          = 23
843   R_MIPS_SUB               = 24
844   R_MIPS_INSERT_A          = 25
845   R_MIPS_INSERT_B          = 26
846   R_MIPS_DELETE            = 27
847   R_MIPS_HIGHER            = 28
848   R_MIPS_HIGHEST           = 29
849   R_MIPS_CALL_HI16         = 30
850   R_MIPS_CALL_LO16         = 31
851   R_MIPS_SCN_DISP          = 32
852   R_MIPS_REL16             = 33
853   R_MIPS_ADD_IMMEDIATE     = 34
854   R_MIPS_PJUMP             = 35
855   R_MIPS_RELGOT            = 36
856   R_MIPS_JALR              = 37
857   R_MIPS_TLS_DTPMOD32      = 38
858   R_MIPS_TLS_DTPREL32      = 39
859   R_MIPS_TLS_DTPMOD64      = 40
860   R_MIPS_TLS_DTPREL64      = 41
861   R_MIPS_TLS_GD            = 42
862   R_MIPS_TLS_LDM           = 43
863   R_MIPS_TLS_DTPREL_HI16   = 44
864   R_MIPS_TLS_DTPREL_LO16   = 45
865   R_MIPS_TLS_GOTTPREL      = 46
866   R_MIPS_TLS_TPREL32       = 47
867   R_MIPS_TLS_TPREL64       = 48
868   R_MIPS_TLS_TPREL_HI16    = 49
869   R_MIPS_TLS_TPREL_LO16    = 50
870   R_MIPS_GLOB_DAT          = 51
871   R_MIPS_COPY              = 126
872   R_MIPS_JUMP_SLOT         = 127
873   R_MIPS_NUM               = 218
874
875 class Relocs_Elf_Hexagon(Enum):
876   R_HEX_NONE              =  0
877   R_HEX_B22_PCREL         =  1
878   R_HEX_B15_PCREL         =  2
879   R_HEX_B7_PCREL          =  3
880   R_HEX_LO16              =  4
881   R_HEX_HI16              =  5
882   R_HEX_32                =  6
883   R_HEX_16                =  7
884   R_HEX_8                 =  8
885   R_HEX_GPREL16_0         =  9
886   R_HEX_GPREL16_1         =  10
887   R_HEX_GPREL16_2         =  11
888   R_HEX_GPREL16_3         =  12
889   R_HEX_HL16              =  13
890   R_HEX_B13_PCREL         =  14
891   R_HEX_B9_PCREL          =  15
892   R_HEX_B32_PCREL_X       =  16
893   R_HEX_32_6_X            =  17
894   R_HEX_B22_PCREL_X       =  18
895   R_HEX_B15_PCREL_X       =  19
896   R_HEX_B13_PCREL_X       =  20
897   R_HEX_B9_PCREL_X        =  21
898   R_HEX_B7_PCREL_X        =  22
899   R_HEX_16_X              =  23
900   R_HEX_12_X              =  24
901   R_HEX_11_X              =  25
902   R_HEX_10_X              =  26
903   R_HEX_9_X               =  27
904   R_HEX_8_X               =  28
905   R_HEX_7_X               =  29
906   R_HEX_6_X               =  30
907   R_HEX_32_PCREL          =  31
908   R_HEX_COPY              =  32
909   R_HEX_GLOB_DAT          =  33
910   R_HEX_JMP_SLOT          =  34
911   R_HEX_RELATIVE          =  35
912   R_HEX_PLT_B22_PCREL     =  36
913   R_HEX_GOTREL_LO16       =  37
914   R_HEX_GOTREL_HI16       =  38
915   R_HEX_GOTREL_32         =  39
916   R_HEX_GOT_LO16          =  40
917   R_HEX_GOT_HI16          =  41
918   R_HEX_GOT_32            =  42
919   R_HEX_GOT_16            =  43
920   R_HEX_DTPMOD_32         =  44
921   R_HEX_DTPREL_LO16       =  45
922   R_HEX_DTPREL_HI16       =  46
923   R_HEX_DTPREL_32         =  47
924   R_HEX_DTPREL_16         =  48
925   R_HEX_GD_PLT_B22_PCREL  =  49
926   R_HEX_GD_GOT_LO16       =  50
927   R_HEX_GD_GOT_HI16       =  51
928   R_HEX_GD_GOT_32         =  52
929   R_HEX_GD_GOT_16         =  53
930   R_HEX_IE_LO16           =  54
931   R_HEX_IE_HI16           =  55
932   R_HEX_IE_32             =  56
933   R_HEX_IE_GOT_LO16       =  57
934   R_HEX_IE_GOT_HI16       =  58
935   R_HEX_IE_GOT_32         =  59
936   R_HEX_IE_GOT_16         =  60
937   R_HEX_TPREL_LO16        =  61
938   R_HEX_TPREL_HI16        =  62
939   R_HEX_TPREL_32          =  63
940   R_HEX_TPREL_16          =  64
941   R_HEX_6_PCREL_X         =  65
942   R_HEX_GOTREL_32_6_X     =  66
943   R_HEX_GOTREL_16_X       =  67
944   R_HEX_GOTREL_11_X       =  68
945   R_HEX_GOT_32_6_X        =  69
946   R_HEX_GOT_16_X          =  70
947   R_HEX_GOT_11_X          =  71
948   R_HEX_DTPREL_32_6_X     =  72
949   R_HEX_DTPREL_16_X       =  73
950   R_HEX_DTPREL_11_X       =  74
951   R_HEX_GD_GOT_32_6_X     =  75
952   R_HEX_GD_GOT_16_X       =  76
953   R_HEX_GD_GOT_11_X       =  77
954   R_HEX_IE_32_6_X         =  78
955   R_HEX_IE_16_X           =  79
956   R_HEX_IE_GOT_32_6_X     =  80
957   R_HEX_IE_GOT_16_X       =  81
958   R_HEX_IE_GOT_11_X       =  82
959   R_HEX_TPREL_32_6_X      =  83
960   R_HEX_TPREL_16_X        =  84
961   R_HEX_TPREL_11_X        =  85
962
963
964 class Relocs_Coff_i386(Enum):
965   IMAGE_REL_I386_ABSOLUTE = 0x0000
966   IMAGE_REL_I386_DIR16    = 0x0001
967   IMAGE_REL_I386_REL16    = 0x0002
968   IMAGE_REL_I386_DIR32    = 0x0006
969   IMAGE_REL_I386_DIR32NB  = 0x0007
970   IMAGE_REL_I386_SEG12    = 0x0009
971   IMAGE_REL_I386_SECTION  = 0x000A
972   IMAGE_REL_I386_SECREL   = 0x000B
973   IMAGE_REL_I386_TOKEN    = 0x000C
974   IMAGE_REL_I386_SECREL7  = 0x000D
975   IMAGE_REL_I386_REL32    = 0x0014
976
977 class Relocs_Coff_X86_64(Enum):
978   IMAGE_REL_AMD64_ABSOLUTE  = 0x0000
979   IMAGE_REL_AMD64_ADDR64    = 0x0001
980   IMAGE_REL_AMD64_ADDR32    = 0x0002
981   IMAGE_REL_AMD64_ADDR32NB  = 0x0003
982   IMAGE_REL_AMD64_REL32     = 0x0004
983   IMAGE_REL_AMD64_REL32_1   = 0x0005
984   IMAGE_REL_AMD64_REL32_2   = 0x0006
985   IMAGE_REL_AMD64_REL32_3   = 0x0007
986   IMAGE_REL_AMD64_REL32_4   = 0x0008
987   IMAGE_REL_AMD64_REL32_5   = 0x0009
988   IMAGE_REL_AMD64_SECTION   = 0x000A
989   IMAGE_REL_AMD64_SECREL    = 0x000B
990   IMAGE_REL_AMD64_SECREL7   = 0x000C
991   IMAGE_REL_AMD64_TOKEN     = 0x000D
992   IMAGE_REL_AMD64_SREL32    = 0x000E
993   IMAGE_REL_AMD64_PAIR      = 0x000F
994   IMAGE_REL_AMD64_SSPAN32   = 0x0010
995
996 class Relocs_Coff_ARM(Enum):
997   IMAGE_REL_ARM_ABSOLUTE  = 0x0000
998   IMAGE_REL_ARM_ADDR32    = 0x0001
999   IMAGE_REL_ARM_ADDR32NB  = 0x0002
1000   IMAGE_REL_ARM_BRANCH24  = 0x0003
1001   IMAGE_REL_ARM_BRANCH11  = 0x0004
1002   IMAGE_REL_ARM_TOKEN     = 0x0005
1003   IMAGE_REL_ARM_BLX24     = 0x0008
1004   IMAGE_REL_ARM_BLX11     = 0x0009
1005   IMAGE_REL_ARM_SECTION   = 0x000E
1006   IMAGE_REL_ARM_SECREL    = 0x000F
1007   IMAGE_REL_ARM_MOV32A    = 0x0010
1008   IMAGE_REL_ARM_MOV32T    = 0x0011
1009   IMAGE_REL_ARM_BRANCH20T = 0x0012
1010   IMAGE_REL_ARM_BRANCH24T = 0x0014
1011   IMAGE_REL_ARM_BLX23T    = 0x0015
1012
1013
1014 class Relocs_Macho_i386(Enum):
1015   RIT_Vanilla                     = 0
1016   RIT_Pair                        = 1
1017   RIT_Difference                  = 2
1018   RIT_Generic_PreboundLazyPointer = 3
1019   RIT_Generic_LocalDifference     = 4
1020   RIT_Generic_TLV                 = 5
1021
1022 class Relocs_Macho_X86_64(Enum):
1023   RIT_X86_64_Unsigned   = 0
1024   RIT_X86_64_Signed     = 1
1025   RIT_X86_64_Branch     = 2
1026   RIT_X86_64_GOTLoad    = 3
1027   RIT_X86_64_GOT        = 4
1028   RIT_X86_64_Subtractor = 5
1029   RIT_X86_64_Signed1    = 6
1030   RIT_X86_64_Signed2    = 7
1031   RIT_X86_64_Signed4    = 8
1032   RIT_X86_64_TLV        = 9
1033
1034 class Relocs_Macho_ARM(Enum):
1035   RIT_Vanilla                     = 0
1036   RIT_Pair                        = 1
1037   RIT_Difference                  = 2
1038   RIT_ARM_LocalDifference         = 3
1039   RIT_ARM_PreboundLazyPointer     = 4
1040   RIT_ARM_Branch24Bit             = 5
1041   RIT_ARM_ThumbBranch22Bit        = 6
1042   RIT_ARM_ThumbBranch32Bit        = 7
1043   RIT_ARM_Half                    = 8
1044   RIT_ARM_HalfDifference          = 9
1045
1046 class Relocs_Macho_PPC(Enum):
1047   PPC_RELOC_VANILLA        = 0
1048   PPC_RELOC_PAIR           = 1
1049   PPC_RELOC_BR14           = 2
1050   PPC_RELOC_BR24           = 3
1051   PPC_RELOC_HI16           = 4
1052   PPC_RELOC_LO16           = 5
1053   PPC_RELOC_HA16           = 6
1054   PPC_RELOC_LO14           = 7
1055   PPC_RELOC_SECTDIFF       = 8
1056   PPC_RELOC_PB_LA_PTR      = 9
1057   PPC_RELOC_HI16_SECTDIFF  = 10
1058   PPC_RELOC_LO16_SECTDIFF  = 11
1059   PPC_RELOC_HA16_SECTDIFF  = 12
1060   PPC_RELOC_JBSR           = 13
1061   PPC_RELOC_LO14_SECTDIFF  = 14
1062   PPC_RELOC_LOCAL_SECTDIFF = 15
1063
1064
1065 craftElf("relocs.obj.elf-x86_64",   "x86_64-pc-linux-gnu",         Relocs_Elf_X86_64.entries(), "leaq sym@GOTTPOFF(%rip), %rax")
1066 craftElf("relocs.obj.elf-i386",     "i386-pc-linux-gnu",           Relocs_Elf_i386.entries(),   "mov sym@GOTOFF(%ebx), %eax")
1067 #craftElf("relocs-elf-ppc32",   "powerpc-unknown-linux-gnu",   Relocs_Elf_PPC32.entries(), ...)
1068 craftElf("relocs.obj.elf-ppc64",   "powerpc64-unknown-linux-gnu", Relocs_Elf_PPC64.entries(),
1069          ("@t = thread_local global i32 0, align 4", "define i32* @f{0}() nounwind {{ ret i32* @t }}", 2))
1070 craftElf("relocs.obj.elf-aarch64",  "aarch64",                     Relocs_Elf_AArch64.entries(), "movz x0, #:abs_g0:sym")
1071 craftElf("relocs.obj.elf-arm",      "arm-unknown-unknown",         Relocs_Elf_ARM.entries(), "b sym")
1072 craftElf("relocs.obj.elf-mips",     "mips-unknown-linux",          Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)")
1073 craftElf("relocs.obj.elf-mips64el", "mips64el-unknown-linux",        Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)")
1074 #craftElf("relocs.obj.elf-mblaze",   "mblaze-unknown-unknown",      Relocs_Elf_MBlaze.entries(), ...)
1075 #craftElf("relocs.obj.elf-hexagon",  "hexagon-unknown-unknown",     Relocs_Elf_Hexagon.entries(), ...)
1076
1077 craftCoff("relocs.obj.coff-i386",   "i386-pc-win32",   Relocs_Coff_i386.entries(),   "mov foo@imgrel(%ebx, %ecx, 4), %eax")
1078 craftCoff("relocs.obj.coff-x86_64", "x86_64-pc-win32", Relocs_Coff_X86_64.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax")
1079 #craftCoff("relocs.obj.coff-arm",    "arm-pc-win32",    Relocs_Coff_ARM.entries(), "...")
1080
1081 craftMacho("relocs.obj.macho-i386",   "i386-apple-darwin9", Relocs_Macho_i386.entries(),
1082           ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1))
1083 craftMacho("relocs.obj.macho-x86_64", "x86_64-apple-darwin9", Relocs_Macho_X86_64.entries(),
1084           ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1))
1085 craftMacho("relocs.obj.macho-arm",    "armv7-apple-darwin10", Relocs_Macho_ARM.entries(), "bl sym")
1086 #craftMacho("relocs.obj.macho-ppc",   "powerpc-apple-darwin10", Relocs_Macho_PPC.entries(), ...)