Update the Parse implementers to use ReadExt/Reader
This is a partial patch that starts us using the new interface in a minimal but non-optimal way The next step is to change the Parse trait to take a ReadExt instead of a std::io::Read
This commit is contained in:
parent
28badf52f7
commit
79a54e21cb
37
src/file.rs
37
src/file.rs
@ -1,5 +1,5 @@
|
||||
use crate::gabi;
|
||||
use crate::parse::{Endian, Parse, read_u16, read_u32, read_u64};
|
||||
use crate::parse::{Endian, Parse, Reader, ReadExt};
|
||||
|
||||
/// Encapsulates the contents of the ELF File Header
|
||||
///
|
||||
@ -109,31 +109,34 @@ where
|
||||
|
||||
let class = Class(ident[gabi::EI_CLASS]);
|
||||
let endian = if ident[gabi::EI_DATA] == gabi::ELFDATA2LSB { Endian::Little } else { Endian::Big };
|
||||
let elftype = ObjectFileType(read_u16(endian, reader)?);
|
||||
let arch = Architecture(read_u16(endian, reader)?);
|
||||
let version = read_u32(endian, reader)?;
|
||||
|
||||
let mut io_r = Reader::new(reader, endian);
|
||||
|
||||
let elftype = ObjectFileType(io_r.read_u16()?);
|
||||
let arch = Architecture(io_r.read_u16()?);
|
||||
let version = io_r.read_u32()?;
|
||||
|
||||
let entry: u64;
|
||||
let phoff: u64;
|
||||
let shoff: u64;
|
||||
|
||||
if class == gabi::ELFCLASS32 {
|
||||
entry = read_u32(endian, reader)? as u64;
|
||||
phoff = read_u32(endian, reader)? as u64;
|
||||
shoff = read_u32(endian, reader)? as u64;
|
||||
entry = io_r.read_u32()? as u64;
|
||||
phoff = io_r.read_u32()? as u64;
|
||||
shoff = io_r.read_u32()? as u64;
|
||||
} else {
|
||||
entry = read_u64(endian, reader)?;
|
||||
phoff = read_u64(endian, reader)?;
|
||||
shoff = read_u64(endian, reader)?;
|
||||
entry = io_r.read_u64()?;
|
||||
phoff = io_r.read_u64()?;
|
||||
shoff = io_r.read_u64()?;
|
||||
}
|
||||
|
||||
let flags = read_u32(endian, reader)?;
|
||||
let ehsize = read_u16(endian, reader)?;
|
||||
let phentsize = read_u16(endian, reader)?;
|
||||
let phnum = read_u16(endian, reader)?;
|
||||
let shentsize = read_u16(endian, reader)?;
|
||||
let shnum = read_u16(endian, reader)?;
|
||||
let shstrndx = read_u16(endian, reader)?;
|
||||
let flags = io_r.read_u32()?;
|
||||
let ehsize = io_r.read_u16()?;
|
||||
let phentsize = io_r.read_u16()?;
|
||||
let phnum = io_r.read_u16()?;
|
||||
let shentsize = io_r.read_u16()?;
|
||||
let shnum = io_r.read_u16()?;
|
||||
let shstrndx = io_r.read_u16()?;
|
||||
|
||||
return Ok(FileHeader {
|
||||
class: class,
|
||||
|
@ -1,6 +1,6 @@
|
||||
use crate::file::Class;
|
||||
use crate::gabi;
|
||||
use crate::parse::{Endian, Parse, read_u32, read_u64};
|
||||
use crate::parse::{Endian, Parse, Reader, ReadExt};
|
||||
|
||||
/// Encapsulates the contents of an ELF Section Header
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
@ -32,32 +32,33 @@ where
|
||||
R: std::io::Read,
|
||||
{
|
||||
fn parse(endian: Endian, class: Class, reader: &mut R) -> Result<Self, crate::ParseError> {
|
||||
let mut io_r = Reader::new(reader, endian);
|
||||
if class == gabi::ELFCLASS32 {
|
||||
return Ok(SectionHeader {
|
||||
sh_name: read_u32(endian, reader)?,
|
||||
sh_type: SectionType(read_u32(endian, reader)?),
|
||||
sh_flags: SectionFlag(read_u32(endian, reader)? as u64),
|
||||
sh_addr: read_u32(endian, reader)? as u64,
|
||||
sh_offset: read_u32(endian, reader)? as u64,
|
||||
sh_size: read_u32(endian, reader)? as u64,
|
||||
sh_link: read_u32(endian, reader)?,
|
||||
sh_info: read_u32(endian, reader)?,
|
||||
sh_addralign: read_u32(endian, reader)? as u64,
|
||||
sh_entsize: read_u32(endian, reader)? as u64,
|
||||
sh_name: io_r.read_u32()?,
|
||||
sh_type: SectionType(io_r.read_u32()?),
|
||||
sh_flags: SectionFlag(io_r.read_u32()? as u64),
|
||||
sh_addr: io_r.read_u32()? as u64,
|
||||
sh_offset: io_r.read_u32()? as u64,
|
||||
sh_size: io_r.read_u32()? as u64,
|
||||
sh_link: io_r.read_u32()?,
|
||||
sh_info: io_r.read_u32()?,
|
||||
sh_addralign: io_r.read_u32()? as u64,
|
||||
sh_entsize: io_r.read_u32()? as u64,
|
||||
});
|
||||
}
|
||||
|
||||
Ok(SectionHeader {
|
||||
sh_name: read_u32(endian, reader)?,
|
||||
sh_type: SectionType(read_u32(endian, reader)?),
|
||||
sh_flags: SectionFlag(read_u64(endian, reader)?),
|
||||
sh_addr: read_u64(endian, reader)?,
|
||||
sh_offset: read_u64(endian, reader)?,
|
||||
sh_size: read_u64(endian, reader)?,
|
||||
sh_link: read_u32(endian, reader)?,
|
||||
sh_info: read_u32(endian, reader)?,
|
||||
sh_addralign: read_u64(endian, reader)?,
|
||||
sh_entsize: read_u64(endian, reader)?,
|
||||
sh_name: io_r.read_u32()?,
|
||||
sh_type: SectionType(io_r.read_u32()?),
|
||||
sh_flags: SectionFlag(io_r.read_u64()?),
|
||||
sh_addr: io_r.read_u64()?,
|
||||
sh_offset: io_r.read_u64()?,
|
||||
sh_size: io_r.read_u64()?,
|
||||
sh_link: io_r.read_u32()?,
|
||||
sh_info: io_r.read_u32()?,
|
||||
sh_addralign: io_r.read_u64()?,
|
||||
sh_entsize: io_r.read_u64()?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
use crate::file::Class;
|
||||
use crate::gabi;
|
||||
use crate::parse::{Endian, Parse, read_u32, read_u64};
|
||||
use crate::parse::{Endian, Parse, Reader, ReadExt};
|
||||
|
||||
/// Encapsulates the contents of an ELF Program Header
|
||||
///
|
||||
@ -31,15 +31,16 @@ where
|
||||
R: std::io::Read,
|
||||
{
|
||||
fn parse(endian: Endian, class: Class, reader: &mut R) -> Result<Self, crate::ParseError> {
|
||||
let mut io_r = Reader::new(reader, endian);
|
||||
if class == gabi::ELFCLASS32 {
|
||||
let p_type = read_u32(endian, reader)?;
|
||||
let p_offset = read_u32(endian, reader)?;
|
||||
let p_vaddr = read_u32(endian, reader)?;
|
||||
let p_paddr = read_u32(endian, reader)?;
|
||||
let p_filesz = read_u32(endian, reader)?;
|
||||
let p_memsz = read_u32(endian, reader)?;
|
||||
let p_flags = read_u32(endian, reader)?;
|
||||
let p_align = read_u32(endian, reader)?;
|
||||
let p_type = io_r.read_u32()?;
|
||||
let p_offset = io_r.read_u32()?;
|
||||
let p_vaddr = io_r.read_u32()?;
|
||||
let p_paddr = io_r.read_u32()?;
|
||||
let p_filesz = io_r.read_u32()?;
|
||||
let p_memsz = io_r.read_u32()?;
|
||||
let p_flags = io_r.read_u32()?;
|
||||
let p_align = io_r.read_u32()?;
|
||||
return Ok(ProgramHeader {
|
||||
progtype: ProgType(p_type),
|
||||
offset: p_offset as u64,
|
||||
@ -52,14 +53,14 @@ where
|
||||
});
|
||||
}
|
||||
|
||||
let p_type = read_u32(endian, reader)?;
|
||||
let p_flags = read_u32(endian, reader)?;
|
||||
let p_offset = read_u64(endian, reader)?;
|
||||
let p_vaddr = read_u64(endian, reader)?;
|
||||
let p_paddr = read_u64(endian, reader)?;
|
||||
let p_filesz = read_u64(endian, reader)?;
|
||||
let p_memsz = read_u64(endian, reader)?;
|
||||
let p_align = read_u64(endian, reader)?;
|
||||
let p_type = io_r.read_u32()?;
|
||||
let p_flags = io_r.read_u32()?;
|
||||
let p_offset = io_r.read_u64()?;
|
||||
let p_vaddr = io_r.read_u64()?;
|
||||
let p_paddr = io_r.read_u64()?;
|
||||
let p_filesz = io_r.read_u64()?;
|
||||
let p_memsz = io_r.read_u64()?;
|
||||
let p_align = io_r.read_u64()?;
|
||||
Ok(ProgramHeader {
|
||||
progtype: ProgType(p_type),
|
||||
offset: p_offset,
|
||||
|
Loading…
x
Reference in New Issue
Block a user