66 lines
1.4 KiB
C++
66 lines
1.4 KiB
C++
#include "symbol_collection.h"
|
|
#include "accumulation.h"
|
|
|
|
#include <iostream>
|
|
|
|
using namespace LIEF::ELF;
|
|
|
|
GlobalSymtab global_syms;
|
|
|
|
bool collect_symbols(const std::unique_ptr<LIEF::ELF::Binary>& 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;
|
|
}
|
|
|