kit

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

reloc_x86_64.c (5880B)


      1 /* RelocKind <-> x86_64 ELF reloc-type mapping.
      2  *
      3  * Mirror of elf_reloc_aarch64.c for the x86_64 SysV ABI. The arch-
      4  * agnostic R_ABS / R_PC / R_REL RelocKind entries fan out to the
      5  * native x86_64 codes; the x86_64-only encodings (R_X64_PC8, PLT32,
      6  * GOTPCREL, dynamic-only entries) live in the lower band.
      7  *
      8  * Returning ELF_R_X86_64_NONE for an unsupported kind is the signal
      9  * to the caller to either panic (emit) or panic (read with diagnostic). */
     10 
     11 #include "obj/elf/elf.h"
     12 
     13 u32 elf_x86_64_reloc_to(u32 kind /* RelocKind */) {
     14   switch (kind) {
     15     case R_NONE:
     16       return ELF_R_X86_64_NONE;
     17     case R_ABS64:
     18       return ELF_R_X86_64_64;
     19     case R_ABS32:
     20       return ELF_R_X86_64_32;
     21     case R_X64_32S:
     22       return ELF_R_X86_64_32S;
     23     case R_PC32:
     24       return ELF_R_X86_64_PC32;
     25     case R_PC64:
     26       return ELF_R_X86_64_PC64;
     27     case R_REL32:
     28       return ELF_R_X86_64_PC32;
     29     case R_REL64:
     30       return ELF_R_X86_64_PC64;
     31     case R_X64_PC8:
     32       return ELF_R_X86_64_PC8;
     33     case R_PLT32:
     34     case R_X64_PLT32:
     35       return ELF_R_X86_64_PLT32;
     36     case R_GOT32:
     37       return ELF_R_X86_64_GOT32;
     38     case R_X64_GOTPCREL:
     39       return ELF_R_X86_64_GOTPCREL;
     40     case R_X64_GOTPCRELX:
     41       return ELF_R_X86_64_GOTPCRELX;
     42     case R_X64_REX_GOTPCRELX:
     43       return ELF_R_X86_64_REX_GOTPCRELX;
     44     case R_X64_GOTPC32:
     45       return ELF_R_X86_64_GOTPC32;
     46     case R_X64_GOTOFF64:
     47       return ELF_R_X86_64_GOTOFF64;
     48     case R_X64_TPOFF32:
     49       return ELF_R_X86_64_TPOFF32;
     50     case R_TPOFF64:
     51       return ELF_R_X86_64_TPOFF64;
     52     case R_X64_DTPOFF32:
     53       return ELF_R_X86_64_DTPOFF32;
     54     case R_X64_DTPMOD64:
     55       return ELF_R_X86_64_DTPMOD64;
     56     case R_X64_DTPOFF64:
     57       return ELF_R_X86_64_DTPOFF64;
     58     case R_X64_TLSGD:
     59       return ELF_R_X86_64_TLSGD;
     60     case R_X64_TLSLD:
     61       return ELF_R_X86_64_TLSLD;
     62     case R_X64_GOTTPOFF:
     63       return ELF_R_X86_64_GOTTPOFF;
     64     case R_X64_GLOB_DAT:
     65       return ELF_R_X86_64_GLOB_DAT;
     66     case R_X64_JUMP_SLOT:
     67       return ELF_R_X86_64_JUMP_SLOT;
     68     case R_X64_RELATIVE:
     69       return ELF_R_X86_64_RELATIVE;
     70     case R_X64_COPY:
     71       return ELF_R_X86_64_COPY;
     72     default:
     73       return ELF_R_X86_64_NONE;
     74   }
     75 }
     76 
     77 u32 elf_x86_64_reloc_from(u32 elf_type) {
     78   switch (elf_type) {
     79     case ELF_R_X86_64_NONE:
     80       return R_NONE;
     81     case ELF_R_X86_64_64:
     82       return R_ABS64;
     83     case ELF_R_X86_64_32:
     84       return R_ABS32;
     85     case ELF_R_X86_64_32S:
     86       return R_X64_32S;
     87     case ELF_R_X86_64_PC32:
     88       return R_PC32;
     89     case ELF_R_X86_64_PC64:
     90       return R_PC64;
     91     case ELF_R_X86_64_PC8:
     92       return R_X64_PC8;
     93     case ELF_R_X86_64_PLT32:
     94       return R_X64_PLT32;
     95     case ELF_R_X86_64_GOT32:
     96       return R_GOT32;
     97     case ELF_R_X86_64_GOTPCREL:
     98       return R_X64_GOTPCREL;
     99     case ELF_R_X86_64_GOTPCRELX:
    100       return R_X64_GOTPCRELX;
    101     case ELF_R_X86_64_REX_GOTPCRELX:
    102       return R_X64_REX_GOTPCRELX;
    103     case ELF_R_X86_64_GOTPC32:
    104       return R_X64_GOTPC32;
    105     case ELF_R_X86_64_GOTOFF64:
    106       return R_X64_GOTOFF64;
    107     case ELF_R_X86_64_TPOFF32:
    108       return R_X64_TPOFF32;
    109     case ELF_R_X86_64_TPOFF64:
    110       return R_TPOFF64;
    111     case ELF_R_X86_64_DTPOFF32:
    112       return R_X64_DTPOFF32;
    113     case ELF_R_X86_64_DTPMOD64:
    114       return R_X64_DTPMOD64;
    115     case ELF_R_X86_64_DTPOFF64:
    116       return R_X64_DTPOFF64;
    117     case ELF_R_X86_64_TLSGD:
    118       return R_X64_TLSGD;
    119     case ELF_R_X86_64_TLSLD:
    120       return R_X64_TLSLD;
    121     case ELF_R_X86_64_GOTTPOFF:
    122       return R_X64_GOTTPOFF;
    123     case ELF_R_X86_64_GLOB_DAT:
    124       return R_X64_GLOB_DAT;
    125     case ELF_R_X86_64_JUMP_SLOT:
    126       return R_X64_JUMP_SLOT;
    127     case ELF_R_X86_64_RELATIVE:
    128       return R_X64_RELATIVE;
    129     case ELF_R_X86_64_COPY:
    130       return R_X64_COPY;
    131     default:
    132       return (u32)-1; /* sentinel */
    133   }
    134 }
    135 
    136 /* Diagnostic spelling for an x86_64 ELF reloc *wire* type. Returns a
    137  * static literal, or NULL for an unknown type. */
    138 const char* elf_x86_64_reloc_name(u32 elf_type) {
    139   switch (elf_type) {
    140     case ELF_R_X86_64_NONE:
    141       return "R_X86_64_NONE";
    142     case ELF_R_X86_64_64:
    143       return "R_X86_64_64";
    144     case ELF_R_X86_64_PC32:
    145       return "R_X86_64_PC32";
    146     case ELF_R_X86_64_GOT32:
    147       return "R_X86_64_GOT32";
    148     case ELF_R_X86_64_PLT32:
    149       return "R_X86_64_PLT32";
    150     case ELF_R_X86_64_COPY:
    151       return "R_X86_64_COPY";
    152     case ELF_R_X86_64_GLOB_DAT:
    153       return "R_X86_64_GLOB_DAT";
    154     case ELF_R_X86_64_JUMP_SLOT:
    155       return "R_X86_64_JUMP_SLOT";
    156     case ELF_R_X86_64_RELATIVE:
    157       return "R_X86_64_RELATIVE";
    158     case ELF_R_X86_64_IRELATIVE:
    159       return "R_X86_64_IRELATIVE";
    160     case ELF_R_X86_64_GOTPCREL:
    161       return "R_X86_64_GOTPCREL";
    162     case ELF_R_X86_64_32:
    163       return "R_X86_64_32";
    164     case ELF_R_X86_64_32S:
    165       return "R_X86_64_32S";
    166     case ELF_R_X86_64_16:
    167       return "R_X86_64_16";
    168     case ELF_R_X86_64_PC16:
    169       return "R_X86_64_PC16";
    170     case ELF_R_X86_64_8:
    171       return "R_X86_64_8";
    172     case ELF_R_X86_64_PC8:
    173       return "R_X86_64_PC8";
    174     case ELF_R_X86_64_DTPMOD64:
    175       return "R_X86_64_DTPMOD64";
    176     case ELF_R_X86_64_DTPOFF64:
    177       return "R_X86_64_DTPOFF64";
    178     case ELF_R_X86_64_TPOFF64:
    179       return "R_X86_64_TPOFF64";
    180     case ELF_R_X86_64_TLSGD:
    181       return "R_X86_64_TLSGD";
    182     case ELF_R_X86_64_TLSLD:
    183       return "R_X86_64_TLSLD";
    184     case ELF_R_X86_64_DTPOFF32:
    185       return "R_X86_64_DTPOFF32";
    186     case ELF_R_X86_64_GOTTPOFF:
    187       return "R_X86_64_GOTTPOFF";
    188     case ELF_R_X86_64_TPOFF32:
    189       return "R_X86_64_TPOFF32";
    190     case ELF_R_X86_64_PC64:
    191       return "R_X86_64_PC64";
    192     case ELF_R_X86_64_GOTOFF64:
    193       return "R_X86_64_GOTOFF64";
    194     case ELF_R_X86_64_GOTPC32:
    195       return "R_X86_64_GOTPC32";
    196     case ELF_R_X86_64_GOTPCRELX:
    197       return "R_X86_64_GOTPCRELX";
    198     case ELF_R_X86_64_REX_GOTPCRELX:
    199       return "R_X86_64_REX_GOTPCRELX";
    200     default:
    201       return NULL;
    202   }
    203 }