]> git.siccegge.de Git - frida/frida.git/blobdiff - src/disassembler/llvm/LLVMDisassembler.cxx
Include absolute branch address
[frida/frida.git] / src / disassembler / llvm / LLVMDisassembler.cxx
index 1067fcc1f02bebcefd01969fbd99142902a59c54..76b313de3bf996d0d355bc69e9b004c47d476efb 100644 (file)
@@ -235,7 +235,7 @@ void LLVMDisassembler::disassemble() {
                uint64_t base_address;
                text_section.getAddress(base_address);
                uint64_t current_address = current_block->getStartAddress() - base_address;
-               while(current_block->getEndAddress() - base_address != current_address) {
+               while(current_block->getEndAddress() - base_address > current_address) {
                        MCInst inst;
                        std::string buf;
                        llvm::raw_string_ostream s(buf);
@@ -245,14 +245,17 @@ void LLVMDisassembler::disassemble() {
                                auto other = blocks.find(current_address + inst_size + base_address);
 
                                if (other != blocks.end()) {
-                                       LOG4CXX_DEBUG(logger, "Shortening block starting at "
-                                                                 << std::hex
-                                                                 << current_block->getStartAddress()
-                                                                 << " now ending at "
-                                                                 << other->first);
-                                       current_block->setEndAddress(current_address + inst_size + base_address);
-                                       current_block->setNextBlock(0, other->first);
-                                       current_block->setNextBlock(1, 0);
+                                       uint64_t endaddress = current_address + inst_size + base_address;
+                                       if (endaddress != current_block->getEndAddress()) {
+                                               LOG4CXX_DEBUG(logger, "Shortening block starting at "
+                                                                         << std::hex
+                                                                         << current_block->getStartAddress()
+                                                                         << " now ending at "
+                                                                         << other->first);
+                                               current_block->setEndAddress(endaddress);
+                                               current_block->setNextBlock(0, other->first);
+                                               current_block->setNextBlock(1, 0);
+                                       }
                                }
                        } else {
                                inst_size = 1;
@@ -321,7 +324,14 @@ void LLVMDisassembler::printEachInstruction(uint64_t start, uint64_t end,
             uint8_t bytes[inst_size+2];
             ref.readBytes(current_address, inst_size, bytes);
 
-            IP->printInst(&inst, s, "");
+                       uint64_t jmptarget;
+                       if (MIA->evaluateBranch(inst, current_address, inst_size, jmptarget)) {
+                               std::stringstream stream;
+                               stream << std::hex << (base_address + jmptarget);
+                               IP->printInst(&inst, s, stream.str());
+                       } else
+                               IP->printInst(&inst, s, "");
+
                        fun(bytes, inst_size, s.str());
         } else {
                        LOG4CXX_WARN(logger, "Invalid byte at" << std::hex << current_address + base_address);