binfmt 0.1.0

A library for reading and writing binaries
Documentation
use crate::fmt::{BinaryFile, Binfmt, CallbackError, FileType, Section, SectionType};

pub struct Binary;

pub fn create_format() -> Binary {
    Binary
}

impl Binfmt for Binary {
    fn relnum_to_howto(&self, _relnum: u32) -> Option<&dyn crate::howto::HowTo> {
        None
    }

    fn code_to_howto(&self, _code: crate::howto::RelocCode) -> Option<&dyn crate::howto::HowTo> {
        None
    }

    fn name(&self) -> &'static str {
        "binary"
    }

    fn create_file(&self, ty: FileType) -> crate::fmt::BinaryFile {
        BinaryFile::create(self, Box::new(()), ty)
    }

    fn read_file(
        &self,
        file: &mut (dyn std::io::Read + '_),
    ) -> std::io::Result<Option<crate::fmt::BinaryFile>> {
        let mut vec = Vec::new();
        file.read_to_end(&mut vec)?;
        let mut file = BinaryFile::create(self, Box::new(()), FileType::Exec);
        let _ = file.add_section(Section {
            align: 1,
            content: vec,
            name: ".data".to_string(),
            ty: SectionType::ProgBits,
            relocs: Vec::new(),
            __private: (),
        });

        Ok(Some(file))
    }

    fn write_file(
        &self,
        file: &mut (dyn std::io::Write + '_),
        bfile: &crate::fmt::BinaryFile,
    ) -> std::io::Result<()> {
        for s in bfile.sections() {
            file.write_all(&s.content)?;
        }
        Ok(())
    }

    fn has_sections(&self) -> bool {
        true
    }

    fn create_section(
        &self,
        _section: &mut crate::fmt::Section,
    ) -> Result<(), crate::fmt::CallbackError> {
        Ok(())
    }

    fn create_symbol(
        &self,
        _sym: &mut crate::sym::Symbol,
    ) -> Result<(), crate::fmt::CallbackError> {
        Err(CallbackError::NotAccepted)
    }

    fn create_reloc(
        &self,
        _reloc: &mut crate::howto::Reloc,
    ) -> Result<(), crate::fmt::CallbackError> {
        Err(CallbackError::NotAccepted)
    }

    fn before_relocate(&self, _reloc: &mut crate::howto::Reloc, _symbol: &crate::sym::Symbol) {}
}