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:
Christopher Cole 2022-10-07 12:02:36 -07:00
parent 28badf52f7
commit 79a54e21cb
No known key found for this signature in database
GPG Key ID: 0AC856975983E9DB
3 changed files with 60 additions and 55 deletions

View File

@ -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,

View File

@ -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()?,
})
}
}

View File

@ -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,