kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }