#include "disassembler/llvm/LLVMDisassembler.hxx"
#include "disassembler/llvm/LLVMBasicBlock.hxx"
#include "disassembler/llvm/LLVMFunction.hxx"
+#include "core/InformationManager.hxx"
#include <stack>
#include <algorithm>
readSymbols();
readSections();
disassemble();
+ readDynamicSymbols();
}
template <typename ELFT>
LLVMDisassembler<ELFT>::~LLVMDisassembler() {
- std::for_each(functions.begin(), functions.end(),
- [](std::pair<uint64_t,LLVMFunction*> it) {
- delete it.second;
- });
- std::for_each(blocks.begin(), blocks.end(),
- [](std::pair<uint64_t, LLVMBasicBlock*> it) {
- delete it.second;
- });
+ // std::for_each(functions.begin(), functions.end(),
+ // [](std::pair<uint64_t,LLVMFunction*> it) {
+ // delete it.second;
+ // });
+ // std::for_each(blocks.begin(), blocks.end(),
+ // [](std::pair<uint64_t, LLVMBasicBlock*> it) {
+ // delete it.second;
+ // });
}
template <typename ELFT>
}
if (binary->isELF()) {
- bool is64bit = (binary->getData()[4] == 0x02);
+ const ELFO * elffile = o->getELFFile();
+ const typename ELFO::Elf_Ehdr * header = elffile->getHeader();
- for (int i(0); i < (is64bit? 8 : 4); ++i) {
- if (binary->isLittleEndian()) {
- _entryAddress |= (unsigned int)((unsigned char)binary->getData()[0x18 + i]) << 8*i;
- } else {
- _entryAddress = _entryAddress << 8;
- _entryAddress |= (unsigned char)binary->getData()[0x18 + i];
- }
- }
+ _entryAddress = header->e_entry;
LOG4CXX_DEBUG(logger, "Adding entryAddress at: " << std::hex << _entryAddress);
std::stringstream s;
s << "<_start 0x" << std::hex << _entryAddress << ">";
}
}
+template <typename ELFT>
+void LLVMDisassembler<ELFT>::readDynamicSymbols() {
+ const ELFO * elffile = o->getELFFile();
+ for (typename ELFO::Elf_Sym_Iter
+ it = elffile->begin_dynamic_symbols(),
+ end = elffile->end_dynamic_symbols();
+ it != end;
+ ++it) {
+ if (it->getType() == 2) { // Function
+ bool is_default;
+ // TODO: Error handling
+ std::string symbolname = *(elffile->getSymbolName(it));
+ std::string symbolversion = *(elffile->getSymbolVersion(nullptr, &*it, is_default));
+ manager->signal_new_dyn_symbol(symbolname + (is_default? "@@" : "@") + symbolversion);
+ LOG4CXX_DEBUG(logger, "Adding dynamic Symbol " << symbolname << (is_default? "@@" : "@") << symbolversion);
+ }
+ }
+}
+
template <typename ELFT>
void LLVMDisassembler<ELFT>::readSymbols() {
error_code ec;