fn parse_elf()

in src/extract_execute.rs [73:150]


fn parse_elf(elf: &elf::Elf, buffer: &[u8]) -> BinaryInfo {
    let mut sections = Vec::new();

    for sh in &elf.section_headers {
        let name = if let Some(name) = elf.shdr_strtab.get_at(sh.sh_name) {
            name.to_string()
        } else {
            String::new()
        };

        let section_info = SectionInfo {
            name,
            virtual_address: sh.sh_addr,
            virtual_size: sh.sh_size,
            raw_address: sh.sh_offset,
            raw_size: sh.sh_size,
            characteristics_num: 0,
            characteristics_str: String::new(),
        };

        sections.push(section_info);
    }
    let architecture = elf::header::machine_to_str(elf.header.e_machine);

    let mut imports: HashMap<String, HashSet<String>> = HashMap::new();
    let mut exports = HashSet::new();

    let mut needed_libraries = Vec::new();
    if let Some(dynamic) = &elf.dynamic {
        needed_libraries = dynamic.get_libraries(&elf.dynstrtab);
    }

    let mut needed_libraries_str = String::new();
    for library in needed_libraries {
        if needed_libraries_str.is_empty() {
            needed_libraries_str = library.to_string();
        } else {
            needed_libraries_str += "\n";
            needed_libraries_str += library;
        }
    }

    let mut imports_str = String::new();

    for dynsym in elf.dynsyms.iter() {
        let Some(name) = elf.dynstrtab.get_at(dynsym.st_name) else {
            continue;
        };
        if name.is_empty() {
            continue;
        }
        if dynsym.is_import() {
            if imports_str.is_empty() {
                imports_str = name.to_string();
            } else {
                imports_str += "\n";
                imports_str += name;
            }
        } else {
            exports.insert(name.to_string());
        }
    }

    imports.insert(needed_libraries_str.clone(), HashSet::new());
    if let Some(entry) = imports.get_mut(&needed_libraries_str) {
        entry.insert(imports_str);
    }

    BinaryInfo {
        format: "ELF".to_string(),
        entry: format!("0x{:x}", elf.header.e_entry),
        architecture: architecture.to_string(),
        size: buffer.len() as u64,
        sections,
        imports,
        exports,
    }
}