elfloader 0.16.0

A rust library to load ELF files.
Documentation
//! AArch64 relocation types
//!
//! As defined in the "ELF for the ARMĀ® 64-bit Architecture (AArch64)" doc.
//! Dcoument number: ARM IHI 0056B, current through AArch64 ABI release 1.0

#[cfg(test)]
mod test;

// Should be in xmas-elf see: https://github.com/nrc/xmas-elf/issues/54
#[derive(Eq, PartialEq, Debug, Clone, Copy)]
#[allow(non_camel_case_types)]
#[repr(u32)]
pub enum RelocationTypes {
    R_ARM_NONE,
    R_AARCH64_NONE,
    R_AARCH64_ABS64,
    R_AARCH64_ABS32,
    R_AARCH64_ABS16,
    R_AARCH64_PREL64,
    R_AARCH64_PREL32,
    R_AARCH64_PREL16,
    R_AARCH64_MOVW_UABS_G0,
    R_AARCH64_MOVW_UABS_G0_NC,
    R_AARCH64_MOVW_UABS_G1,
    R_AARCH64_MOVW_UABS_G1_NC,
    R_AARCH64_MOVW_UABS_G2,
    R_AARCH64_MOVW_UABS_G2_NC,
    R_AARCH64_MOVW_UABS_G3,
    R_AARCH64_MOVW_SABS_G0,
    R_AARCH64_MOVW_SABS_G1,
    R_AARCH64_MOVW_SABS_G2,
    R_AARCH64_LD_PREL_LO19,
    R_AARCH64_ADR_PREL_LO21,
    R_AARCH64_ADR_PREL_PG_HI21,
    R_AARCH64_ADR_PREL_PG_HI21_NC,
    R_AARCH64_ADD_ABS_LO12_NC,
    R_AARCH64_LDST8_ABS_LO12_NC,
    R_AARCH64_TSTBR14,
    R_AARCH64_CONDBR19,
    R_AARCH64_JUMP26,
    R_AARCH64_CALL26,
    R_AARCH64_LDST16_ABS_LO12_NC,
    R_AARCH64_LDST32_ABS_LO12_NC,
    R_AARCH64_LDST64_ABS_LO12_NC,
    R_AARCH64_LDST128_ABS_LO12_NC,
    R_AARCH64_MOVW_PREL_G0,
    R_AARCH64_MOVW_PREL_G0_NC,
    R_AARCH64_MOVW_PREL_G1,
    R_AARCH64_MOVW_PREL_G1_NC,
    R_AARCH64_MOVW_PREL_G2,
    R_AARCH64_MOVW_PREL_G2_NC,
    R_AARCH64_MOVW_PREL_G3,
    R_AARCH64_MOVW_GOTOFF_G0,
    R_AARCH64_MOVW_GOTOFF_G0_NC,
    R_AARCH64_MOVW_GOTOFF_G1,
    R_AARCH64_MOVW_GOTOFF_G1_NC,
    R_AARCH64_MOVW_GOTOFF_G2,
    R_AARCH64_MOVW_GOTOFF_G2_NC,
    R_AARCH64_MOVW_GOTOFF_G3,
    R_AARCH64_GOTREL64,
    R_AARCH64_GOTREL32,
    R_AARCH64_GOT_LD_PREL19,
    R_AARCH64_LD64_GOTOFF_LO15,
    R_AARCH64_ADR_GOT_PAGE,
    R_AARCH64_LD64_GOT_LO12_NC,
    R_AARCH64_LD64_GOTPAGE_LO15,
    R_AARCH64_TLSGD_ADR_PREL21,
    R_AARCH64_TLSGD_ADR_PAGE21,
    R_AARCH64_TLSGD_ADD_LO12_NC,
    R_AARCH64_TLSGD_MOVW_G1,
    R_AARCH64_TLSGD_MOVW_G0_NC,
    R_AARCH64_TLSLD_ADR_PREL21,
    R_AARCH64_TLSLD_ADR_PAGE21,
    R_AARCH64_TLSLD_ADD_LO12_NC,
    R_AARCH64_TLSLD_MOVW_G1,
    R_AARCH64_TLSLD_MOVW_G0_NC,
    R_AARCH64_TLSLD_LD_PREL19,
    R_AARCH64_TLSLD_MOVW_DTPREL_G2,
    R_AARCH64_TLSLD_MOVW_DTPREL_G1,
    R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC,
    R_AARCH64_TLSLD_MOVW_DTPREL_G0,
    R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC,
    R_AARCH64_TLSLD_ADD_DTPREL_HI12,
    R_AARCH64_TLSLD_ADD_DTPREL_LO12,
    R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC,
    R_AARCH64_TLSLD_LDST8_DTPREL_LO12,
    R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC,
    R_AARCH64_TLSLD_LDST16_DTPREL_LO12,
    R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC,
    R_AARCH64_TLSLD_LDST32_DTPREL_LO12,
    R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC,
    R_AARCH64_TLSLD_LDST64_DTPREL_LO12,
    R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC,
    R_AARCH64_TLSLD_LDST128_DTPREL_LO12,
    R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC,
    R_AARCH64_TLSIE_MOVW_GOTTPREL_G1,
    R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC,
    R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21,
    R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC,
    R_AARCH64_TLSIE_LD_GOTTPREL_PREL19,
    R_AARCH64_TLSLE_MOVW_TPREL_G2,
    R_AARCH64_TLSLE_MOVW_TPREL_G1,
    R_AARCH64_TLSLE_MOVW_TPREL_G1_NC,
    R_AARCH64_TLSLE_MOVW_TPREL_G0,
    R_AARCH64_TLSLE_MOVW_TPREL_G0_NC,
    R_AARCH64_TLSLE_ADD_TPREL_HI12,
    R_AARCH64_TLSLE_ADD_TPREL_LO12,
    R_AARCH64_TLSLE_ADD_TPREL_LO12_NC,
    R_AARCH64_TLSLE_LDST8_TPREL_LO12,
    R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC,
    R_AARCH64_TLSLE_LDST16_TPREL_LO12,
    R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
    R_AARCH64_TLSLE_LDST32_TPREL_LO12,
    R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
    R_AARCH64_TLSLE_LDST64_TPREL_LO12,
    R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
    R_AARCH64_TLSLE_LDST128_TPREL_LO12,
    R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC,
    R_AARCH64_TLSDESC_LD_PREL19,
    R_AARCH64_TLSDESC_ADR_PREL21,
    R_AARCH64_TLSDESC_ADR_PAGE21,
    R_AARCH64_TLSDESC_LD64_LO12,
    R_AARCH64_TLSDESC_ADD_LO12,
    R_AARCH64_TLSDESC_OFF_G1,
    R_AARCH64_TLSDESC_OFF_G0_NC,
    R_AARCH64_TLSDESC_LDR,
    R_AARCH64_TLSDESC_ADD,
    R_AARCH64_TLSDESC_CALL,
    R_AARCH64_COPY,
    R_AARCH64_GLOB_DAT,
    R_AARCH64_JUMP_SLOT,
    R_AARCH64_RELATIVE,
    R_AARCH64_TLS_DTPREL64,
    R_AARCH64_TLS_DTPMOD64,
    R_AARCH64_TLS_TPREL64,
    R_AARCH64_TLSDESC,
    R_AARCH64_IRELATIVE,
    /// Unknown
    Unknown(u32),
}

