1#![allow(clippy::len_without_is_empty)]
13
14pub(crate) mod byte_read;
15
16pub 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
36pub 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}