pub mod header;
pub mod program;
pub mod section;
use crate::errors;
use std::fs;
use std::io::{self, Read, Write};
use header::ElfHeader;
use program::ProgramHeader;
use section::SectionHeader;
pub struct ELF {
pub buffer: Vec<u8>,
pub header: ElfHeader,
pub program_headers: Vec<ProgramHeader>,
pub section_headers: Vec<SectionHeader>,
}
impl ELF {
pub fn write_file(&self, output_path: &str) -> io::Result<()> {
let mut file = fs::File::create(output_path)?;
file.write_all(&self.buffer)?;
Ok(())
}
pub fn from_file(path: &str) -> Result<Self, errors::FileParseError> {
let mut file = fs::File::open(path)?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer)?;
Self::from_buffer(buffer)
}
pub fn from_buffer(buffer: Vec<u8>) -> Result<Self, errors::FileParseError> {
if buffer.len() < 64 {
return Err(errors::FileParseError::BufferOverflow);
}
let header = ElfHeader::parse(&buffer)?;
let program_headers = ProgramHeader::parse_program_headers(
&buffer,
header.ph_off.value,
header.ph_ent_size.value,
header.ph_num.value,
header.endianness,
)?;
let section_headers = SectionHeader::parse_section_headers(
&buffer,
header.sh_off.value,
header.sh_ent_size.value,
header.sh_num.value,
header.endianness,
)?;
Ok(ELF {
buffer,
header,
program_headers,
section_headers,
})
}
}