* ist sondern z.B. einfach nur Instruktionen oder ein Bootsektor oder
* foo
*/
-LLVMDisassembler::LLVMDisassembler(const std::string& filename)
- : Disassembler(filename)
+LLVMDisassembler::LLVMDisassembler(const std::string& filename,
+ InformationManager* manager)
+ : Disassembler(filename, manager)
, logger(log4cxx::Logger::getLogger("LLVMDisassembler"))
, triple("unknown-unknown-unknown")
+ , manager(manager)
{
LOG4CXX_DEBUG(logger, "Handling file" << filename);
auto result = createBinary(filename);
std::unique_ptr<MCObjectDisassembler> OD(
new MCObjectDisassembler(*o, *DisAsm, *MIA));
Mod.reset(OD->buildModule(false));
+}
+void LLVMDisassembler::start() {
readSymbols();
readSections();
disassemble();
}
Function* LLVMDisassembler::disassembleFunctionAt(uint64_t address, const std::string& name) {
+ SectionRef text_section = sections[".text"];
+ uint64_t base_address, size;
+ text_section.getAddress(base_address);
+ text_section.getSize(size);
+
+ if (address < base_address ||
+ address >= base_address + size) {
+ return NULL;
+ }
+
if (functions.find(address) != functions.end()) {
return functions[address];
}
}
}
LOG4CXX_DEBUG(logger, "Finished function " << function->getName());
+ manager->signal_new_function(function);
}
void LLVMDisassembler::disassemble() {