X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fdisassembler%2Fllvm%2FLLVMDisassembler.cxx;h=7f87b80116068fc6c6d88cafae059b2839c14400;hp=3642c5ed74b7492665d385b540bb0444234461e5;hb=231dae075375e7d57982f5107b86294fbe726b33;hpb=880ba6d085d9a6b70523328b8099679a664b8c0c diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index 3642c5e..7f87b80 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -14,10 +14,12 @@ using std::error_code; * 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); @@ -111,7 +113,9 @@ LLVMDisassembler::LLVMDisassembler(const std::string& filename) std::unique_ptr OD( new MCObjectDisassembler(*o, *DisAsm, *MIA)); Mod.reset(OD->buildModule(false)); +} +void LLVMDisassembler::start() { readSymbols(); readSections(); disassemble(); @@ -129,6 +133,16 @@ LLVMDisassembler::~LLVMDisassembler() { } 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]; } @@ -221,6 +235,7 @@ void LLVMDisassembler::disassembleFunction(LLVMFunction* function) { } } LOG4CXX_DEBUG(logger, "Finished function " << function->getName()); + manager->signal_new_function(function); } void LLVMDisassembler::disassemble() {