use crate::common::VAddr;
use crate::format::elf::{EM_X86_64, Elf64File, SHF_EXECINSTR};
use crate::signatures::{CRT_HELPERS_X86_64, scan};
use crate::analysis::function_map::{Function, FunctionSource};
#[must_use]
pub fn discover_from_signatures(elf: &Elf64File) -> Vec<Function> {
let db = match elf.ehdr.e_machine {
EM_X86_64 => CRT_HELPERS_X86_64,
_ => return Vec::new(),
};
let mut out = Vec::new();
for (_, sh, data) in elf.sections() {
if sh.sh_flags & SHF_EXECINSTR == 0 || data.is_empty() {
continue;
}
for m in scan(data, sh.sh_addr, db) {
out.push(Function {
addr: VAddr(m.addr),
size: 0,
name: m.name.to_string(),
sources: vec![FunctionSource::Signature],
});
}
}
out
}