1pub mod constants;
3mod container;
4pub mod fat;
6pub mod io;
8pub mod load_commands;
10pub mod macho;
12pub mod relocations;
14pub mod sections;
16pub mod symbols;
18
19pub use container::{parse, parse_with_options};
20pub use fat::parse_fat_binary;
21pub use macho::parse_macho_file;
22pub use relocations::relocations_for_section;
23pub use symbols::{fold_symbols, parse_symbol_table};
24
25use crate::model::container::MachoContainer;
26use crate::model::validate::Diagnostic;
27
28#[derive(Debug, Clone, Copy, PartialEq, Eq)]
30#[non_exhaustive]
31pub enum ParseMode {
32 Strict,
34 Forensic,
36}
37
38#[derive(Debug, Clone, PartialEq, Eq)]
40pub struct ParseLimits {
41 pub max_fat_arches: usize,
43 pub max_load_commands: usize,
45 pub max_sections: usize,
47 pub max_string_bytes: usize,
49}
50
51impl Default for ParseLimits {
52 fn default() -> Self {
53 Self {
54 max_fat_arches: 256,
55 max_load_commands: 10_000,
56 max_sections: 100_000,
57 max_string_bytes: 16 * 1024 * 1024,
58 }
59 }
60}
61
62#[derive(Debug, Clone, PartialEq, Eq)]
64pub struct ParseOptions {
65 pub mode: ParseMode,
67 pub limits: ParseLimits,
69}
70
71impl Default for ParseOptions {
72 fn default() -> Self {
73 Self {
74 mode: ParseMode::Strict,
75 limits: ParseLimits::default(),
76 }
77 }
78}
79
80pub struct ParseOutcome<'data> {
82 pub container: MachoContainer<'data>,
84 pub diagnostics: Vec<Diagnostic>,
86}