macho_assembler/formats/executable/
writer.rs

1use crate::{
2    helpers::MachoWriter,
3    types::MachoProgram,
4};
5use gaia_types::{BinaryWriter, GaiaError};
6use byteorder::LittleEndian;
7use std::io::{Write, Seek};
8
9/// Mach-O 可执行文件写入器
10///
11/// 专门用于写入 Mach-O 可执行文件的写入器。
12#[derive(Debug)]
13pub struct ExecutableWriter<W: Write + Seek> {
14    writer: BinaryWriter<W, LittleEndian>,
15}
16
17impl<W: Write + Seek> ExecutableWriter<W> {
18    /// 创建一个新的可执行文件写入器
19    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        // 写入 Mach-O 文件头
29        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        // 如果是64位格式,写入保留字段
38        if let Some(reserved) = program.header.reserved {
39            self.writer.write_u32(reserved)?;
40        }
41
42        // 写入加载命令
43        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}