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_u32, be_u32, le_i32, be_i32, IResult, }; use super::super::{ Fault, ElfClass, Class, ElfEndian, Endian }; struct PreRel32 { r_offset: u32, r_info: u32 } impl PreRel32 { fn new<E>(buffer: &[u8], elf: &E) -> Result<PreRel32,Fault> where E: Class+Endian+?Sized { named!(parser_pre_rel32_le<PreRel32>, do_parse!( r_offset: le_u32 >> r_info: le_u32 >> ((PreRel32{ r_offset, r_info })) )); named!(parser_pre_rel32_be<PreRel32>, do_parse!( r_offset: be_u32 >> r_info: be_u32 >> ((PreRel32{ r_offset, r_info })) )); if elf.is_64bits() { return Err(Fault::Bits32ParserFailed); } if buffer.len() >= 8 { let data = match elf.get_endian() { ElfEndian::Little => parser_pre_rel32_le(buffer), ElfEndian::Big => parser_pre_rel32_be(buffer) }; match data { IResult::Done(_,x) => Ok(x), IResult::Error(_) => Err(Fault::Complex), IResult::Incomplete(_) => Err(Fault::TooSmol) } } else { Err(Fault::TooSmol) } } } struct PreRela32 { r_offset: u32, r_info: u32, r_addend: i32, } impl PreRela32 { fn new<E>(buffer: &[u8], elf: &E) -> Result<PreRela32,Fault> where E: Class+Endian+?Sized { named!(parse_pre_rela32_le<PreRela32>, do_parse!( r_offset: le_u32 >> r_info: le_u32 >> r_addend: le_i32 >> ((PreRela32{ r_offset, r_info, r_addend })) )); named!(parse_pre_rela32_be<PreRela32>, do_parse!( r_offset: be_u32 >> r_info: be_u32 >> r_addend: be_i32 >> ((PreRela32{ r_offset, r_info, r_addend })) )); if elf.is_64bits() { return Err(Fault::Bits32ParserFailed); } if buffer.len() >= 12 { let data = match elf.get_endian() { ElfEndian::Little => parse_pre_rela32_le(buffer), ElfEndian::Big => parse_pre_rela32_be(buffer) }; match data { IResult::Done(_,x) => Ok(x), IResult::Error(_) => Err(Fault::Complex), IResult::Incomplete(_) => Err(Fault::TooSmol) } } else { Err(Fault::TooSmol) } } }