mbn/
lib.rs

1//! MBN format parsing library.
2//!
3//! **NOTE**: Extension of files with MBN segment may be `elf`.
4//! Files with extension `mbn` are almost ELF format files.
5//!
6//! Parse from an ELF format file, see [`from_elf()`].
7//!
8//! Parse from byte stream, see [`HashTableSegment::parse()`].
9//!
10//! Dump to byte stream, see [`HashTableSegment::dump()`].
11
12#![allow(clippy::len_without_is_empty)]
13
14pub(crate) mod byte_read;
15
16/// Define error types.
17pub mod error;
18
19mod hash_table_segment;
20mod header;
21mod metadata;
22
23use std::path::Path;
24
25pub use hash_table_segment::*;
26pub use header::*;
27pub use metadata::*;
28
29pub(crate) type Result<T> = std::result::Result<T, error::ParseError>;
30
31use elf::abi::PT_NULL;
32use elf::endian::AnyEndian;
33use elf::segment::ProgramHeader;
34use elf::ElfBytes;
35
36/// Parse hash table segment from an ELF format binaries.
37pub fn from_elf<P: AsRef<Path>>(path: P) -> Result<HashTableSegment> {
38    pub use error::ParseError;
39    let file_data = std::fs::read(path)?;
40    let file = ElfBytes::<AnyEndian>::minimal_parse(file_data.as_slice())?;
41    let all_null_phdrs: Vec<ProgramHeader> = file
42        .segments()
43        .ok_or(ParseError::NoHashTableSegment)?
44        .iter()
45        .filter(|phdr| phdr.p_type == PT_NULL)
46        .collect();
47    let hash_table_segment = all_null_phdrs
48        .get(1)
49        .ok_or(ParseError::NoHashTableSegment)?;
50    let hash_table_segment = file.segment_data(hash_table_segment)?;
51    HashTableSegment::parse(hash_table_segment)
52}