X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fdisassembler%2Fllvm%2FLLVMDisassembler.cxx;h=8837239ca74d6b671613cfa1240a94c7f0fd71f2;hp=240e5c560952b35a1de3719aead77058775a7de8;hb=8c6f5533d4124e09d864ca5db2140acbd4a12777;hpb=6b2a5730a52cbd68613421b0a265a66b02720518 diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index 240e5c5..8837239 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -7,6 +7,7 @@ using namespace llvm; using namespace llvm::object; +using std::error_code; /* * TODO: fallback code falls die Datei kein ELF/PE/COFF/MacO/.. binary @@ -72,24 +73,30 @@ LLVMDisassembler::LLVMDisassembler(const std::string& filename) return; } - DisAsm.reset(target->createMCDisassembler(*STI)); + MOFI.reset(new MCObjectFileInfo); + MCContext Ctx(AsmInfo.get(), MRI.get(), MOFI.get()); + + DisAsm.reset(target->createMCDisassembler(*STI, Ctx)); if (!DisAsm) { LOG4CXX_ERROR(logger, "no disassembler for target " << tripleName); return; } - - MOFI.reset(new MCObjectFileInfo); - Ctx.reset(new MCContext(AsmInfo.get(), MRI.get(), MOFI.get())); RelInfo.reset( - target->createMCRelocationInfo(tripleName, *Ctx.get())); + target->createMCRelocationInfo(tripleName, Ctx)); if (RelInfo) { Symzer.reset( - MCObjectSymbolizer::createObjectSymbolizer(*Ctx.get(), RelInfo, o)); + MCObjectSymbolizer::createObjectSymbolizer(Ctx, std::move(RelInfo), o)); if (Symzer) - DisAsm->setSymbolizer(Symzer); + DisAsm->setSymbolizer(std::move(Symzer)); } + RelInfo.release(); + Symzer.release(); MIA.reset(target->createMCInstrAnalysis(MII.get())); + if (!MIA) { + LOG4CXX_ERROR(logger, "no instruction analysis for target " << tripleName); + return; + } int AsmPrinterVariant = AsmInfo->getAssemblerDialect(); IP.reset(target->createMCInstPrinter(AsmPrinterVariant, *AsmInfo, *MII, *MRI, *STI)); @@ -101,7 +108,7 @@ LLVMDisassembler::LLVMDisassembler(const std::string& filename) IP->setPrintImmHex(llvm::HexStyle::C); IP->setPrintImmHex(true); - OwningPtr OD( + std::unique_ptr OD( new MCObjectDisassembler(*o, *DisAsm, *MIA)); Mod.reset(OD->buildModule(false)); @@ -324,7 +331,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);