3 # Generates ELF, COFF and MachO object files for different architectures
4 # containing all relocations:
6 # ELF: i386, x86_64, ppc64, aarch64, arm, mips, mips64el
8 # MachO: i386, x86_64, arm
9 # (see end of file for triples)
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.
23 def __init__(self
, name
, bases
= (), attributes
= {}):
24 super(EnumType
, self
).__init
__(name
, bases
, attributes
)
26 type.__setattr
__(self
, '_map', {})
27 type.__setattr
__(self
, '_nameMap', {})
29 for symbol
in attributes
:
30 if symbol
.startswith('__') or symbol
.endswith('__'):
33 value
= attributes
[symbol
]
35 # MyEnum.symbol == value
36 type.__setattr
__(self
, symbol
, value
)
37 self
._nameMap
[symbol
] = value
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
44 # Not supported (Enums are immutable).
45 def __setattr__(self
, name
, value
):
46 raise NotSupportedException
, self
.__setattr
__
48 # Not supported (Enums are immutable).
49 def __delattr__(self
, name
):
50 raise NotSupportedException
, self
.__delattr
__
52 # Gets the enum symbol for the specified value.
53 def __getitem__(self
, value
):
54 symbol
= self
._map
.get(value
)
59 # Gets the enum symbol for the specified value or none.
60 def lookup(self
, value
):
61 symbol
= self
._map
.get(value
)
64 # Not supported (Enums are immutable).
65 def __setitem__(self
, value
, symbol
):
66 raise NotSupportedException
, self
.__setitem
__
68 # Not supported (Enums are immutable).
69 def __delitem__(self
, value
):
70 raise NotSupportedException
, self
.__delitem
__
73 # sort by (value, name)
75 return (item
[1], item
[0])
77 for pair
in sorted(self
._nameMap
.iteritems(), key
=makeKey
):
82 for e
in self
.entries():
85 Enum
= EnumType('Enum', (), {})
88 def __init__(self
, path
):
89 self
.file = open(path
, "r+b", 0)
95 return self
.file.tell()
101 data
= self
.file.read(N
)
103 raise ValueError, "Out of data!"
107 return ord(self
.read(1))
110 return ord(self
.read(1))
113 return struct
.unpack('><'[self
.isLSB
] + 'h', self
.read(2))[0]
116 return struct
.unpack('><'[self
.isLSB
] + 'H', self
.read(2))[0]
119 return struct
.unpack('><'[self
.isLSB
] + 'i', self
.read(4))[0]
122 return struct
.unpack('><'[self
.isLSB
] + 'I', self
.read(4))[0]
125 return struct
.unpack('><'[self
.isLSB
] + 'q', self
.read(8))[0]
128 return struct
.unpack('><'[self
.isLSB
] + 'Q', self
.read(8))[0]
130 def writeUInt8(self
, value
):
131 self
.file.write(struct
.pack('><'[self
.isLSB
] + 'B', value
))
133 def writeUInt16(self
, value
):
134 self
.file.write(struct
.pack('><'[self
.isLSB
] + 'H', value
))
136 def writeUInt32(self
, value
):
137 self
.file.write(struct
.pack('><'[self
.isLSB
] + 'I', value
))
139 def writeUInt64(self
, value
):
140 self
.file.write(struct
.pack('><'[self
.isLSB
] + 'Q', value
))
148 def writeWord(self
, value
):
150 self
.writeUInt64(value
)
152 self
.writeUInt32(value
)
155 def __init__(self
, strings
):
156 self
.string_table
= strings
158 def __getitem__(self
, index
):
159 end
= self
.string_table
.index('\x00', index
)
160 return self
.string_table
[index
:end
]
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()
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
)
179 def patchRelocs(self
, f
, relocs
):
180 entries
= self
.sh_size
// self
.sh_entsize
182 for index
in range(entries
):
183 f
.seek(self
.sh_offset
+ index
* self
.sh_entsize
)
186 if index
< len(relocs
):
195 f
.writeUInt8(relocs
[ri
][1])
196 f
.writeUInt8(relocs
[ri
][1])
197 f
.writeUInt8(relocs
[ri
][1])
202 r_type
= relocs
[ri
][1]
204 r_info
= (r_info
& 0xFFFFFFFF00000000) |
(r_type
& 0xFFFFFFFF)
206 r_info
= (r_info
& 0xFF00) |
(r_type
& 0xFF)
208 print(" %s" % relocs
[ri
][0])
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()
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
)
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
)
242 def craftElf(filename
, triple
, relocs
, dummyReloc
):
243 print("Crafting " + filename
+ " for " + triple
)
244 if type(dummyReloc
) is tuple:
245 preSrc
, dummyReloc
, relocsPerDummy
= dummyReloc
247 for i
in range((len(relocs
) + relocsPerDummy
- 1) / relocsPerDummy
):
248 src
+= dummyReloc
.format(i
) + "\n"
249 compileIR(filename
, triple
, src
)
251 src
= (dummyReloc
+ "\n") * len(relocs
)
252 compileAsm(filename
, triple
, src
)
254 print(" Patching relocations...")
255 patchElf(filename
, relocs
)
257 def patchElf(path
, relocs
):
258 f
= BinaryReader(path
)
261 assert magic
== '\x7FELF'
263 fileclass
= f
.uint8()
269 raise ValueError, "Unknown file class %x" % fileclass
271 byteordering
= f
.uint8()
272 if byteordering
== 1:
274 elif byteordering
== 2:
277 raise ValueError, "Unknown byte ordering %x" % byteordering
280 e_machine
= f
.uint16()
281 if e_machine
== 0x0008 and f
.is64Bit
: # EM_MIPS && 64 bit
284 e_version
= f
.uint32()
289 e_ehsize
= f
.uint16()
290 e_phentsize
= f
.uint16()
292 e_shentsize
= f
.uint16()
294 e_shstrndx
= f
.uint16()
297 for index
in range(e_shnum
):
298 f
.seek(e_shoff
+ index
* e_shentsize
)
302 f
.seek(sections
[e_shstrndx
].sh_offset
)
303 shstrtab
= StringTable(f
.read(sections
[e_shstrndx
].sh_size
))
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
))
312 for index
in range(e_shnum
):
313 sections
[index
].patch(f
, relocs
)
316 def craftCoff(filename
, triple
, relocs
, dummyReloc
):
317 print("Crafting " + filename
+ " for " + triple
)
318 src
= (dummyReloc
+ "\n") * len(relocs
)
319 compileAsm(filename
, triple
, src
)
321 print(" Patching relocations...")
322 patchCoff(filename
, relocs
)
324 def patchCoff(path
, relocs
):
325 f
= BinaryReader(path
)
328 machine_type
= f
.uint16()
329 section_count
= f
.uint16()
331 # Zero out timestamp to prevent churn when regenerating COFF files.
335 sections
= [CoffSection(f
) for idx
in range(section_count
)]
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])
346 def craftMacho(filename
, triple
, relocs
, dummyReloc
):
347 print("Crafting " + filename
+ " for " + triple
)
349 if type(dummyReloc
) is tuple:
350 srcType
, preSrc
, dummyReloc
, relocsPerDummy
= dummyReloc
352 for i
in range((len(relocs
) + relocsPerDummy
- 1) / relocsPerDummy
):
353 src
+= dummyReloc
.format(i
) + "\n"
355 compileAsm(filename
, triple
, src
)
356 elif srcType
== "ir":
357 compileIR(filename
, triple
, src
)
359 src
= (dummyReloc
+ "\n") * len(relocs
)
360 compileAsm(filename
, triple
, src
)
362 print(" Patching relocations...")
363 patchMacho(filename
, relocs
)
365 def patchMacho(filename
, relocs
):
366 f
= BinaryReader(filename
)
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
378 raise ValueError,"Not a Mach-O object file: %r (bad magic)" % path
381 cpusubtype
= f
.uint32()
382 filetype
= f
.uint32()
383 numLoadCommands
= f
.uint32()
384 loadCommandsSize
= f
.uint32()
387 reserved
= f
.uint32()
391 for i
in range(numLoadCommands
):
392 patchMachoLoadCommand(f
, relocs
)
394 if f
.tell() - start
!= loadCommandsSize
:
395 raise ValueError,"%s: warning: invalid load commands size: %r" % (
396 sys
.argv
[0], loadCommandsSize
)
398 def patchMachoLoadCommand(f
, relocs
):
404 patchMachoSegmentLoadCommand(f
, relocs
)
406 patchMachoSegmentLoadCommand(f
, relocs
)
410 if f
.tell() - start
!= cmdSize
:
411 raise ValueError,"%s: warning: invalid load command size: %r" % (
412 sys
.argv
[0], cmdSize
)
414 def patchMachoSegmentLoadCommand(f
, relocs
):
415 segment_name
= f
.read(16)
418 file_offset
= f
.word()
421 initprot
= f
.uint32()
422 numSections
= f
.uint32()
424 for i
in range(numSections
):
425 patchMachoSection(f
, relocs
)
427 def patchMachoSection(f
, relocs
):
428 section_name
= f
.read(16)
429 segment_name
= f
.read(16)
433 alignment
= f
.uint32()
434 relocOffset
= f
.uint32()
435 numReloc
= f
.uint32()
437 reserved1
= f
.uint32()
438 reserved2
= f
.uint32()
440 reserved3
= f
.uint32()
445 for i
in range(numReloc
):
446 ri
= i
< len(relocs
) and i
or 0
447 print(" %s" % relocs
[ri
][0])
452 value
= (value
& 0x0FFFFFFF) |
((relocs
[ri
][1] & 0xF) << 28)
457 class Relocs_Elf_X86_64(Enum
):
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
474 R_X86_64_DTPMOD64
= 16
475 R_X86_64_DTPOFF64
= 17
476 R_X86_64_TPOFF64
= 18
479 R_X86_64_DTPOFF32
= 21
480 R_X86_64_GOTTPOFF
= 22
481 R_X86_64_TPOFF32
= 23
483 R_X86_64_GOTOFF64
= 25
484 R_X86_64_GOTPC32
= 26
486 R_X86_64_GOTPCREL64
= 28
487 R_X86_64_GOTPC64
= 29
488 R_X86_64_GOTPLT64
= 30
489 R_X86_64_PLTOFF64
= 31
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
497 class Relocs_Elf_i386(Enum
):
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
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
540 class Relocs_Elf_PPC32(Enum
):
549 R_PPC_ADDR14_BRTAKEN
= 8
550 R_PPC_ADDR14_BRNTAKEN
= 9
553 R_PPC_REL14_BRTAKEN
= 12
554 R_PPC_REL14_BRNTAKEN
= 13
556 R_PPC_TPREL16_LO
= 70
557 R_PPC_TPREL16_HA
= 72
559 class Relocs_Elf_PPC64(Enum
):
562 R_PPC64_ADDR16_LO
= 4
563 R_PPC64_ADDR16_HI
= 5
568 R_PPC64_ADDR16_HIGHER
= 39
569 R_PPC64_ADDR16_HIGHEST
= 41
572 R_PPC64_TOC16_LO
= 48
573 R_PPC64_TOC16_HA
= 50
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
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
593 class Relocs_Elf_AArch64(Enum
):
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
718 class Relocs_Elf_ARM(Enum
):
723 R_ARM_LDR_PC_G0
= 0x04
726 R_ARM_THM_ABS5
= 0x07
729 R_ARM_THM_CALL
= 0x0a
731 R_ARM_BREL_ADJ
= 0x0c
732 R_ARM_TLS_DESC
= 0x0d
733 R_ARM_THM_SWI8
= 0x0e
735 R_ARM_THM_XPC22
= 0x10
736 R_ARM_TLS_DTPMOD32
= 0x11
737 R_ARM_TLS_DTPOFF32
= 0x12
738 R_ARM_TLS_TPOFF32
= 0x13
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
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
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
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
848 R_ARM_THM_TLS_DESCSEQ16
= 0x81
849 R_ARM_THM_TLS_DESCSEQ32
= 0x82
850 R_ARM_IRELATIVE
= 0xa0
852 class Relocs_Elf_Mips(Enum
):
880 R_MIPS_CALL_HI16
= 30
881 R_MIPS_CALL_LO16
= 31
884 R_MIPS_ADD_IMMEDIATE
= 34
888 R_MIPS_TLS_DTPMOD32
= 38
889 R_MIPS_TLS_DTPREL32
= 39
890 R_MIPS_TLS_DTPMOD64
= 40
891 R_MIPS_TLS_DTPREL64
= 41
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
903 R_MIPS_JUMP_SLOT
= 127
906 class Relocs_Elf_Hexagon(Enum
):
923 R_HEX_B32_PCREL_X
= 16
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
943 R_HEX_PLT_B22_PCREL
= 36
944 R_HEX_GOTREL_LO16
= 37
945 R_HEX_GOTREL_HI16
= 38
952 R_HEX_DTPREL_LO16
= 45
953 R_HEX_DTPREL_HI16
= 46
956 R_HEX_GD_PLT_B22_PCREL
= 49
957 R_HEX_GD_GOT_LO16
= 50
958 R_HEX_GD_GOT_HI16
= 51
964 R_HEX_IE_GOT_LO16
= 57
965 R_HEX_IE_GOT_HI16
= 58
968 R_HEX_TPREL_LO16
= 61
969 R_HEX_TPREL_HI16
= 62
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
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
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
995 class Relocs_Coff_i386(Enum
):
996 IMAGE_REL_I386_ABSOLUTE
= 0x0000
997 IMAGE_REL_I386_DIR16
= 0x0001
998 IMAGE_REL_I386_REL16
= 0x0002
999 IMAGE_REL_I386_DIR32
= 0x0006
1000 IMAGE_REL_I386_DIR32NB
= 0x0007
1001 IMAGE_REL_I386_SEG12
= 0x0009
1002 IMAGE_REL_I386_SECTION
= 0x000A
1003 IMAGE_REL_I386_SECREL
= 0x000B
1004 IMAGE_REL_I386_TOKEN
= 0x000C
1005 IMAGE_REL_I386_SECREL7
= 0x000D
1006 IMAGE_REL_I386_REL32
= 0x0014
1008 class Relocs_Coff_X86_64(Enum
):
1009 IMAGE_REL_AMD64_ABSOLUTE
= 0x0000
1010 IMAGE_REL_AMD64_ADDR64
= 0x0001
1011 IMAGE_REL_AMD64_ADDR32
= 0x0002
1012 IMAGE_REL_AMD64_ADDR32NB
= 0x0003
1013 IMAGE_REL_AMD64_REL32
= 0x0004
1014 IMAGE_REL_AMD64_REL32_1
= 0x0005
1015 IMAGE_REL_AMD64_REL32_2
= 0x0006
1016 IMAGE_REL_AMD64_REL32_3
= 0x0007
1017 IMAGE_REL_AMD64_REL32_4
= 0x0008
1018 IMAGE_REL_AMD64_REL32_5
= 0x0009
1019 IMAGE_REL_AMD64_SECTION
= 0x000A
1020 IMAGE_REL_AMD64_SECREL
= 0x000B
1021 IMAGE_REL_AMD64_SECREL7
= 0x000C
1022 IMAGE_REL_AMD64_TOKEN
= 0x000D
1023 IMAGE_REL_AMD64_SREL32
= 0x000E
1024 IMAGE_REL_AMD64_PAIR
= 0x000F
1025 IMAGE_REL_AMD64_SSPAN32
= 0x0010
1027 class Relocs_Coff_ARM(Enum
):
1028 IMAGE_REL_ARM_ABSOLUTE
= 0x0000
1029 IMAGE_REL_ARM_ADDR32
= 0x0001
1030 IMAGE_REL_ARM_ADDR32NB
= 0x0002
1031 IMAGE_REL_ARM_BRANCH24
= 0x0003
1032 IMAGE_REL_ARM_BRANCH11
= 0x0004
1033 IMAGE_REL_ARM_TOKEN
= 0x0005
1034 IMAGE_REL_ARM_BLX24
= 0x0008
1035 IMAGE_REL_ARM_BLX11
= 0x0009
1036 IMAGE_REL_ARM_SECTION
= 0x000E
1037 IMAGE_REL_ARM_SECREL
= 0x000F
1038 IMAGE_REL_ARM_MOV32A
= 0x0010
1039 IMAGE_REL_ARM_MOV32T
= 0x0011
1040 IMAGE_REL_ARM_BRANCH20T
= 0x0012
1041 IMAGE_REL_ARM_BRANCH24T
= 0x0014
1042 IMAGE_REL_ARM_BLX23T
= 0x0015
1045 class Relocs_Macho_i386(Enum
):
1049 RIT_Generic_PreboundLazyPointer
= 3
1050 RIT_Generic_LocalDifference
= 4
1053 class Relocs_Macho_X86_64(Enum
):
1054 RIT_X86_64_Unsigned
= 0
1055 RIT_X86_64_Signed
= 1
1056 RIT_X86_64_Branch
= 2
1057 RIT_X86_64_GOTLoad
= 3
1059 RIT_X86_64_Subtractor
= 5
1060 RIT_X86_64_Signed1
= 6
1061 RIT_X86_64_Signed2
= 7
1062 RIT_X86_64_Signed4
= 8
1065 class Relocs_Macho_ARM(Enum
):
1069 RIT_ARM_LocalDifference
= 3
1070 RIT_ARM_PreboundLazyPointer
= 4
1071 RIT_ARM_Branch24Bit
= 5
1072 RIT_ARM_ThumbBranch22Bit
= 6
1073 RIT_ARM_ThumbBranch32Bit
= 7
1075 RIT_ARM_HalfDifference
= 9
1077 class Relocs_Macho_PPC(Enum
):
1078 PPC_RELOC_VANILLA
= 0
1086 PPC_RELOC_SECTDIFF
= 8
1087 PPC_RELOC_PB_LA_PTR
= 9
1088 PPC_RELOC_HI16_SECTDIFF
= 10
1089 PPC_RELOC_LO16_SECTDIFF
= 11
1090 PPC_RELOC_HA16_SECTDIFF
= 12
1092 PPC_RELOC_LO14_SECTDIFF
= 14
1093 PPC_RELOC_LOCAL_SECTDIFF
= 15
1096 craftElf("relocs.obj.elf-x86_64", "x86_64-pc-linux-gnu", Relocs_Elf_X86_64
.entries(), "leaq sym@GOTTPOFF(%rip), %rax")
1097 craftElf("relocs.obj.elf-i386", "i386-pc-linux-gnu", Relocs_Elf_i386
.entries(), "mov sym@GOTOFF(%ebx), %eax")
1098 #craftElf("relocs-elf-ppc32", "powerpc-unknown-linux-gnu", Relocs_Elf_PPC32.entries(), ...)
1099 craftElf("relocs.obj.elf-ppc64", "powerpc64-unknown-linux-gnu", Relocs_Elf_PPC64
.entries(),
1100 ("@t = thread_local global i32 0, align 4", "define i32* @f{0}() nounwind {{ ret i32* @t }}", 2))
1101 craftElf("relocs.obj.elf-aarch64", "aarch64", Relocs_Elf_AArch64
.entries(), "movz x0, #:abs_g0:sym")
1102 craftElf("relocs.obj.elf-arm", "arm-unknown-unknown", Relocs_Elf_ARM
.entries(), "b sym")
1103 craftElf("relocs.obj.elf-mips", "mips-unknown-linux", Relocs_Elf_Mips
.entries(), "lui $2, %hi(sym)")
1104 craftElf("relocs.obj.elf-mips64el", "mips64el-unknown-linux", Relocs_Elf_Mips
.entries(), "lui $2, %hi(sym)")
1105 #craftElf("relocs.obj.elf-hexagon", "hexagon-unknown-unknown", Relocs_Elf_Hexagon.entries(), ...)
1107 craftCoff("relocs.obj.coff-i386", "i386-pc-win32", Relocs_Coff_i386
.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax")
1108 craftCoff("relocs.obj.coff-x86_64", "x86_64-pc-win32", Relocs_Coff_X86_64
.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax")
1109 #craftCoff("relocs.obj.coff-arm", "arm-pc-win32", Relocs_Coff_ARM.entries(), "...")
1111 craftMacho("relocs.obj.macho-i386", "i386-apple-darwin9", Relocs_Macho_i386
.entries(),
1112 ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1))
1113 craftMacho("relocs.obj.macho-x86_64", "x86_64-apple-darwin9", Relocs_Macho_X86_64
.entries(),
1114 ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1))
1115 craftMacho("relocs.obj.macho-arm", "armv7-apple-darwin10", Relocs_Macho_ARM
.entries(), "bl sym")
1116 #craftMacho("relocs.obj.macho-ppc", "powerpc-apple-darwin10", Relocs_Macho_PPC.entries(), ...)