elf_utilities/file/
base.rs

1use super::{ELF32, ELF64};
2use std::io::{BufWriter, Write};
3#[cfg(target_family = "unix")]
4use std::os::unix::fs::OpenOptionsExt;
5#[cfg(target_family = "windows")]
6use std::os::windows::fs::OpenOptionsExt;
7
8pub enum ELF {
9    ELF32(ELF32),
10    ELF64(ELF64),
11}
12
13pub struct ELFDumper {
14    pub file: ELF,
15}
16
17impl ELF {
18    pub(crate) fn as_64bit(self) -> ELF64 {
19        match self {
20            ELF::ELF64(e) => e,
21            _ => unreachable!(),
22        }
23    }
24    pub(crate) fn as_32bit(self) -> ELF32 {
25        match self {
26            ELF::ELF32(e) => e,
27            _ => unreachable!(),
28        }
29    }
30    pub(crate) fn to_le_bytes(&self) -> Vec<u8> {
31        match self {
32            ELF::ELF64(e) => e.to_le_bytes(),
33            ELF::ELF32(e) => e.to_le_bytes(),
34        }
35    }
36}
37
38impl ELFDumper {
39    pub fn new(f: ELF) -> Self {
40        Self { file: f }
41    }
42
43    pub fn generate_elf_file(
44        &self,
45        output_filename: &str,
46        permission: u32,
47    ) -> Result<(), Box<dyn std::error::Error>> {
48        let bytes = self.file.to_le_bytes();
49
50        #[cfg(target_family = "unix")]
51        let file = std::fs::OpenOptions::new()
52            .create(true)
53            .read(true)
54            .write(true)
55            .mode(permission)
56            .open(output_filename)?;
57
58        #[cfg(target_family = "windows")]
59        let file = std::fs::OpenOptions::new()
60            .create(true)
61            .read(true)
62            .write(true)
63            .access_mode(permission)
64            .open(output_filename)?;
65
66        let mut writer = BufWriter::new(file);
67        writer.write_all(&bytes)?;
68        writer.flush()?;
69        Ok(())
70    }
71}