X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fdisassembler%2Fllvm%2FLLVMDisassembler.cxx;h=8dd548332bf4f1f01106cd2020db3b137e13b626;hp=7d4da0119955da9087ea2a70a5b11c4ae0e4a485;hb=879c174dd56331b6c7b3254edd115e46a0b5e78c;hpb=cb4e14fde0ee90cf5986f2a15b95acb98b04045c diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index 7d4da01..8dd5483 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -13,26 +13,25 @@ using std::error_code; * */ Disassembler * createLLVMDisassembler(const std::string& filename, InformationManager* manager) { + if (filename == "") + return NULL; + std::unique_ptr o; o.reset(createBinary(filename).get()); - const Binary * op = o.get(); + Binary * op = o.release(); // ELFType - if (const ELF32LEObjectFile * _ = dyn_cast(op)) { -#pragma unused(_) - return new LLVMDisassembler>(filename, manager); + if (ELF32LEObjectFile * object = dyn_cast(op)) { + return new LLVMDisassembler>(filename, manager, object); } - if (const ELF64LEObjectFile * _ = dyn_cast(op)) { -#pragma unused(_) - return new LLVMDisassembler>(filename, manager); + if (ELF64LEObjectFile * object = dyn_cast(op)) { + return new LLVMDisassembler>(filename, manager, object); } - if (const ELF32BEObjectFile * _ = dyn_cast(op)) { -#pragma unused(_) - return new LLVMDisassembler>(filename, manager); + if (ELF32BEObjectFile * object = dyn_cast(op)) { + return new LLVMDisassembler>(filename, manager, object); } - if (const ELF64BEObjectFile * _ = dyn_cast(op)) { -#pragma unused(_) - return new LLVMDisassembler>(filename, manager); + if (ELF64BEObjectFile * object = dyn_cast(op)) { + return new LLVMDisassembler>(filename, manager, object); } return NULL; @@ -45,25 +44,32 @@ Disassembler * createLLVMDisassembler(const std::string& filename, InformationMa */ template LLVMDisassembler::LLVMDisassembler(const std::string& filename, - InformationManager* manager) + InformationManager* manager, + ELFObjectFile* file) : Disassembler(filename, manager) , logger(log4cxx::Logger::getLogger("LLVMDisassembler")) , triple("unknown-unknown-unknown") , manager(manager) { LOG4CXX_DEBUG(logger, "Handling file" << filename); - auto result = createBinary(filename); - error_code ec; - if ((ec = result.getError())) { - LOG4CXX_ERROR(logger, "Failed to load Binary" << ec.message()); - binary = NULL; - return; - } + if (!file) { + auto result = createBinary(filename); + + error_code ec; + if ((ec = result.getError())) { + LOG4CXX_ERROR(logger, "Failed to load Binary" << ec.message()); + binary = NULL; + return; + } - binary.reset(result.get()); + binary.reset(result.get()); - o = dyn_cast(binary.get()); + o = dyn_cast>(binary.get()); + } else { + o = file; + binary.reset(file); + } triple.setArch(Triple::ArchType(o->getArch())); std::string tripleName(triple.getTriple()); @@ -429,8 +435,9 @@ void LLVMDisassembler::forEachFunction(std::function void LLVMDisassembler::printEachInstruction(uint64_t start, uint64_t end, - std::function fun) { + std::function fun) { SectionRef text_section = sections[".text"]; uint64_t base_address; text_section.getAddress(base_address); @@ -453,17 +460,24 @@ void LLVMDisassembler::printEachInstruction(uint64_t start, uint64_t end, ref.readBytes(current_address, inst_size, bytes); uint64_t jmptarget; + std::string ref(""); + IP->printInst(&inst, s, ""); if (MIA->evaluateBranch(inst, current_address, inst_size, jmptarget)) { std::stringstream stream; + if (MIA->isCall(inst)) + stream << "function:"; + else + stream << "block:"; + stream << std::hex << (base_address + jmptarget); - IP->printInst(&inst, s, stream.str()); - } else - IP->printInst(&inst, s, ""); + ref = stream.str(); + } + - fun(bytes, inst_size, s.str()); + fun(bytes, inst_size, s.str(), ref); } else { LOG4CXX_WARN(logger, "Invalid byte at" << std::hex << current_address + base_address); - fun(NULL, 0, "Invalid Byte"); + fun(NULL, 0, "Invalid Byte", ""); inst_size = 1; }