forked from M-Labs/nac3
libdyld: add arm relocation types
This commit is contained in:
parent
102d553b5c
commit
e1190ec76c
|
@ -1462,133 +1462,132 @@ pub const R_AARCH64_TLS_DTPREL64: usize = 1029;
|
||||||
pub const R_AARCH64_TLS_TPREL64: usize = 1030;
|
pub const R_AARCH64_TLS_TPREL64: usize = 1030;
|
||||||
pub const R_AARCH64_TLSDESC: usize = 1031;
|
pub const R_AARCH64_TLSDESC: usize = 1031;
|
||||||
pub const R_AARCH64_IRELATIVE: usize = 1032;
|
pub const R_AARCH64_IRELATIVE: usize = 1032;
|
||||||
pub const R_ARM_NONE: usize = 0;
|
pub const R_ARM_NONE: u8 = 0;
|
||||||
pub const R_ARM_PC24: usize = 1;
|
pub const R_ARM_PC24: u8 = 1;
|
||||||
pub const R_ARM_ABS32: usize = 2;
|
pub const R_ARM_ABS32: u8 = 2;
|
||||||
pub const R_ARM_REL32: usize = 3;
|
pub const R_ARM_REL32: u8 = 3;
|
||||||
pub const R_ARM_PC13: usize = 4;
|
pub const R_ARM_PC13: u8 = 4;
|
||||||
pub const R_ARM_ABS16: usize = 5;
|
pub const R_ARM_ABS16: u8 = 5;
|
||||||
pub const R_ARM_ABS12: usize = 6;
|
pub const R_ARM_ABS12: u8 = 6;
|
||||||
pub const R_ARM_THM_ABS5: usize = 7;
|
pub const R_ARM_THM_ABS5: u8 = 7;
|
||||||
pub const R_ARM_ABS8: usize = 8;
|
pub const R_ARM_ABS8: u8 = 8;
|
||||||
pub const R_ARM_SBREL32: usize = 9;
|
pub const R_ARM_SBREL32: u8 = 9;
|
||||||
pub const R_ARM_THM_PC22: usize = 10;
|
pub const R_ARM_THM_PC22: u8 = 10;
|
||||||
pub const R_ARM_THM_PC8: usize = 11;
|
pub const R_ARM_THM_PC8: u8 = 11;
|
||||||
pub const R_ARM_AMP_VCALL9: usize = 12;
|
pub const R_ARM_AMP_VCALL9: u8 = 12;
|
||||||
pub const R_ARM_SWI24: usize = 13;
|
pub const R_ARM_SWI24: u8 = 13;
|
||||||
pub const R_ARM_TLS_DESC: usize = 13;
|
pub const R_ARM_TLS_DESC: u8 = 13;
|
||||||
pub const R_ARM_THM_SWI8: usize = 14;
|
pub const R_ARM_THM_SWI8: u8 = 14;
|
||||||
pub const R_ARM_XPC25: usize = 15;
|
pub const R_ARM_XPC25: u8 = 15;
|
||||||
pub const R_ARM_THM_XPC22: usize = 16;
|
pub const R_ARM_THM_XPC22: u8 = 16;
|
||||||
pub const R_ARM_TLS_DTPMOD32: usize = 17;
|
pub const R_ARM_TLS_DTPMOD32: u8 = 17;
|
||||||
pub const R_ARM_TLS_DTPOFF32: usize = 18;
|
pub const R_ARM_TLS_DTPOFF32: u8 = 18;
|
||||||
pub const R_ARM_TLS_TPOFF32: usize = 19;
|
pub const R_ARM_TLS_TPOFF32: u8 = 19;
|
||||||
pub const R_ARM_COPY: usize = 20;
|
pub const R_ARM_COPY: u8 = 20;
|
||||||
pub const R_ARM_GLOB_DAT: usize = 21;
|
pub const R_ARM_GLOB_DAT: u8 = 21;
|
||||||
pub const R_ARM_JUMP_SLOT: usize = 22;
|
pub const R_ARM_JUMP_SLOT: u8 = 22;
|
||||||
pub const R_ARM_RELATIVE: usize = 23;
|
pub const R_ARM_RELATIVE: u8 = 23;
|
||||||
pub const R_ARM_GOTOFF: usize = 24;
|
pub const R_ARM_GOTOFF: u8 = 24;
|
||||||
pub const R_ARM_GOTPC: usize = 25;
|
pub const R_ARM_GOTPC: u8 = 25;
|
||||||
pub const R_ARM_GOT32: usize = 26;
|
pub const R_ARM_GOT32: u8 = 26;
|
||||||
pub const R_ARM_PLT32: usize = 27;
|
pub const R_ARM_PLT32: u8 = 27;
|
||||||
pub const R_ARM_CALL: usize = 28;
|
pub const R_ARM_CALL: u8 = 28;
|
||||||
pub const R_ARM_JUMP24: usize = 29;
|
pub const R_ARM_JUMP24: u8 = 29;
|
||||||
pub const R_ARM_THM_JUMP24: usize = 30;
|
pub const R_ARM_THM_JUMP24: u8 = 30;
|
||||||
pub const R_ARM_BASE_ABS: usize = 31;
|
pub const R_ARM_BASE_ABS: u8 = 31;
|
||||||
pub const R_ARM_ALU_PCREL_7_0: usize = 32;
|
pub const R_ARM_ALU_PCREL_7_0: u8 = 32;
|
||||||
pub const R_ARM_ALU_PCREL_15_8: usize = 33;
|
pub const R_ARM_ALU_PCREL_15_8: u8 = 33;
|
||||||
pub const R_ARM_ALU_PCREL_23_15: usize = 34;
|
pub const R_ARM_ALU_PCREL_23_15: u8 = 34;
|
||||||
pub const R_ARM_LDR_SBREL_11_0: usize = 35;
|
pub const R_ARM_LDR_SBREL_11_0: u8 = 35;
|
||||||
pub const R_ARM_ALU_SBREL_19_12: usize = 36;
|
pub const R_ARM_ALU_SBREL_19_12: u8 = 36;
|
||||||
pub const R_ARM_ALU_SBREL_27_20: usize = 37;
|
pub const R_ARM_ALU_SBREL_27_20: u8 = 37;
|
||||||
pub const R_ARM_TARGET1: usize = 38;
|
pub const R_ARM_TARGET1: u8 = 38;
|
||||||
pub const R_ARM_SBREL31: usize = 39;
|
pub const R_ARM_SBREL31: u8 = 39;
|
||||||
pub const R_ARM_V4BX: usize = 40;
|
pub const R_ARM_V4BX: u8 = 40;
|
||||||
pub const R_ARM_TARGET2: usize = 41;
|
pub const R_ARM_TARGET2: u8 = 41;
|
||||||
pub const R_ARM_PREL31: usize = 42;
|
pub const R_ARM_PREL31: u8 = 42;
|
||||||
pub const R_ARM_MOVW_ABS_NC: usize = 43;
|
pub const R_ARM_MOVW_ABS_NC: u8 = 43;
|
||||||
pub const R_ARM_MOVT_ABS: usize = 44;
|
pub const R_ARM_MOVT_ABS: u8 = 44;
|
||||||
pub const R_ARM_MOVW_PREL_NC: usize = 45;
|
pub const R_ARM_MOVW_PREL_NC: u8 = 45;
|
||||||
pub const R_ARM_MOVT_PREL: usize = 46;
|
pub const R_ARM_MOVT_PREL: u8 = 46;
|
||||||
pub const R_ARM_THM_MOVW_ABS_NC: usize = 47;
|
pub const R_ARM_THM_MOVW_ABS_NC: u8 = 47;
|
||||||
pub const R_ARM_THM_MOVT_ABS: usize = 48;
|
pub const R_ARM_THM_MOVT_ABS: u8 = 48;
|
||||||
pub const R_ARM_THM_MOVW_PREL_NC: usize = 49;
|
pub const R_ARM_THM_MOVW_PREL_NC: u8 = 49;
|
||||||
pub const R_ARM_THM_MOVT_PREL: usize = 50;
|
pub const R_ARM_THM_MOVT_PREL: u8 = 50;
|
||||||
pub const R_ARM_THM_JUMP19: usize = 51;
|
pub const R_ARM_THM_JUMP19: u8 = 51;
|
||||||
pub const R_ARM_THM_JUMP6: usize = 52;
|
pub const R_ARM_THM_JUMP6: u8 = 52;
|
||||||
pub const R_ARM_THM_ALU_PREL_11_0: usize = 53;
|
pub const R_ARM_THM_ALU_PREL_11_0: u8 = 53;
|
||||||
pub const R_ARM_THM_PC12: usize = 54;
|
pub const R_ARM_THM_PC12: u8 = 54;
|
||||||
pub const R_ARM_ABS32_NOI: usize = 55;
|
pub const R_ARM_ABS32_NOI: u8 = 55;
|
||||||
pub const R_ARM_REL32_NOI: usize = 56;
|
pub const R_ARM_REL32_NOI: u8 = 56;
|
||||||
pub const R_ARM_ALU_PC_G0_NC: usize = 57;
|
pub const R_ARM_ALU_PC_G0_NC: u8 = 57;
|
||||||
pub const R_ARM_ALU_PC_G0: usize = 58;
|
pub const R_ARM_ALU_PC_G0: u8 = 58;
|
||||||
pub const R_ARM_ALU_PC_G1_NC: usize = 59;
|
pub const R_ARM_ALU_PC_G1_NC: u8 = 59;
|
||||||
pub const R_ARM_ALU_PC_G1: usize = 60;
|
pub const R_ARM_ALU_PC_G1: u8 = 60;
|
||||||
pub const R_ARM_ALU_PC_G2: usize = 61;
|
pub const R_ARM_ALU_PC_G2: u8 = 61;
|
||||||
pub const R_ARM_LDR_PC_G1: usize = 62;
|
pub const R_ARM_LDR_PC_G1: u8 = 62;
|
||||||
pub const R_ARM_LDR_PC_G2: usize = 63;
|
pub const R_ARM_LDR_PC_G2: u8 = 63;
|
||||||
pub const R_ARM_LDRS_PC_G0: usize = 64;
|
pub const R_ARM_LDRS_PC_G0: u8 = 64;
|
||||||
pub const R_ARM_LDRS_PC_G1: usize = 65;
|
pub const R_ARM_LDRS_PC_G1: u8 = 65;
|
||||||
pub const R_ARM_LDRS_PC_G2: usize = 66;
|
pub const R_ARM_LDRS_PC_G2: u8 = 66;
|
||||||
pub const R_ARM_LDC_PC_G0: usize = 67;
|
pub const R_ARM_LDC_PC_G0: u8 = 67;
|
||||||
pub const R_ARM_LDC_PC_G1: usize = 68;
|
pub const R_ARM_LDC_PC_G1: u8 = 68;
|
||||||
pub const R_ARM_LDC_PC_G2: usize = 69;
|
pub const R_ARM_LDC_PC_G2: u8 = 69;
|
||||||
pub const R_ARM_ALU_SB_G0_NC: usize = 70;
|
pub const R_ARM_ALU_SB_G0_NC: u8 = 70;
|
||||||
pub const R_ARM_ALU_SB_G0: usize = 71;
|
pub const R_ARM_ALU_SB_G0: u8 = 71;
|
||||||
pub const R_ARM_ALU_SB_G1_NC: usize = 72;
|
pub const R_ARM_ALU_SB_G1_NC: u8 = 72;
|
||||||
pub const R_ARM_ALU_SB_G1: usize = 73;
|
pub const R_ARM_ALU_SB_G1: u8 = 73;
|
||||||
pub const R_ARM_ALU_SB_G2: usize = 74;
|
pub const R_ARM_ALU_SB_G2: u8 = 74;
|
||||||
pub const R_ARM_LDR_SB_G0: usize = 75;
|
pub const R_ARM_LDR_SB_G0: u8 = 75;
|
||||||
pub const R_ARM_LDR_SB_G1: usize = 76;
|
pub const R_ARM_LDR_SB_G1: u8 = 76;
|
||||||
pub const R_ARM_LDR_SB_G2: usize = 77;
|
pub const R_ARM_LDR_SB_G2: u8 = 77;
|
||||||
pub const R_ARM_LDRS_SB_G0: usize = 78;
|
pub const R_ARM_LDRS_SB_G0: u8 = 78;
|
||||||
pub const R_ARM_LDRS_SB_G1: usize = 79;
|
pub const R_ARM_LDRS_SB_G1: u8 = 79;
|
||||||
pub const R_ARM_LDRS_SB_G2: usize = 80;
|
pub const R_ARM_LDRS_SB_G2: u8 = 80;
|
||||||
pub const R_ARM_LDC_SB_G0: usize = 81;
|
pub const R_ARM_LDC_SB_G0: u8 = 81;
|
||||||
pub const R_ARM_LDC_SB_G1: usize = 82;
|
pub const R_ARM_LDC_SB_G1: u8 = 82;
|
||||||
pub const R_ARM_LDC_SB_G2: usize = 83;
|
pub const R_ARM_LDC_SB_G2: u8 = 83;
|
||||||
pub const R_ARM_MOVW_BREL_NC: usize = 84;
|
pub const R_ARM_MOVW_BREL_NC: u8 = 84;
|
||||||
pub const R_ARM_MOVT_BREL: usize = 85;
|
pub const R_ARM_MOVT_BREL: u8 = 85;
|
||||||
pub const R_ARM_MOVW_BREL: usize = 86;
|
pub const R_ARM_MOVW_BREL: u8 = 86;
|
||||||
pub const R_ARM_THM_MOVW_BREL_NC: usize = 87;
|
pub const R_ARM_THM_MOVW_BREL_NC: u8 = 87;
|
||||||
pub const R_ARM_THM_MOVT_BREL: usize = 88;
|
pub const R_ARM_THM_MOVT_BREL: u8 = 88;
|
||||||
pub const R_ARM_THM_MOVW_BREL: usize = 89;
|
pub const R_ARM_THM_MOVW_BREL: u8 = 89;
|
||||||
pub const R_ARM_TLS_GOTDESC: usize = 90;
|
pub const R_ARM_TLS_GOTDESC: u8 = 90;
|
||||||
pub const R_ARM_TLS_CALL: usize = 91;
|
pub const R_ARM_TLS_CALL: u8 = 91;
|
||||||
pub const R_ARM_TLS_DESCSEQ: usize = 92;
|
pub const R_ARM_TLS_DESCSEQ: u8 = 92;
|
||||||
pub const R_ARM_THM_TLS_CALL: usize = 93;
|
pub const R_ARM_THM_TLS_CALL: u8 = 93;
|
||||||
pub const R_ARM_PLT32_ABS: usize = 94;
|
pub const R_ARM_PLT32_ABS: u8 = 94;
|
||||||
pub const R_ARM_GOT_ABS: usize = 95;
|
pub const R_ARM_GOT_ABS: u8 = 95;
|
||||||
pub const R_ARM_GOT_PREL: usize = 96;
|
pub const R_ARM_GOT_PREL: u8 = 96;
|
||||||
pub const R_ARM_GOT_BREL12: usize = 97;
|
pub const R_ARM_GOT_BREL12: u8 = 97;
|
||||||
pub const R_ARM_GOTOFF12: usize = 98;
|
pub const R_ARM_GOTOFF12: u8 = 98;
|
||||||
pub const R_ARM_GOTRELAX: usize = 99;
|
pub const R_ARM_GOTRELAX: u8 = 99;
|
||||||
pub const R_ARM_GNU_VTENTRY: usize = 100;
|
pub const R_ARM_GNU_VTENTRY: u8 = 100;
|
||||||
pub const R_ARM_GNU_VTINHERIT: usize = 101;
|
pub const R_ARM_GNU_VTINHERIT: u8 = 101;
|
||||||
pub const R_ARM_THM_PC11: usize = 102;
|
pub const R_ARM_THM_PC11: u8 = 102;
|
||||||
pub const R_ARM_THM_PC9: usize = 103;
|
pub const R_ARM_THM_PC9: u8 = 103;
|
||||||
pub const R_ARM_TLS_GD32: usize = 104;
|
pub const R_ARM_TLS_GD32: u8 = 104;
|
||||||
pub const R_ARM_TLS_LDM32: usize = 105;
|
pub const R_ARM_TLS_LDM32: u8 = 105;
|
||||||
pub const R_ARM_TLS_LDO32: usize = 106;
|
pub const R_ARM_TLS_LDO32: u8 = 106;
|
||||||
pub const R_ARM_TLS_IE32: usize = 107;
|
pub const R_ARM_TLS_IE32: u8 = 107;
|
||||||
pub const R_ARM_TLS_LE32: usize = 108;
|
pub const R_ARM_TLS_LE32: u8 = 108;
|
||||||
pub const R_ARM_TLS_LDO12: usize = 109;
|
pub const R_ARM_TLS_LDO12: u8 = 109;
|
||||||
pub const R_ARM_TLS_LE12: usize = 110;
|
pub const R_ARM_TLS_LE12: u8 = 110;
|
||||||
pub const R_ARM_TLS_IE12GP: usize = 111;
|
pub const R_ARM_TLS_IE12GP: u8 = 111;
|
||||||
pub const R_ARM_ME_TOO: usize = 128;
|
pub const R_ARM_ME_TOO: u8 = 128;
|
||||||
pub const R_ARM_THM_TLS_DESCSEQ: usize = 129;
|
pub const R_ARM_THM_TLS_DESCSEQ: u8 = 129;
|
||||||
pub const R_ARM_THM_TLS_DESCSEQ16: usize = 129;
|
pub const R_ARM_THM_TLS_DESCSEQ16: u8 = 129;
|
||||||
pub const R_ARM_THM_TLS_DESCSEQ32: usize = 130;
|
pub const R_ARM_THM_TLS_DESCSEQ32: u8 = 130;
|
||||||
pub const R_ARM_THM_GOT_BREL12: usize = 131;
|
pub const R_ARM_THM_GOT_BREL12: u8 = 131;
|
||||||
pub const R_ARM_IRELATIVE: usize = 160;
|
pub const R_ARM_IRELATIVE: u8 = 160;
|
||||||
pub const R_ARM_RXPC25: usize = 249;
|
pub const R_ARM_RXPC25: u8 = 249;
|
||||||
pub const R_ARM_RSBREL32: usize = 250;
|
pub const R_ARM_RSBREL32: u8 = 250;
|
||||||
pub const R_ARM_THM_RPC22: usize = 251;
|
pub const R_ARM_THM_RPC22: u8 = 251;
|
||||||
pub const R_ARM_RREL32: usize = 252;
|
pub const R_ARM_RREL32: u8 = 252;
|
||||||
pub const R_ARM_RABS22: usize = 253;
|
pub const R_ARM_RABS22: u8 = 253;
|
||||||
pub const R_ARM_RPC24: usize = 254;
|
pub const R_ARM_RPC24: u8 = 254;
|
||||||
pub const R_ARM_RBASE: usize = 255;
|
pub const R_ARM_RBASE: u8 = 255;
|
||||||
pub const R_ARM_NUM: usize = 256;
|
|
||||||
pub const EF_IA_64_MASKOS: usize = 15;
|
pub const EF_IA_64_MASKOS: usize = 15;
|
||||||
pub const EF_IA_64_ABI64: usize = 16;
|
pub const EF_IA_64_ABI64: usize = 16;
|
||||||
pub const EF_IA_64_ARCH: usize = 4278190080;
|
pub const EF_IA_64_ARCH: usize = 4278190080;
|
||||||
|
|
|
@ -134,7 +134,8 @@ impl<'a> Library<'a> {
|
||||||
pub unsafe fn rebind(&self, name: &[u8], addr: Elf32_Word) -> Result<(), Error<'a>> {
|
pub unsafe fn rebind(&self, name: &[u8], addr: Elf32_Word) -> Result<(), Error<'a>> {
|
||||||
for rela in self.pltrel.iter() {
|
for rela in self.pltrel.iter() {
|
||||||
match ELF32_R_TYPE(rela.r_info) {
|
match ELF32_R_TYPE(rela.r_info) {
|
||||||
R_OR1K_32 | R_OR1K_GLOB_DAT | R_OR1K_JMP_SLOT => {
|
R_OR1K_32 | R_OR1K_GLOB_DAT | R_OR1K_JMP_SLOT |
|
||||||
|
R_ARM_GLOB_DAT | R_ARM_JUMP_SLOT => {
|
||||||
let sym = self.symtab.get(ELF32_R_SYM(rela.r_info) as usize)
|
let sym = self.symtab.get(ELF32_R_SYM(rela.r_info) as usize)
|
||||||
.ok_or("symbol out of bounds of symbol table")?;
|
.ok_or("symbol out of bounds of symbol table")?;
|
||||||
let sym_name = self.name_starting_at(sym.st_name as usize)?;
|
let sym_name = self.name_starting_at(sym.st_name as usize)?;
|
||||||
|
@ -163,13 +164,14 @@ impl<'a> Library<'a> {
|
||||||
|
|
||||||
let value;
|
let value;
|
||||||
match ELF32_R_TYPE(rela.r_info) {
|
match ELF32_R_TYPE(rela.r_info) {
|
||||||
R_OR1K_NONE =>
|
R_OR1K_NONE | R_ARM_NONE =>
|
||||||
return Ok(()),
|
return Ok(()),
|
||||||
|
|
||||||
R_OR1K_RELATIVE =>
|
R_OR1K_RELATIVE | R_ARM_RELATIVE =>
|
||||||
value = self.image_off + rela.r_addend as Elf32_Word,
|
value = self.image_off + rela.r_addend as Elf32_Word,
|
||||||
|
|
||||||
R_OR1K_32 | R_OR1K_GLOB_DAT | R_OR1K_JMP_SLOT => {
|
R_OR1K_32 | R_OR1K_GLOB_DAT | R_OR1K_JMP_SLOT |
|
||||||
|
R_ARM_GLOB_DAT | R_ARM_JUMP_SLOT => {
|
||||||
let sym = sym.ok_or("relocation requires an associated symbol")?;
|
let sym = sym.ok_or("relocation requires an associated symbol")?;
|
||||||
let sym_name = self.name_starting_at(sym.st_name as usize)?;
|
let sym_name = self.name_starting_at(sym.st_name as usize)?;
|
||||||
|
|
||||||
|
@ -189,7 +191,8 @@ impl<'a> Library<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => return Err("unsupported relocation type")?
|
_ =>
|
||||||
|
return Err("unsupported relocation type")?,
|
||||||
}
|
}
|
||||||
|
|
||||||
self.update_rela(rela, value)
|
self.update_rela(rela, value)
|
||||||
|
|
Loading…
Reference in New Issue