object_rewrite/
rewriter.rs1use std::collections::{HashMap, HashSet};
2
3use object::build;
4
5use super::{Error, Result};
6
7#[derive(Debug, Default)]
13#[non_exhaustive]
14pub struct Options {
15 pub delete_symbols: HashSet<Vec<u8>>,
19 pub rename_symbols: HashMap<Vec<u8>, Vec<u8>>,
23 pub delete_sections: HashSet<Vec<u8>>,
27 pub rename_sections: HashMap<Vec<u8>, Vec<u8>>,
31 pub elf: super::ElfOptions,
33}
34
35#[derive(Debug)]
39pub struct Rewriter<'data> {
40 pub(crate) builder: build::elf::Builder<'data>,
41 pub(crate) modified: bool,
42}
43
44impl<'data> Rewriter<'data> {
45 pub fn read(data: &'data [u8]) -> Result<Self> {
47 let builder = build::elf::Builder::read(data).map_err(Error::parse)?;
48 Ok(Self {
49 builder,
50 modified: false,
51 })
52 }
53
54 pub fn write<W: std::io::Write>(mut self, w: W) -> Result<()> {
56 self.elf_finalize()?;
57 let mut buffer = object::write::StreamingBuffer::new(w);
58 self.builder.write(&mut buffer).map_err(Error::write)?;
59 buffer.result().map_err(Error::io)
60 }
61
62 pub fn modify(&mut self, options: Options) -> Result<()> {
64 if !options.delete_symbols.is_empty() {
65 self.delete_symbols(&options.delete_symbols);
66 }
67 if !options.rename_symbols.is_empty() {
68 self.rename_symbols(&options.rename_symbols);
69 }
70 if !options.delete_sections.is_empty() {
71 self.delete_sections(&options.delete_sections);
72 }
73 if !options.rename_sections.is_empty() {
74 self.rename_sections(&options.rename_sections);
75 }
76 self.elf_modify(options.elf)?;
77 Ok(())
78 }
79
80 pub fn delete_symbols(&mut self, names: &HashSet<Vec<u8>>) {
85 self.elf_delete_symbols(names);
86 self.elf_delete_dynamic_symbols(names);
87 }
88
89 pub fn rename_symbols(&mut self, names: &HashMap<Vec<u8>, Vec<u8>>) {
96 self.elf_rename_symbols(names);
97 self.elf_rename_dynamic_symbols(names);
98 }
99
100 pub fn delete_sections(&mut self, names: &HashSet<Vec<u8>>) {
102 self.elf_delete_sections(names);
103 }
104
105 pub fn rename_sections(&mut self, names: &HashMap<Vec<u8>, Vec<u8>>) {
109 self.elf_rename_sections(names);
110 }
111}