use crate::common::VAddr;
use crate::format::elf::{EM_BPF, EM_SBF, Elf64File};
use crate::analysis::{Function, FunctionSource};
#[must_use]
pub fn discover_entry_point(elf: &Elf64File) -> Vec<Function> {
if elf.ehdr.e_entry == 0 {
return Vec::new();
}
let name = entry_name_for(elf.ehdr.e_machine);
vec![Function {
addr: VAddr(elf.ehdr.e_entry),
size: 0,
name: name.to_string(),
sources: vec![FunctionSource::Entry],
}]
}
fn entry_name_for(e_machine: u16) -> &'static str {
match e_machine {
EM_BPF | EM_SBF => "entry_point",
_ => "_start",
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn name_for_bpf_is_entry_point() {
assert_eq!(entry_name_for(EM_BPF), "entry_point");
assert_eq!(entry_name_for(EM_SBF), "entry_point");
}
#[test]
fn name_for_x86_is_start() {
assert_eq!(entry_name_for(62), "_start"); assert_eq!(entry_name_for(3), "_start"); }
}