1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
use crate::*; pub const R_X86_64_PC32: Elf64Xword = 2; pub const R_X86_64_PLT32: Elf64Xword = 4; pub const R_X86_64_32: Elf64Xword = 10; #[derive(Clone)] #[repr(C)] pub struct Rela64 { r_offset: Elf64Addr, r_info: Elf64Xword, r_addend: Elf64Sxword, } impl Default for Rela64 { fn default() -> Self { Self { r_offset: 0, r_info: 0, r_addend: 0, } } } #[allow(dead_code)] impl Rela64 { pub fn size() -> Elf64Xword { 24 } pub fn get_sym(&self) -> Elf64Xword { self.r_info >> 32 } pub fn get_type(&self) -> Elf64Xword{ self.r_info & 0xffffffff } pub fn get_offset(&self) -> Elf64Addr { self.r_offset } pub fn get_info(&self) -> Elf64Xword { self.r_info } pub fn get_addend(&self) -> Elf64Sxword { self.r_addend } pub fn set_addend(&mut self, addend: Elf64Sxword) { self.r_addend = addend; } pub fn set_offset(&mut self, offset: Elf64Addr) { self.r_offset = offset; } pub fn set_info(&mut self, info: Elf64Xword) { self.r_info = info; } pub fn to_le_bytes(&self) -> Vec<u8> { let mut bytes: Vec<u8> = Vec::new(); for byte in self.r_offset.to_le_bytes().to_vec() { bytes.push(byte); } for byte in self.r_info.to_le_bytes().to_vec() { bytes.push(byte); } for byte in self.r_addend.to_le_bytes().to_vec() { bytes.push(byte); } bytes } }