reloc_aarch64.c (3277B)
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 default: 56 return IMAGE_REL_ARM64_ABSOLUTE; 57 } 58 } 59 60 u32 coff_aarch64_reloc_from(u32 wire_type) { 61 switch (wire_type) { 62 case IMAGE_REL_ARM64_ABSOLUTE: 63 return R_NONE; 64 case IMAGE_REL_ARM64_ADDR64: 65 return R_ABS64; 66 case IMAGE_REL_ARM64_ADDR32: 67 return R_ABS32; 68 case IMAGE_REL_ARM64_ADDR32NB: 69 return R_COFF_ADDR32NB; 70 case IMAGE_REL_ARM64_BRANCH26: 71 return R_AARCH64_CALL26; 72 case IMAGE_REL_ARM64_BRANCH19: 73 return R_AARCH64_CONDBR19; 74 case IMAGE_REL_ARM64_BRANCH14: 75 return R_AARCH64_TSTBR14; 76 case IMAGE_REL_ARM64_PAGEBASE_REL21: 77 return R_AARCH64_ADR_PREL_PG_HI21; 78 case IMAGE_REL_ARM64_REL21: 79 return R_AARCH64_ADR_PREL_LO21; 80 case IMAGE_REL_ARM64_PAGEOFFSET_12A: 81 return R_AARCH64_ADD_ABS_LO12_NC; 82 case IMAGE_REL_ARM64_PAGEOFFSET_12L: 83 return R_AARCH64_LDST64_ABS_LO12_NC; 84 case IMAGE_REL_ARM64_REL32: 85 return R_PC32; 86 case IMAGE_REL_ARM64_SECREL: 87 return R_COFF_SECREL; 88 case IMAGE_REL_ARM64_SECTION: 89 return R_COFF_SECTION; 90 case IMAGE_REL_ARM64_SECREL_LOW12A: 91 return R_COFF_AARCH64_SECREL_LOW12A; 92 case IMAGE_REL_ARM64_SECREL_HIGH12A: 93 return R_COFF_AARCH64_SECREL_HIGH12A; 94 default: 95 return (u32)-1; /* sentinel */ 96 } 97 }