]> git.siccegge.de Git - frida/frida.git/blobdiff - src/disassembler/llvm/LLVMDisassembler.cxx
Add in an Information Manager
[frida/frida.git] / src / disassembler / llvm / LLVMDisassembler.cxx
index 3642c5ed74b7492665d385b540bb0444234461e5..7f87b80116068fc6c6d88cafae059b2839c14400 100644 (file)
@@ -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<MCObjectDisassembler> 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() {