impl RelocationTypes {
    /// Construct new aarch64::RelocationTypes
    pub fn from(typ: u32) -> RelocationTypes {
        use RelocationTypes::*;
        // The weird ordering comes by copying directly from the manual which is
        // not consecutive either...
        match typ {
            0 => R_ARM_NONE,
            256 => R_AARCH64_NONE,
            257 => R_AARCH64_ABS64,
            258 => R_AARCH64_ABS32,
            259 => R_AARCH64_ABS16,
            260 => R_AARCH64_PREL64,
            261 => R_AARCH64_PREL32,
            262 => R_AARCH64_PREL16,
            263 => R_AARCH64_MOVW_UABS_G0,
            264 => R_AARCH64_MOVW_UABS_G0_NC,
            265 => R_AARCH64_MOVW_UABS_G1,
            266 => R_AARCH64_MOVW_UABS_G1_NC,
            267 => R_AARCH64_MOVW_UABS_G2,
            268 => R_AARCH64_MOVW_UABS_G2_NC,
            269 => R_AARCH64_MOVW_UABS_G3,
            270 => R_AARCH64_MOVW_SABS_G0,
            271 => R_AARCH64_MOVW_SABS_G1,
            272 => R_AARCH64_MOVW_SABS_G2,
            273 => R_AARCH64_LD_PREL_LO19,
            274 => R_AARCH64_ADR_PREL_LO21,
            275 => R_AARCH64_ADR_PREL_PG_HI21,
            276 => R_AARCH64_ADR_PREL_PG_HI21_NC,
            277 => R_AARCH64_ADD_ABS_LO12_NC,
            278 => R_AARCH64_LDST8_ABS_LO12_NC,
            279 => R_AARCH64_TSTBR14,
            280 => R_AARCH64_CONDBR19,
            282 => R_AARCH64_JUMP26,
            283 => R_AARCH64_CALL26,
            284 => R_AARCH64_LDST16_ABS_LO12_NC,
            285 => R_AARCH64_LDST32_ABS_LO12_NC,
            286 => R_AARCH64_LDST64_ABS_LO12_NC,
            299 => R_AARCH64_LDST128_ABS_LO12_NC,
            287 => R_AARCH64_MOVW_PREL_G0,
            288 => R_AARCH64_MOVW_PREL_G0_NC,
            289 => R_AARCH64_MOVW_PREL_G1,
            290 => R_AARCH64_MOVW_PREL_G1_NC,
            291 => R_AARCH64_MOVW_PREL_G2,
            292 => R_AARCH64_MOVW_PREL_G2_NC,
            293 => R_AARCH64_MOVW_PREL_G3,
            300 => R_AARCH64_MOVW_GOTOFF_G0,
            301 => R_AARCH64_MOVW_GOTOFF_G0_NC,
            302 => R_AARCH64_MOVW_GOTOFF_G1,
            303 => R_AARCH64_MOVW_GOTOFF_G1_NC,
            304 => R_AARCH64_MOVW_GOTOFF_G2,
            305 => R_AARCH64_MOVW_GOTOFF_G2_NC,
            306 => R_AARCH64_MOVW_GOTOFF_G3,
            307 => R_AARCH64_GOTREL64,
            308 => R_AARCH64_GOTREL32,
            309 => R_AARCH64_GOT_LD_PREL19,
            310 => R_AARCH64_LD64_GOTOFF_LO15,
            311 => R_AARCH64_ADR_GOT_PAGE,
            312 => R_AARCH64_LD64_GOT_LO12_NC,
            313 => R_AARCH64_LD64_GOTPAGE_LO15,
            512 => R_AARCH64_TLSGD_ADR_PREL21,
            513 => R_AARCH64_TLSGD_ADR_PAGE21,
            514 => R_AARCH64_TLSGD_ADD_LO12_NC,
            515 => R_AARCH64_TLSGD_MOVW_G1,
            516 => R_AARCH64_TLSGD_MOVW_G0_NC,
            517 => R_AARCH64_TLSLD_ADR_PREL21,
            518 => R_AARCH64_TLSLD_ADR_PAGE21,
            519 => R_AARCH64_TLSLD_ADD_LO12_NC,
            520 => R_AARCH64_TLSLD_MOVW_G1,
            521 => R_AARCH64_TLSLD_MOVW_G0_NC,
            522 => R_AARCH64_TLSLD_LD_PREL19,
            523 => R_AARCH64_TLSLD_MOVW_DTPREL_G2,
            524 => R_AARCH64_TLSLD_MOVW_DTPREL_G1,
            525 => R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC,
            526 => R_AARCH64_TLSLD_MOVW_DTPREL_G0,
            527 => R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC,
            528 => R_AARCH64_TLSLD_ADD_DTPREL_HI12,
            529 => R_AARCH64_TLSLD_ADD_DTPREL_LO12,
            530 => R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC,
            531 => R_AARCH64_TLSLD_LDST8_DTPREL_LO12,
            532 => R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC,
            533 => R_AARCH64_TLSLD_LDST16_DTPREL_LO12,
            534 => R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC,
            535 => R_AARCH64_TLSLD_LDST32_DTPREL_LO12,
            536 => R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC,
            537 => R_AARCH64_TLSLD_LDST64_DTPREL_LO12,
            538 => R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC,
            572 => R_AARCH64_TLSLD_LDST128_DTPREL_LO12,
            573 => R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC,
            539 => R_AARCH64_TLSIE_MOVW_GOTTPREL_G1,
            540 => R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC,
            541 => R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21,
            542 => R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC,
            543 => R_AARCH64_TLSIE_LD_GOTTPREL_PREL19,
            544 => R_AARCH64_TLSLE_MOVW_TPREL_G2,
            545 => R_AARCH64_TLSLE_MOVW_TPREL_G1,
            546 => R_AARCH64_TLSLE_MOVW_TPREL_G1_NC,
            547 => R_AARCH64_TLSLE_MOVW_TPREL_G0,
            548 => R_AARCH64_TLSLE_MOVW_TPREL_G0_NC,
            549 => R_AARCH64_TLSLE_ADD_TPREL_HI12,
            550 => R_AARCH64_TLSLE_ADD_TPREL_LO12,
            551 => R_AARCH64_TLSLE_ADD_TPREL_LO12_NC,
            552 => R_AARCH64_TLSLE_LDST8_TPREL_LO12,
            553 => R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC,
            554 => R_AARCH64_TLSLE_LDST16_TPREL_LO12,
            555 => R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
            556 => R_AARCH64_TLSLE_LDST32_TPREL_LO12,
            557 => R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
            558 => R_AARCH64_TLSLE_LDST64_TPREL_LO12,
            559 => R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
            570 => R_AARCH64_TLSLE_LDST128_TPREL_LO12,
            571 => R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC,
            560 => R_AARCH64_TLSDESC_LD_PREL19,
            561 => R_AARCH64_TLSDESC_ADR_PREL21,
            562 => R_AARCH64_TLSDESC_ADR_PAGE21,
            563 => R_AARCH64_TLSDESC_LD64_LO12,
            564 => R_AARCH64_TLSDESC_ADD_LO12,
            565 => R_AARCH64_TLSDESC_OFF_G1,
            566 => R_AARCH64_TLSDESC_OFF_G0_NC,
            567 => R_AARCH64_TLSDESC_LDR,
            568 => R_AARCH64_TLSDESC_ADD,
            569 => R_AARCH64_TLSDESC_CALL,
            1024 => R_AARCH64_COPY,
            1025 => R_AARCH64_GLOB_DAT,
            1026 => R_AARCH64_JUMP_SLOT,
            1027 => R_AARCH64_RELATIVE,
            1028 => R_AARCH64_TLS_DTPREL64,
            1029 => R_AARCH64_TLS_DTPMOD64,
            1030 => R_AARCH64_TLS_TPREL64,
            1031 => R_AARCH64_TLSDESC,
            1032 => R_AARCH64_IRELATIVE,
            x => Unknown(x),
        }
    }
}