reloc_aarch64.c (3443B)
1 /* RelocKind <-> AArch64 PE/COFF reloc-type mapping. Mirror of 2 * elf_reloc_aarch64.c for PE/COFF. 3 * 4 * The ARM64 PE/COFF reloc set covers the common AArch64 patch sites: 5 * ADRP page-base / page-offset pairs, BRANCH26/19/14, ADDR32/64, plus 6 * the section-relative SECREL family which kit does not model in v1. 7 * PAGEOFFSET_12L collapses all LDST*_ABS_LO12_NC widths into one wire 8 * code; the width is recoverable from the patched LDR/STR instruction 9 * encoding, so the reader picks the LDST64 form and the consumer can 10 * disambiguate later if it cares. */ 11 12 #include "obj/coff/coff.h" 13 14 u32 coff_aarch64_reloc_to(u32 kind /* RelocKind */) { 15 switch (kind) { 16 case R_NONE: 17 return IMAGE_REL_ARM64_ABSOLUTE; 18 case R_ABS64: 19 return IMAGE_REL_ARM64_ADDR64; 20 case R_ABS32: 21 return IMAGE_REL_ARM64_ADDR32; 22 case R_COFF_ADDR32NB: 23 return IMAGE_REL_ARM64_ADDR32NB; 24 case R_AARCH64_CALL26: 25 case R_AARCH64_JUMP26: 26 return IMAGE_REL_ARM64_BRANCH26; 27 case R_AARCH64_CONDBR19: 28 return IMAGE_REL_ARM64_BRANCH19; 29 case R_AARCH64_TSTBR14: 30 return IMAGE_REL_ARM64_BRANCH14; 31 case R_AARCH64_ADR_PREL_PG_HI21: 32 case R_AARCH64_ADR_PREL_PG_HI21_NC: 33 return IMAGE_REL_ARM64_PAGEBASE_REL21; 34 case R_AARCH64_ADR_PREL_LO21: 35 return IMAGE_REL_ARM64_REL21; 36 case R_AARCH64_ADD_ABS_LO12_NC: 37 return IMAGE_REL_ARM64_PAGEOFFSET_12A; 38 case R_AARCH64_LDST8_ABS_LO12_NC: 39 case R_AARCH64_LDST16_ABS_LO12_NC: 40 case R_AARCH64_LDST32_ABS_LO12_NC: 41 case R_AARCH64_LDST64_ABS_LO12_NC: 42 case R_AARCH64_LDST128_ABS_LO12_NC: 43 return IMAGE_REL_ARM64_PAGEOFFSET_12L; 44 case R_PC32: 45 case R_REL32: 46 return IMAGE_REL_ARM64_REL32; 47 case R_COFF_SECREL: 48 return IMAGE_REL_ARM64_SECREL; 49 case R_COFF_SECTION: 50 return IMAGE_REL_ARM64_SECTION; 51 case R_COFF_AARCH64_SECREL_LOW12A: 52 return IMAGE_REL_ARM64_SECREL_LOW12A; 53 case R_COFF_AARCH64_SECREL_HIGH12A: 54 return IMAGE_REL_ARM64_SECREL_HIGH12A; 55 case R_COFF_AARCH64_SECREL_LOW12L: 56 return IMAGE_REL_ARM64_SECREL_LOW12L; 57 default: 58 return IMAGE_REL_ARM64_ABSOLUTE; 59 } 60 } 61 62 u32 coff_aarch64_reloc_from(u32 wire_type) { 63 switch (wire_type) { 64 case IMAGE_REL_ARM64_ABSOLUTE: 65 return R_NONE; 66 case IMAGE_REL_ARM64_ADDR64: 67 return R_ABS64; 68 case IMAGE_REL_ARM64_ADDR32: 69 return R_ABS32; 70 case IMAGE_REL_ARM64_ADDR32NB: 71 return R_COFF_ADDR32NB; 72 case IMAGE_REL_ARM64_BRANCH26: 73 return R_AARCH64_CALL26; 74 case IMAGE_REL_ARM64_BRANCH19: 75 return R_AARCH64_CONDBR19; 76 case IMAGE_REL_ARM64_BRANCH14: 77 return R_AARCH64_TSTBR14; 78 case IMAGE_REL_ARM64_PAGEBASE_REL21: 79 return R_AARCH64_ADR_PREL_PG_HI21; 80 case IMAGE_REL_ARM64_REL21: 81 return R_AARCH64_ADR_PREL_LO21; 82 case IMAGE_REL_ARM64_PAGEOFFSET_12A: 83 return R_AARCH64_ADD_ABS_LO12_NC; 84 case IMAGE_REL_ARM64_PAGEOFFSET_12L: 85 return R_AARCH64_LDST64_ABS_LO12_NC; 86 case IMAGE_REL_ARM64_REL32: 87 return R_PC32; 88 case IMAGE_REL_ARM64_SECREL: 89 return R_COFF_SECREL; 90 case IMAGE_REL_ARM64_SECTION: 91 return R_COFF_SECTION; 92 case IMAGE_REL_ARM64_SECREL_LOW12A: 93 return R_COFF_AARCH64_SECREL_LOW12A; 94 case IMAGE_REL_ARM64_SECREL_HIGH12A: 95 return R_COFF_AARCH64_SECREL_HIGH12A; 96 case IMAGE_REL_ARM64_SECREL_LOW12L: 97 return R_COFF_AARCH64_SECREL_LOW12L; 98 default: 99 return (u32)-1; /* sentinel */ 100 } 101 }