kit

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

reloc_aarch64.c (10466B)


      1 /* RelocKind <-> AArch64 ELF reloc-type mapping.
      2  *
      3  * Kit's RelocKind enum is arch-agnostic at its top (R_ABS, R_REL, R_PC
      4  * variants) and arch-specific in its lower entries. On AArch64, R_REL and
      5  * R_PC collapse to ELF_R_AARCH64_PREL32 / ELF_R_AARCH64_PREL64 — both
      6  * mean "PC-relative relative to the symbol" once the linker has resolved
      7  * final addresses.
      8  *
      9  * Returning 0 (ELF_R_AARCH64_NONE) for an unsupported kind is the signal
     10  * to the caller to either panic (emit) or panic (read with diagnostic). */
     11 
     12 #include "obj/elf/elf.h"
     13 
     14 u32 elf_aarch64_reloc_to(u32 kind /* RelocKind */) {
     15   switch (kind) {
     16     case R_NONE:
     17       return ELF_R_AARCH64_NONE;
     18     case R_ABS64:
     19       return ELF_R_AARCH64_ABS64;
     20     case R_ABS32:
     21       return ELF_R_AARCH64_ABS32;
     22     case R_PC64:
     23       return ELF_R_AARCH64_PREL64;
     24     case R_PC32:
     25       return ELF_R_AARCH64_PREL32;
     26     case R_REL64:
     27       return ELF_R_AARCH64_PREL64;
     28     case R_REL32:
     29       return ELF_R_AARCH64_PREL32;
     30     case R_AARCH64_JUMP26:
     31       return ELF_R_AARCH64_JUMP26;
     32     case R_AARCH64_CALL26:
     33       return ELF_R_AARCH64_CALL26;
     34     case R_AARCH64_CONDBR19:
     35       return ELF_R_AARCH64_CONDBR19;
     36     case R_AARCH64_TSTBR14:
     37       return ELF_R_AARCH64_TSTBR14;
     38     case R_AARCH64_LD_PREL_LO19:
     39       return ELF_R_AARCH64_LD_PREL_LO19;
     40     case R_AARCH64_ADR_PREL_LO21:
     41       return ELF_R_AARCH64_ADR_PREL_LO21;
     42     case R_AARCH64_ADR_PREL_PG_HI21:
     43       return ELF_R_AARCH64_ADR_PREL_PG_HI21;
     44     case R_AARCH64_ADR_PREL_PG_HI21_NC:
     45       return ELF_R_AARCH64_ADR_PREL_PG_HI21_NC;
     46     case R_AARCH64_ADD_ABS_LO12_NC:
     47       return ELF_R_AARCH64_ADD_ABS_LO12_NC;
     48     case R_ABS16:
     49       return ELF_R_AARCH64_ABS16;
     50     case R_PREL16:
     51       return ELF_R_AARCH64_PREL16;
     52     case R_AARCH64_LDST8_ABS_LO12_NC:
     53       return ELF_R_AARCH64_LDST8_ABS_LO12_NC;
     54     case R_AARCH64_LDST16_ABS_LO12_NC:
     55       return ELF_R_AARCH64_LDST16_ABS_LO12_NC;
     56     case R_AARCH64_LDST32_ABS_LO12_NC:
     57       return ELF_R_AARCH64_LDST32_ABS_LO12_NC;
     58     case R_AARCH64_LDST64_ABS_LO12_NC:
     59       return ELF_R_AARCH64_LDST64_ABS_LO12_NC;
     60     case R_AARCH64_LDST128_ABS_LO12_NC:
     61       return ELF_R_AARCH64_LDST128_ABS_LO12_NC;
     62     case R_AARCH64_ADR_GOT_PAGE:
     63       return ELF_R_AARCH64_ADR_GOT_PAGE;
     64     case R_AARCH64_LD64_GOT_LO12_NC:
     65       return ELF_R_AARCH64_LD64_GOT_LO12_NC;
     66     case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
     67       return ELF_R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21;
     68     case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
     69       return ELF_R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
     70     case R_AARCH64_TLSDESC_ADR_PAGE21:
     71       return ELF_R_AARCH64_TLSDESC_ADR_PAGE21;
     72     case R_AARCH64_TLSDESC_LD64_LO12:
     73       return ELF_R_AARCH64_TLSDESC_LD64_LO12;
     74     case R_AARCH64_TLSDESC_ADD_LO12:
     75       return ELF_R_AARCH64_TLSDESC_ADD_LO12;
     76     case R_AARCH64_TLSDESC_CALL:
     77       return ELF_R_AARCH64_TLSDESC_CALL;
     78     case R_AARCH64_TLSLE_ADD_TPREL_HI12:
     79       return ELF_R_AARCH64_TLSLE_ADD_TPREL_HI12;
     80     case R_AARCH64_TLSLE_ADD_TPREL_LO12:
     81       return ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12;
     82     case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
     83       return ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12_NC;
     84     case R_AARCH64_TLSLE_LDST8_TPREL_LO12:
     85       return ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12;
     86     case R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
     87       return ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC;
     88     case R_AARCH64_TLSLE_LDST16_TPREL_LO12:
     89       return ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12;
     90     case R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
     91       return ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC;
     92     case R_AARCH64_TLSLE_LDST32_TPREL_LO12:
     93       return ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12;
     94     case R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
     95       return ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC;
     96     case R_AARCH64_TLSLE_LDST64_TPREL_LO12:
     97       return ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12;
     98     case R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
     99       return ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC;
    100     case R_AARCH64_GLOB_DAT:
    101       return ELF_R_AARCH64_GLOB_DAT;
    102     case R_AARCH64_JUMP_SLOT:
    103       return ELF_R_AARCH64_JUMP_SLOT;
    104     case R_AARCH64_RELATIVE:
    105       return ELF_R_AARCH64_RELATIVE;
    106     case R_AARCH64_COPY:
    107       return ELF_R_AARCH64_COPY;
    108     default:
    109       return ELF_R_AARCH64_NONE;
    110   }
    111 }
    112 
    113 u32 elf_aarch64_reloc_from(u32 elf_type) {
    114   switch (elf_type) {
    115     case ELF_R_AARCH64_NONE:
    116       return R_NONE;
    117     case ELF_R_AARCH64_ABS64:
    118       return R_ABS64;
    119     case ELF_R_AARCH64_ABS32:
    120       return R_ABS32;
    121     case ELF_R_AARCH64_PREL64:
    122       return R_PC64;
    123     case ELF_R_AARCH64_PREL32:
    124       return R_PC32;
    125     case ELF_R_AARCH64_JUMP26:
    126       return R_AARCH64_JUMP26;
    127     case ELF_R_AARCH64_CALL26:
    128       return R_AARCH64_CALL26;
    129     case ELF_R_AARCH64_CONDBR19:
    130       return R_AARCH64_CONDBR19;
    131     case ELF_R_AARCH64_TSTBR14:
    132       return R_AARCH64_TSTBR14;
    133     case ELF_R_AARCH64_LD_PREL_LO19:
    134       return R_AARCH64_LD_PREL_LO19;
    135     case ELF_R_AARCH64_ADR_PREL_LO21:
    136       return R_AARCH64_ADR_PREL_LO21;
    137     case ELF_R_AARCH64_ADR_PREL_PG_HI21:
    138       return R_AARCH64_ADR_PREL_PG_HI21;
    139     case ELF_R_AARCH64_ADR_PREL_PG_HI21_NC:
    140       return R_AARCH64_ADR_PREL_PG_HI21_NC;
    141     case ELF_R_AARCH64_ADD_ABS_LO12_NC:
    142       return R_AARCH64_ADD_ABS_LO12_NC;
    143     case ELF_R_AARCH64_ABS16:
    144       return R_ABS16;
    145     case ELF_R_AARCH64_PREL16:
    146       return R_PREL16;
    147     case ELF_R_AARCH64_LDST8_ABS_LO12_NC:
    148       return R_AARCH64_LDST8_ABS_LO12_NC;
    149     case ELF_R_AARCH64_LDST16_ABS_LO12_NC:
    150       return R_AARCH64_LDST16_ABS_LO12_NC;
    151     case ELF_R_AARCH64_LDST32_ABS_LO12_NC:
    152       return R_AARCH64_LDST32_ABS_LO12_NC;
    153     case ELF_R_AARCH64_LDST64_ABS_LO12_NC:
    154       return R_AARCH64_LDST64_ABS_LO12_NC;
    155     case ELF_R_AARCH64_LDST128_ABS_LO12_NC:
    156       return R_AARCH64_LDST128_ABS_LO12_NC;
    157     case ELF_R_AARCH64_ADR_GOT_PAGE:
    158       return R_AARCH64_ADR_GOT_PAGE;
    159     case ELF_R_AARCH64_LD64_GOT_LO12_NC:
    160       return R_AARCH64_LD64_GOT_LO12_NC;
    161     case ELF_R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
    162       return R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21;
    163     case ELF_R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
    164       return R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
    165     case ELF_R_AARCH64_TLSDESC_ADR_PAGE21:
    166       return R_AARCH64_TLSDESC_ADR_PAGE21;
    167     case ELF_R_AARCH64_TLSDESC_LD64_LO12:
    168       return R_AARCH64_TLSDESC_LD64_LO12;
    169     case ELF_R_AARCH64_TLSDESC_ADD_LO12:
    170       return R_AARCH64_TLSDESC_ADD_LO12;
    171     case ELF_R_AARCH64_TLSDESC_CALL:
    172       return R_AARCH64_TLSDESC_CALL;
    173     case ELF_R_AARCH64_TLSLE_ADD_TPREL_HI12:
    174       return R_AARCH64_TLSLE_ADD_TPREL_HI12;
    175     case ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12:
    176       return R_AARCH64_TLSLE_ADD_TPREL_LO12;
    177     case ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
    178       return R_AARCH64_TLSLE_ADD_TPREL_LO12_NC;
    179     case ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12:
    180       return R_AARCH64_TLSLE_LDST8_TPREL_LO12;
    181     case ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
    182       return R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC;
    183     case ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12:
    184       return R_AARCH64_TLSLE_LDST16_TPREL_LO12;
    185     case ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
    186       return R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC;
    187     case ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12:
    188       return R_AARCH64_TLSLE_LDST32_TPREL_LO12;
    189     case ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
    190       return R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC;
    191     case ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12:
    192       return R_AARCH64_TLSLE_LDST64_TPREL_LO12;
    193     case ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
    194       return R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC;
    195     case ELF_R_AARCH64_GLOB_DAT:
    196       return R_AARCH64_GLOB_DAT;
    197     case ELF_R_AARCH64_JUMP_SLOT:
    198       return R_AARCH64_JUMP_SLOT;
    199     case ELF_R_AARCH64_RELATIVE:
    200       return R_AARCH64_RELATIVE;
    201     case ELF_R_AARCH64_COPY:
    202       return R_AARCH64_COPY;
    203     default:
    204       return (u32)-1; /* sentinel */
    205   }
    206 }
    207 
    208 /* Diagnostic spelling for an AArch64 ELF reloc *wire* type. Returns a
    209  * static literal, or NULL for an unknown type (caller falls back to the
    210  * format-neutral reloc_kind_name). Mirrors the wire-type set the reader
    211  * recognizes. */
    212 const char* elf_aarch64_reloc_name(u32 elf_type) {
    213   switch (elf_type) {
    214     case ELF_R_AARCH64_NONE:
    215       return "R_AARCH64_NONE";
    216     case ELF_R_AARCH64_ABS64:
    217       return "R_AARCH64_ABS64";
    218     case ELF_R_AARCH64_ABS32:
    219       return "R_AARCH64_ABS32";
    220     case ELF_R_AARCH64_ABS16:
    221       return "R_AARCH64_ABS16";
    222     case ELF_R_AARCH64_PREL64:
    223       return "R_AARCH64_PREL64";
    224     case ELF_R_AARCH64_PREL32:
    225       return "R_AARCH64_PREL32";
    226     case ELF_R_AARCH64_PREL16:
    227       return "R_AARCH64_PREL16";
    228     case ELF_R_AARCH64_JUMP26:
    229       return "R_AARCH64_JUMP26";
    230     case ELF_R_AARCH64_CALL26:
    231       return "R_AARCH64_CALL26";
    232     case ELF_R_AARCH64_CONDBR19:
    233       return "R_AARCH64_CONDBR19";
    234     case ELF_R_AARCH64_TSTBR14:
    235       return "R_AARCH64_TSTBR14";
    236     case ELF_R_AARCH64_LD_PREL_LO19:
    237       return "R_AARCH64_LD_PREL_LO19";
    238     case ELF_R_AARCH64_ADR_PREL_LO21:
    239       return "R_AARCH64_ADR_PREL_LO21";
    240     case ELF_R_AARCH64_ADR_PREL_PG_HI21:
    241       return "R_AARCH64_ADR_PREL_PG_HI21";
    242     case ELF_R_AARCH64_ADR_PREL_PG_HI21_NC:
    243       return "R_AARCH64_ADR_PREL_PG_HI21_NC";
    244     case ELF_R_AARCH64_ADD_ABS_LO12_NC:
    245       return "R_AARCH64_ADD_ABS_LO12_NC";
    246     case ELF_R_AARCH64_LDST8_ABS_LO12_NC:
    247       return "R_AARCH64_LDST8_ABS_LO12_NC";
    248     case ELF_R_AARCH64_LDST16_ABS_LO12_NC:
    249       return "R_AARCH64_LDST16_ABS_LO12_NC";
    250     case ELF_R_AARCH64_LDST32_ABS_LO12_NC:
    251       return "R_AARCH64_LDST32_ABS_LO12_NC";
    252     case ELF_R_AARCH64_LDST64_ABS_LO12_NC:
    253       return "R_AARCH64_LDST64_ABS_LO12_NC";
    254     case ELF_R_AARCH64_LDST128_ABS_LO12_NC:
    255       return "R_AARCH64_LDST128_ABS_LO12_NC";
    256     case ELF_R_AARCH64_ADR_GOT_PAGE:
    257       return "R_AARCH64_ADR_GOT_PAGE";
    258     case ELF_R_AARCH64_LD64_GOT_LO12_NC:
    259       return "R_AARCH64_LD64_GOT_LO12_NC";
    260     case ELF_R_AARCH64_TLSDESC_ADR_PAGE21:
    261       return "R_AARCH64_TLSDESC_ADR_PAGE21";
    262     case ELF_R_AARCH64_TLSDESC_LD64_LO12:
    263       return "R_AARCH64_TLSDESC_LD64_LO12";
    264     case ELF_R_AARCH64_TLSDESC_ADD_LO12:
    265       return "R_AARCH64_TLSDESC_ADD_LO12";
    266     case ELF_R_AARCH64_TLSDESC_CALL:
    267       return "R_AARCH64_TLSDESC_CALL";
    268     case ELF_R_AARCH64_GLOB_DAT:
    269       return "R_AARCH64_GLOB_DAT";
    270     case ELF_R_AARCH64_JUMP_SLOT:
    271       return "R_AARCH64_JUMP_SLOT";
    272     case ELF_R_AARCH64_RELATIVE:
    273       return "R_AARCH64_RELATIVE";
    274     case ELF_R_AARCH64_COPY:
    275       return "R_AARCH64_COPY";
    276     default:
    277       return NULL;
    278   }
    279 }