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_PPC32(Enum): 537 R_PPC_NONE = 0 538 R_PPC_ADDR32 = 1 539 R_PPC_ADDR24 = 2 540 R_PPC_ADDR16 = 3 541 R_PPC_ADDR16_LO = 4 542 R_PPC_ADDR16_HI = 5 543 R_PPC_ADDR16_HA = 6 544 R_PPC_ADDR14 = 7 545 R_PPC_ADDR14_BRTAKEN = 8 546 R_PPC_ADDR14_BRNTAKEN = 9 547 R_PPC_REL24 = 10 548 R_PPC_REL14 = 11 549 R_PPC_REL14_BRTAKEN = 12 550 R_PPC_REL14_BRNTAKEN = 13 551 R_PPC_REL32 = 26 552 R_PPC_TPREL16_LO = 70 553 R_PPC_TPREL16_HA = 72 554 555 class Relocs_Elf_PPC64(Enum): 556 R_PPC64_NONE = 0 557 R_PPC64_ADDR32 = 1 558 R_PPC64_ADDR16_LO = 4 559 R_PPC64_ADDR16_HI = 5 560 R_PPC64_ADDR14 = 7 561 R_PPC64_REL24 = 10 562 R_PPC64_REL32 = 26 563 R_PPC64_ADDR64 = 38 564 R_PPC64_ADDR16_HIGHER = 39 565 R_PPC64_ADDR16_HIGHEST = 41 566 R_PPC64_REL64 = 44 567 R_PPC64_TOC16 = 47 568 R_PPC64_TOC16_LO = 48 569 R_PPC64_TOC16_HA = 50 570 R_PPC64_TOC = 51 571 R_PPC64_ADDR16_DS = 56 572 R_PPC64_ADDR16_LO_DS = 57 573 R_PPC64_TOC16_DS = 63 574 R_PPC64_TOC16_LO_DS = 64 575 R_PPC64_TLS = 67 576 R_PPC64_TPREL16_LO = 70 577 R_PPC64_TPREL16_HA = 72 578 R_PPC64_DTPREL16_LO = 75 579 R_PPC64_DTPREL16_HA = 77 580 R_PPC64_GOT_TLSGD16_LO = 80 581 R_PPC64_GOT_TLSGD16_HA = 82 582 R_PPC64_GOT_TLSLD16_LO = 84 583 R_PPC64_GOT_TLSLD16_HA = 86 584 R_PPC64_GOT_TPREL16_LO_DS = 88 585 R_PPC64_GOT_TPREL16_HA = 90 586 R_PPC64_TLSGD = 107 587 R_PPC64_TLSLD = 108 588 589 class Relocs_Elf_AArch64(Enum): 590 R_AARCH64_NONE = 0x100 591 R_AARCH64_ABS64 = 0x101 592 R_AARCH64_ABS32 = 0x102 593 R_AARCH64_ABS16 = 0x103 594 R_AARCH64_PREL64 = 0x104 595 R_AARCH64_PREL32 = 0x105 596 R_AARCH64_PREL16 = 0x106 597 R_AARCH64_MOVW_UABS_G0 = 0x107 598 R_AARCH64_MOVW_UABS_G0_NC = 0x108 599 R_AARCH64_MOVW_UABS_G1 = 0x109 600 R_AARCH64_MOVW_UABS_G1_NC = 0x10a 601 R_AARCH64_MOVW_UABS_G2 = 0x10b 602 R_AARCH64_MOVW_UABS_G2_NC = 0x10c 603 R_AARCH64_MOVW_UABS_G3 = 0x10d 604 R_AARCH64_MOVW_SABS_G0 = 0x10e 605 R_AARCH64_MOVW_SABS_G1 = 0x10f 606 R_AARCH64_MOVW_SABS_G2 = 0x110 607 R_AARCH64_LD_PREL_LO19 = 0x111 608 R_AARCH64_ADR_PREL_LO21 = 0x112 609 R_AARCH64_ADR_PREL_PG_HI21 = 0x113 610 R_AARCH64_ADD_ABS_LO12_NC = 0x115 611 R_AARCH64_LDST8_ABS_LO12_NC = 0x116 612 R_AARCH64_TSTBR14 = 0x117 613 R_AARCH64_CONDBR19 = 0x118 614 R_AARCH64_JUMP26 = 0x11a 615 R_AARCH64_CALL26 = 0x11b 616 R_AARCH64_LDST16_ABS_LO12_NC = 0x11c 617 R_AARCH64_LDST32_ABS_LO12_NC = 0x11d 618 R_AARCH64_LDST64_ABS_LO12_NC = 0x11e 619 R_AARCH64_LDST128_ABS_LO12_NC = 0x12b 620 R_AARCH64_ADR_GOT_PAGE = 0x137 621 R_AARCH64_LD64_GOT_LO12_NC = 0x138 622 R_AARCH64_TLSLD_MOVW_DTPREL_G2 = 0x20b 623 R_AARCH64_TLSLD_MOVW_DTPREL_G1 = 0x20c 624 R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC = 0x20d 625 R_AARCH64_TLSLD_MOVW_DTPREL_G0 = 0x20e 626 R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC = 0x20f 627 R_AARCH64_TLSLD_ADD_DTPREL_HI12 = 0x210 628 R_AARCH64_TLSLD_ADD_DTPREL_LO12 = 0x211 629 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC = 0x212 630 R_AARCH64_TLSLD_LDST8_DTPREL_LO12 = 0x213 631 R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC = 0x214 632 R_AARCH64_TLSLD_LDST16_DTPREL_LO12 = 0x215 633 R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC = 0x216 634 R_AARCH64_TLSLD_LDST32_DTPREL_LO12 = 0x217 635 R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC = 0x218 636 R_AARCH64_TLSLD_LDST64_DTPREL_LO12 = 0x219 637 R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC = 0x21a 638 R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 = 0x21b 639 R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC = 0x21c 640 R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 = 0x21d 641 R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 0x21e 642 R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 = 0x21f 643 R_AARCH64_TLSLE_MOVW_TPREL_G2 = 0x220 644 R_AARCH64_TLSLE_MOVW_TPREL_G1 = 0x221 645 R_AARCH64_TLSLE_MOVW_TPREL_G1_NC = 0x222 646 R_AARCH64_TLSLE_MOVW_TPREL_G0 = 0x223 647 R_AARCH64_TLSLE_MOVW_TPREL_G0_NC = 0x224 648 R_AARCH64_TLSLE_ADD_TPREL_HI12 = 0x225 649 R_AARCH64_TLSLE_ADD_TPREL_LO12 = 0x226 650 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC = 0x227 651 R_AARCH64_TLSLE_LDST8_TPREL_LO12 = 0x228 652 R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC = 0x229 653 R_AARCH64_TLSLE_LDST16_TPREL_LO12 = 0x22a 654 R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC = 0x22b 655 R_AARCH64_TLSLE_LDST32_TPREL_LO12 = 0x22c 656 R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC = 0x22d 657 R_AARCH64_TLSLE_LDST64_TPREL_LO12 = 0x22e 658 R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC = 0x22f 659 R_AARCH64_TLSDESC_ADR_PAGE = 0x232 660 R_AARCH64_TLSDESC_LD64_LO12_NC = 0x233 661 R_AARCH64_TLSDESC_ADD_LO12_NC = 0x234 662 R_AARCH64_TLSDESC_CALL = 0x239 663 664 class Relocs_Elf_ARM(Enum): 665 R_ARM_NONE = 0x00 666 R_ARM_PC24 = 0x01 667 R_ARM_ABS32 = 0x02 668 R_ARM_REL32 = 0x03 669 R_ARM_LDR_PC_G0 = 0x04 670 R_ARM_ABS16 = 0x05 671 R_ARM_ABS12 = 0x06 672 R_ARM_THM_ABS5 = 0x07 673 R_ARM_ABS8 = 0x08 674 R_ARM_SBREL32 = 0x09 675 R_ARM_THM_CALL = 0x0a 676 R_ARM_THM_PC8 = 0x0b 677 R_ARM_BREL_ADJ = 0x0c 678 R_ARM_TLS_DESC = 0x0d 679 R_ARM_THM_SWI8 = 0x0e 680 R_ARM_XPC25 = 0x0f 681 R_ARM_THM_XPC22 = 0x10 682 R_ARM_TLS_DTPMOD32 = 0x11 683 R_ARM_TLS_DTPOFF32 = 0x12 684 R_ARM_TLS_TPOFF32 = 0x13 685 R_ARM_COPY = 0x14 686 R_ARM_GLOB_DAT = 0x15 687 R_ARM_JUMP_SLOT = 0x16 688 R_ARM_RELATIVE = 0x17 689 R_ARM_GOTOFF32 = 0x18 690 R_ARM_BASE_PREL = 0x19 691 R_ARM_GOT_BREL = 0x1a 692 R_ARM_PLT32 = 0x1b 693 R_ARM_CALL = 0x1c 694 R_ARM_JUMP24 = 0x1d 695 R_ARM_THM_JUMP24 = 0x1e 696 R_ARM_BASE_ABS = 0x1f 697 R_ARM_ALU_PCREL_7_0 = 0x20 698 R_ARM_ALU_PCREL_15_8 = 0x21 699 R_ARM_ALU_PCREL_23_15 = 0x22 700 R_ARM_LDR_SBREL_11_0_NC = 0x23 701 R_ARM_ALU_SBREL_19_12_NC = 0x24 702 R_ARM_ALU_SBREL_27_20_CK = 0x25 703 R_ARM_TARGET1 = 0x26 704 R_ARM_SBREL31 = 0x27 705 R_ARM_V4BX = 0x28 706 R_ARM_TARGET2 = 0x29 707 R_ARM_PREL31 = 0x2a 708 R_ARM_MOVW_ABS_NC = 0x2b 709 R_ARM_MOVT_ABS = 0x2c 710 R_ARM_MOVW_PREL_NC = 0x2d 711 R_ARM_MOVT_PREL = 0x2e 712 R_ARM_THM_MOVW_ABS_NC = 0x2f 713 R_ARM_THM_MOVT_ABS = 0x30 714 R_ARM_THM_MOVW_PREL_NC = 0x31 715 R_ARM_THM_MOVT_PREL = 0x32 716 R_ARM_THM_JUMP19 = 0x33 717 R_ARM_THM_JUMP6 = 0x34 718 R_ARM_THM_ALU_PREL_11_0 = 0x35 719 R_ARM_THM_PC12 = 0x36 720 R_ARM_ABS32_NOI = 0x37 721 R_ARM_REL32_NOI = 0x38 722 R_ARM_ALU_PC_G0_NC = 0x39 723 R_ARM_ALU_PC_G0 = 0x3a 724 R_ARM_ALU_PC_G1_NC = 0x3b 725 R_ARM_ALU_PC_G1 = 0x3c 726 R_ARM_ALU_PC_G2 = 0x3d 727 R_ARM_LDR_PC_G1 = 0x3e 728 R_ARM_LDR_PC_G2 = 0x3f 729 R_ARM_LDRS_PC_G0 = 0x40 730 R_ARM_LDRS_PC_G1 = 0x41 731 R_ARM_LDRS_PC_G2 = 0x42 732 R_ARM_LDC_PC_G0 = 0x43 733 R_ARM_LDC_PC_G1 = 0x44 734 R_ARM_LDC_PC_G2 = 0x45 735 R_ARM_ALU_SB_G0_NC = 0x46 736 R_ARM_ALU_SB_G0 = 0x47 737 R_ARM_ALU_SB_G1_NC = 0x48 738 R_ARM_ALU_SB_G1 = 0x49 739 R_ARM_ALU_SB_G2 = 0x4a 740 R_ARM_LDR_SB_G0 = 0x4b 741 R_ARM_LDR_SB_G1 = 0x4c 742 R_ARM_LDR_SB_G2 = 0x4d 743 R_ARM_LDRS_SB_G0 = 0x4e 744 R_ARM_LDRS_SB_G1 = 0x4f 745 R_ARM_LDRS_SB_G2 = 0x50 746 R_ARM_LDC_SB_G0 = 0x51 747 R_ARM_LDC_SB_G1 = 0x52 748 R_ARM_LDC_SB_G2 = 0x53 749 R_ARM_MOVW_BREL_NC = 0x54 750 R_ARM_MOVT_BREL = 0x55 751 R_ARM_MOVW_BREL = 0x56 752 R_ARM_THM_MOVW_BREL_NC = 0x57 753 R_ARM_THM_MOVT_BREL = 0x58 754 R_ARM_THM_MOVW_BREL = 0x59 755 R_ARM_TLS_GOTDESC = 0x5a 756 R_ARM_TLS_CALL = 0x5b 757 R_ARM_TLS_DESCSEQ = 0x5c 758 R_ARM_THM_TLS_CALL = 0x5d 759 R_ARM_PLT32_ABS = 0x5e 760 R_ARM_GOT_ABS = 0x5f 761 R_ARM_GOT_PREL = 0x60 762 R_ARM_GOT_BREL12 = 0x61 763 R_ARM_GOTOFF12 = 0x62 764 R_ARM_GOTRELAX = 0x63 765 R_ARM_GNU_VTENTRY = 0x64 766 R_ARM_GNU_VTINHERIT = 0x65 767 R_ARM_THM_JUMP11 = 0x66 768 R_ARM_THM_JUMP8 = 0x67 769 R_ARM_TLS_GD32 = 0x68 770 R_ARM_TLS_LDM32 = 0x69 771 R_ARM_TLS_LDO32 = 0x6a 772 R_ARM_TLS_IE32 = 0x6b 773 R_ARM_TLS_LE32 = 0x6c 774 R_ARM_TLS_LDO12 = 0x6d 775 R_ARM_TLS_LE12 = 0x6e 776 R_ARM_TLS_IE12GP = 0x6f 777 R_ARM_PRIVATE_0 = 0x70 778 R_ARM_PRIVATE_1 = 0x71 779 R_ARM_PRIVATE_2 = 0x72 780 R_ARM_PRIVATE_3 = 0x73 781 R_ARM_PRIVATE_4 = 0x74 782 R_ARM_PRIVATE_5 = 0x75 783 R_ARM_PRIVATE_6 = 0x76 784 R_ARM_PRIVATE_7 = 0x77 785 R_ARM_PRIVATE_8 = 0x78 786 R_ARM_PRIVATE_9 = 0x79 787 R_ARM_PRIVATE_10 = 0x7a 788 R_ARM_PRIVATE_11 = 0x7b 789 R_ARM_PRIVATE_12 = 0x7c 790 R_ARM_PRIVATE_13 = 0x7d 791 R_ARM_PRIVATE_14 = 0x7e 792 R_ARM_PRIVATE_15 = 0x7f 793 R_ARM_ME_TOO = 0x80 794 R_ARM_THM_TLS_DESCSEQ16 = 0x81 795 R_ARM_THM_TLS_DESCSEQ32 = 0x82 796 797 class Relocs_Elf_Mips(Enum): 798 R_MIPS_NONE = 0 799 R_MIPS_16 = 1 800 R_MIPS_32 = 2 801 R_MIPS_REL32 = 3 802 R_MIPS_26 = 4 803 R_MIPS_HI16 = 5 804 R_MIPS_LO16 = 6 805 R_MIPS_GPREL16 = 7 806 R_MIPS_LITERAL = 8 807 R_MIPS_GOT16 = 9 808 R_MIPS_PC16 = 10 809 R_MIPS_CALL16 = 11 810 R_MIPS_GPREL32 = 12 811 R_MIPS_SHIFT5 = 16 812 R_MIPS_SHIFT6 = 17 813 R_MIPS_64 = 18 814 R_MIPS_GOT_DISP = 19 815 R_MIPS_GOT_PAGE = 20 816 R_MIPS_GOT_OFST = 21 817 R_MIPS_GOT_HI16 = 22 818 R_MIPS_GOT_LO16 = 23 819 R_MIPS_SUB = 24 820 R_MIPS_INSERT_A = 25 821 R_MIPS_INSERT_B = 26 822 R_MIPS_DELETE = 27 823 R_MIPS_HIGHER = 28 824 R_MIPS_HIGHEST = 29 825 R_MIPS_CALL_HI16 = 30 826 R_MIPS_CALL_LO16 = 31 827 R_MIPS_SCN_DISP = 32 828 R_MIPS_REL16 = 33 829 R_MIPS_ADD_IMMEDIATE = 34 830 R_MIPS_PJUMP = 35 831 R_MIPS_RELGOT = 36 832 R_MIPS_JALR = 37 833 R_MIPS_TLS_DTPMOD32 = 38 834 R_MIPS_TLS_DTPREL32 = 39 835 R_MIPS_TLS_DTPMOD64 = 40 836 R_MIPS_TLS_DTPREL64 = 41 837 R_MIPS_TLS_GD = 42 838 R_MIPS_TLS_LDM = 43 839 R_MIPS_TLS_DTPREL_HI16 = 44 840 R_MIPS_TLS_DTPREL_LO16 = 45 841 R_MIPS_TLS_GOTTPREL = 46 842 R_MIPS_TLS_TPREL32 = 47 843 R_MIPS_TLS_TPREL64 = 48 844 R_MIPS_TLS_TPREL_HI16 = 49 845 R_MIPS_TLS_TPREL_LO16 = 50 846 R_MIPS_GLOB_DAT = 51 847 R_MIPS_COPY = 126 848 R_MIPS_JUMP_SLOT = 127 849 R_MIPS_NUM = 218 850 851 class Relocs_Elf_Hexagon(Enum): 852 R_HEX_NONE = 0 853 R_HEX_B22_PCREL = 1 854 R_HEX_B15_PCREL = 2 855 R_HEX_B7_PCREL = 3 856 R_HEX_LO16 = 4 857 R_HEX_HI16 = 5 858 R_HEX_32 = 6 859 R_HEX_16 = 7 860 R_HEX_8 = 8 861 R_HEX_GPREL16_0 = 9 862 R_HEX_GPREL16_1 = 10 863 R_HEX_GPREL16_2 = 11 864 R_HEX_GPREL16_3 = 12 865 R_HEX_HL16 = 13 866 R_HEX_B13_PCREL = 14 867 R_HEX_B9_PCREL = 15 868 R_HEX_B32_PCREL_X = 16 869 R_HEX_32_6_X = 17 870 R_HEX_B22_PCREL_X = 18 871 R_HEX_B15_PCREL_X = 19 872 R_HEX_B13_PCREL_X = 20 873 R_HEX_B9_PCREL_X = 21 874 R_HEX_B7_PCREL_X = 22 875 R_HEX_16_X = 23 876 R_HEX_12_X = 24 877 R_HEX_11_X = 25 878 R_HEX_10_X = 26 879 R_HEX_9_X = 27 880 R_HEX_8_X = 28 881 R_HEX_7_X = 29 882 R_HEX_6_X = 30 883 R_HEX_32_PCREL = 31 884 R_HEX_COPY = 32 885 R_HEX_GLOB_DAT = 33 886 R_HEX_JMP_SLOT = 34 887 R_HEX_RELATIVE = 35 888 R_HEX_PLT_B22_PCREL = 36 889 R_HEX_GOTREL_LO16 = 37 890 R_HEX_GOTREL_HI16 = 38 891 R_HEX_GOTREL_32 = 39 892 R_HEX_GOT_LO16 = 40 893 R_HEX_GOT_HI16 = 41 894 R_HEX_GOT_32 = 42 895 R_HEX_GOT_16 = 43 896 R_HEX_DTPMOD_32 = 44 897 R_HEX_DTPREL_LO16 = 45 898 R_HEX_DTPREL_HI16 = 46 899 R_HEX_DTPREL_32 = 47 900 R_HEX_DTPREL_16 = 48 901 R_HEX_GD_PLT_B22_PCREL = 49 902 R_HEX_GD_GOT_LO16 = 50 903 R_HEX_GD_GOT_HI16 = 51 904 R_HEX_GD_GOT_32 = 52 905 R_HEX_GD_GOT_16 = 53 906 R_HEX_IE_LO16 = 54 907 R_HEX_IE_HI16 = 55 908 R_HEX_IE_32 = 56 909 R_HEX_IE_GOT_LO16 = 57 910 R_HEX_IE_GOT_HI16 = 58 911 R_HEX_IE_GOT_32 = 59 912 R_HEX_IE_GOT_16 = 60 913 R_HEX_TPREL_LO16 = 61 914 R_HEX_TPREL_HI16 = 62 915 R_HEX_TPREL_32 = 63 916 R_HEX_TPREL_16 = 64 917 R_HEX_6_PCREL_X = 65 918 R_HEX_GOTREL_32_6_X = 66 919 R_HEX_GOTREL_16_X = 67 920 R_HEX_GOTREL_11_X = 68 921 R_HEX_GOT_32_6_X = 69 922 R_HEX_GOT_16_X = 70 923 R_HEX_GOT_11_X = 71 924 R_HEX_DTPREL_32_6_X = 72 925 R_HEX_DTPREL_16_X = 73 926 R_HEX_DTPREL_11_X = 74 927 R_HEX_GD_GOT_32_6_X = 75 928 R_HEX_GD_GOT_16_X = 76 929 R_HEX_GD_GOT_11_X = 77 930 R_HEX_IE_32_6_X = 78 931 R_HEX_IE_16_X = 79 932 R_HEX_IE_GOT_32_6_X = 80 933 R_HEX_IE_GOT_16_X = 81 934 R_HEX_IE_GOT_11_X = 82 935 R_HEX_TPREL_32_6_X = 83 936 R_HEX_TPREL_16_X = 84 937 R_HEX_TPREL_11_X = 85 938 939 940 class Relocs_Coff_i386(Enum): 941 IMAGE_REL_I386_ABSOLUTE = 0x0000 942 IMAGE_REL_I386_DIR16 = 0x0001 943 IMAGE_REL_I386_REL16 = 0x0002 944 IMAGE_REL_I386_DIR32 = 0x0006 945 IMAGE_REL_I386_DIR32NB = 0x0007 946 IMAGE_REL_I386_SEG12 = 0x0009 947 IMAGE_REL_I386_SECTION = 0x000A 948 IMAGE_REL_I386_SECREL = 0x000B 949 IMAGE_REL_I386_TOKEN = 0x000C 950 IMAGE_REL_I386_SECREL7 = 0x000D 951 IMAGE_REL_I386_REL32 = 0x0014 952 953 class Relocs_Coff_X86_64(Enum): 954 IMAGE_REL_AMD64_ABSOLUTE = 0x0000 955 IMAGE_REL_AMD64_ADDR64 = 0x0001 956 IMAGE_REL_AMD64_ADDR32 = 0x0002 957 IMAGE_REL_AMD64_ADDR32NB = 0x0003 958 IMAGE_REL_AMD64_REL32 = 0x0004 959 IMAGE_REL_AMD64_REL32_1 = 0x0005 960 IMAGE_REL_AMD64_REL32_2 = 0x0006 961 IMAGE_REL_AMD64_REL32_3 = 0x0007 962 IMAGE_REL_AMD64_REL32_4 = 0x0008 963 IMAGE_REL_AMD64_REL32_5 = 0x0009 964 IMAGE_REL_AMD64_SECTION = 0x000A 965 IMAGE_REL_AMD64_SECREL = 0x000B 966 IMAGE_REL_AMD64_SECREL7 = 0x000C 967 IMAGE_REL_AMD64_TOKEN = 0x000D 968 IMAGE_REL_AMD64_SREL32 = 0x000E 969 IMAGE_REL_AMD64_PAIR = 0x000F 970 IMAGE_REL_AMD64_SSPAN32 = 0x0010 971 972 class Relocs_Coff_ARM(Enum): 973 IMAGE_REL_ARM_ABSOLUTE = 0x0000 974 IMAGE_REL_ARM_ADDR32 = 0x0001 975 IMAGE_REL_ARM_ADDR32NB = 0x0002 976 IMAGE_REL_ARM_BRANCH24 = 0x0003 977 IMAGE_REL_ARM_BRANCH11 = 0x0004 978 IMAGE_REL_ARM_TOKEN = 0x0005 979 IMAGE_REL_ARM_BLX24 = 0x0008 980 IMAGE_REL_ARM_BLX11 = 0x0009 981 IMAGE_REL_ARM_SECTION = 0x000E 982 IMAGE_REL_ARM_SECREL = 0x000F 983 IMAGE_REL_ARM_MOV32A = 0x0010 984 IMAGE_REL_ARM_MOV32T = 0x0011 985 IMAGE_REL_ARM_BRANCH20T = 0x0012 986 IMAGE_REL_ARM_BRANCH24T = 0x0014 987 IMAGE_REL_ARM_BLX23T = 0x0015 988 989 990 class Relocs_Macho_i386(Enum): 991 RIT_Vanilla = 0 992 RIT_Pair = 1 993 RIT_Difference = 2 994 RIT_Generic_PreboundLazyPointer = 3 995 RIT_Generic_LocalDifference = 4 996 RIT_Generic_TLV = 5 997 998 class Relocs_Macho_X86_64(Enum): 999 RIT_X86_64_Unsigned = 0 1000 RIT_X86_64_Signed = 1 1001 RIT_X86_64_Branch = 2 1002 RIT_X86_64_GOTLoad = 3 1003 RIT_X86_64_GOT = 4 1004 RIT_X86_64_Subtractor = 5 1005 RIT_X86_64_Signed1 = 6 1006 RIT_X86_64_Signed2 = 7 1007 RIT_X86_64_Signed4 = 8 1008 RIT_X86_64_TLV = 9 1009 1010 class Relocs_Macho_ARM(Enum): 1011 RIT_Vanilla = 0 1012 RIT_Pair = 1 1013 RIT_Difference = 2 1014 RIT_ARM_LocalDifference = 3 1015 RIT_ARM_PreboundLazyPointer = 4 1016 RIT_ARM_Branch24Bit = 5 1017 RIT_ARM_ThumbBranch22Bit = 6 1018 RIT_ARM_ThumbBranch32Bit = 7 1019 RIT_ARM_Half = 8 1020 RIT_ARM_HalfDifference = 9 1021 1022 class Relocs_Macho_PPC(Enum): 1023 PPC_RELOC_VANILLA = 0 1024 PPC_RELOC_PAIR = 1 1025 PPC_RELOC_BR14 = 2 1026 PPC_RELOC_BR24 = 3 1027 PPC_RELOC_HI16 = 4 1028 PPC_RELOC_LO16 = 5 1029 PPC_RELOC_HA16 = 6 1030 PPC_RELOC_LO14 = 7 1031 PPC_RELOC_SECTDIFF = 8 1032 PPC_RELOC_PB_LA_PTR = 9 1033 PPC_RELOC_HI16_SECTDIFF = 10 1034 PPC_RELOC_LO16_SECTDIFF = 11 1035 PPC_RELOC_HA16_SECTDIFF = 12 1036 PPC_RELOC_JBSR = 13 1037 PPC_RELOC_LO14_SECTDIFF = 14 1038 PPC_RELOC_LOCAL_SECTDIFF = 15 1039 1040 1041 craftElf("relocs.obj.elf-x86_64", "x86_64-pc-linux-gnu", Relocs_Elf_X86_64.entries(), "leaq sym@GOTTPOFF(%rip), %rax") 1042 craftElf("relocs.obj.elf-i386", "i386-pc-linux-gnu", Relocs_Elf_i386.entries(), "mov sym@GOTOFF(%ebx), %eax") 1043 #craftElf("relocs-elf-ppc32", "powerpc-unknown-linux-gnu", Relocs_Elf_PPC32.entries(), ...) 1044 craftElf("relocs.obj.elf-ppc64", "powerpc64-unknown-linux-gnu", Relocs_Elf_PPC64.entries(), 1045 ("@t = thread_local global i32 0, align 4", "define i32* @f{0}() nounwind {{ ret i32* @t }}", 2)) 1046 craftElf("relocs.obj.elf-aarch64", "aarch64", Relocs_Elf_AArch64.entries(), "movz x0, #:abs_g0:sym") 1047 craftElf("relocs.obj.elf-arm", "arm-unknown-unknown", Relocs_Elf_ARM.entries(), "b sym") 1048 craftElf("relocs.obj.elf-mips", "mips-unknown-linux", Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)") 1049 craftElf("relocs.obj.elf-mips64el", "mips64el-unknown-linux", Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)") 1050 #craftElf("relocs.obj.elf-hexagon", "hexagon-unknown-unknown", Relocs_Elf_Hexagon.entries(), ...) 1051 1052 craftCoff("relocs.obj.coff-i386", "i386-pc-win32", Relocs_Coff_i386.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax") 1053 craftCoff("relocs.obj.coff-x86_64", "x86_64-pc-win32", Relocs_Coff_X86_64.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax") 1054 #craftCoff("relocs.obj.coff-arm", "arm-pc-win32", Relocs_Coff_ARM.entries(), "...") 1055 1056 craftMacho("relocs.obj.macho-i386", "i386-apple-darwin9", Relocs_Macho_i386.entries(), 1057 ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1)) 1058 craftMacho("relocs.obj.macho-x86_64", "x86_64-apple-darwin9", Relocs_Macho_X86_64.entries(), 1059 ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1)) 1060 craftMacho("relocs.obj.macho-arm", "armv7-apple-darwin10", Relocs_Macho_ARM.entries(), "bl sym") 1061 #craftMacho("relocs.obj.macho-ppc", "powerpc-apple-darwin10", Relocs_Macho_PPC.entries(), ...) 1062