goblin 0.0.6

An impish, cross-platform binary parsing and loading crate
Documentation
pub use elf::rela::*;

elf_rela!(u64, i64);

pub const SIZEOF_RELA: usize = 8 + 8 + 8;

#[inline(always)]
pub fn r_sym(info: u64) -> u64 {
    info >> 32
}

#[inline(always)]
pub fn r_type(info: u64) -> u64 {
    info & 0xffffffff
}

#[inline(always)]
pub fn r_info(sym: u64, typ: u64) -> u64 {
    (sym << 32) + typ
}

elf_rela_impure_impl!(
    pub fn parse<R: Read + Seek>(fd: &mut R, offset: usize, size: usize, is_lsb: bool) -> io::Result<Vec<Rela>> {
        use byteorder::{LittleEndian,BigEndian,ReadBytesExt};
        let count = size / SIZEOF_RELA;
        let mut res = Vec::with_capacity(count);

        try!(fd.seek(Start(offset as u64)));
        for _ in 0..count {
            let mut rela = Rela::default();

            if is_lsb {
                rela.r_offset = try!(fd.read_u64::<LittleEndian>());
                rela.r_info = try!(fd.read_u64::<LittleEndian>());
                rela.r_addend = try!(fd.read_i64::<LittleEndian>());
            } else {
                rela.r_offset = try!(fd.read_u64::<BigEndian>());
                rela.r_info = try!(fd.read_u64::<BigEndian>());
                rela.r_addend = try!(fd.read_i64::<BigEndian>());
            }

            res.push(rela);
        }

        res.dedup();
        Ok(res)
    });