#include "symbol_collection.h" #include "accumulation.h" #include using namespace LIEF::ELF; GlobalSymtab global_syms; bool collect_symbols(const std::unique_ptr& bin) { if (!bin) return false; global_syms.symbols.clear(); for (const Symbol& sym : bin->symbols()) { if (sym.name().empty()) continue; if (sym.type() != Symbol::TYPE::OBJECT && sym.type() != Symbol::TYPE::NOTYPE) continue; if (sym.binding() != Symbol::BINDING::GLOBAL) continue; VADDR vaddr = sym.value(); if (global_syms.symbols.contains(sym.name())) { std::cerr << "Duplicate global symbol \"" << sym.name() << "\"!" << std::endl; return false; } global_syms.symbols.emplace(sym.name(), vaddr); } return true; } bool associate_symbols() { for (auto& [cu_uid, cu] : units) { for (auto& [ipin_sym, ipin] : cu.ipins) { if (!global_syms.symbols.contains(ipin_sym)) { std::cerr << "Unable to locate global ipin symbol \"" << ipin_sym << "\"" << std::endl; return false; } ipin.hit.emplace(); ipin.hit->vaddr = global_syms.symbols.at(ipin_sym); } for (auto& [dpin_sym, dpin] : cu.dpins) { if (!global_syms.symbols.contains(dpin_sym)) { std::cerr << "Unable to locate global dpin symbol \"" << dpin_sym << "\"" << std::endl; return false; } dpin.hit.emplace(); dpin.hit->vaddr = global_syms.symbols.at(dpin_sym); } } return true; }