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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
use super::super::nom::{ le_u64, be_u64, le_i64, be_i64, IResult, }; use super::super::{ Fault, ElfClass, Class, ElfEndian, Endian }; struct PreRel64 { r_offset: u64, r_info: u64 } impl PreRel64 { fn new<E>(buffer: &[u8], elf: &E) -> Result<PreRel64,Fault> where E: Class+Endian+?Sized { named!(parser_pre_rel64_le<PreRel64>, do_parse!( r_offset: le_u64 >> r_info: le_u64 >> ((PreRel64{ r_offset, r_info })) )); named!(parser_pre_rel64_be<PreRel64>, do_parse!( r_offset: be_u64 >> r_info: be_u64 >> ((PreRel64{ r_offset, r_info })) )); if elf.is_64bits() { return Err(Fault::Bits64ParserFailed); } if buffer.len() >= 16 { let data = match elf.get_endian() { ElfEndian::Little => parser_pre_rel64_le(buffer), ElfEndian::Big => parser_pre_rel64_be(buffer) }; match data { IResult::Done(_,x) => Ok(x), IResult::Error(_) => Err(Fault::Complex), IResult::Incomplete(_) => Err(Fault::TooSmol) } } else { Err(Fault::TooSmol) } } } struct PreRela64 { r_offset: u64, r_info: u64, r_addend: i64, } impl PreRela64 { fn new<E>(buffer: &[u8], elf: &E) -> Result<PreRela64,Fault> where E: Class+Endian+?Sized { named!(parse_pre_rela64_le<PreRela64>, do_parse!( r_offset: le_u64 >> r_info: le_u64 >> r_addend: le_i64 >> ((PreRela64{ r_offset, r_info, r_addend })) )); named!(parse_pre_rela64_be<PreRela64>, do_parse!( r_offset: be_u64 >> r_info: be_u64 >> r_addend: be_i64 >> ((PreRela64{ r_offset, r_info, r_addend })) )); if elf.is_64bits() { return Err(Fault::Bits64ParserFailed); } if buffer.len() >= 18 { let data = match elf.get_endian() { ElfEndian::Little => parse_pre_rela64_le(buffer), ElfEndian::Big => parse_pre_rela64_be(buffer) }; match data { IResult::Done(_,x) => Ok(x), IResult::Error(_) => Err(Fault::Complex), IResult::Incomplete(_) => Err(Fault::TooSmol) } } else { Err(Fault::TooSmol) } } }