elf_utilities/file/
base.rs1use 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}