macho_assembler/formats/executable/
writer.rs1use crate::{
2 helpers::MachoWriter,
3 types::MachoProgram,
4};
5use gaia_types::{BinaryWriter, GaiaError};
6use byteorder::LittleEndian;
7use std::io::{Write, Seek};
8
9#[derive(Debug)]
13pub struct ExecutableWriter<W: Write + Seek> {
14 writer: BinaryWriter<W, LittleEndian>,
15}
16
17impl<W: Write + Seek> ExecutableWriter<W> {
18 pub fn new(writer: W) -> Self {
20 Self {
21 writer: BinaryWriter::new(writer),
22 }
23 }
24}
25
26impl<W: Write + Seek> MachoWriter<W> for ExecutableWriter<W> {
27 fn write_program(&mut self, program: &MachoProgram) -> Result<(), GaiaError> {
28 self.writer.write_u32(program.header.magic)?;
30 self.writer.write_u32(program.header.cpu_type)?;
31 self.writer.write_u32(program.header.cpu_subtype)?;
32 self.writer.write_u32(program.header.file_type)?;
33 self.writer.write_u32(program.header.ncmds)?;
34 self.writer.write_u32(program.header.sizeofcmds)?;
35 self.writer.write_u32(program.header.flags)?;
36
37 if let Some(reserved) = program.header.reserved {
39 self.writer.write_u32(reserved)?;
40 }
41
42 for load_cmd in &program.load_commands {
44 self.writer.write_u32(load_cmd.cmd)?;
45 self.writer.write_u32(load_cmd.cmdsize)?;
46 self.writer.write_all(&load_cmd.data)?;
47 }
48
49 Ok(())
50 }
51
52 fn writer(&mut self) -> &mut BinaryWriter<W, LittleEndian> {
53 &mut self.writer
54 }
55}