- 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;
- }
-
- binary.reset(result.get());
-
- o = dyn_cast<ObjectFile>(binary.get());
-
- triple.setArch(Triple::ArchType(o->getArch()));
- std::string tripleName(triple.getTriple());
-
- LOG4CXX_INFO(logger, "Architecture " << tripleName);
-
-
- std::string es;
- target = TargetRegistry::lookupTarget("", triple, es);
- if (!target) {
- LOG4CXX_ERROR(logger, es);
- return;
- }
-
- LOG4CXX_INFO(logger, "Target " << target->getName());
-
- MRI.reset(target->createMCRegInfo(tripleName));
- if (!MRI) {
- LOG4CXX_ERROR(logger, "no register info for target " << tripleName);
- return;
- }
-
- // Set up disassembler.
- AsmInfo.reset(target->createMCAsmInfo(*MRI, tripleName));
- if (!AsmInfo) {
- LOG4CXX_ERROR(logger, "no assembly info for target " << tripleName);
- return;
- }
-
- STI.reset(target->createMCSubtargetInfo(tripleName, "", ""));
- if (!STI) {
- LOG4CXX_ERROR(logger, "no subtarget info for target " << tripleName);
- return;
- }
-
- MII.reset(target->createMCInstrInfo());
- if (!MII) {
- LOG4CXX_ERROR(logger, "no instruction info for target " << tripleName);
- return;
- }
-
- DisAsm.reset(target->createMCDisassembler(*STI));
- 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()));
- if (RelInfo) {
- Symzer.reset(
- MCObjectSymbolizer::createObjectSymbolizer(*Ctx.get(), RelInfo, o));
- if (Symzer)
- DisAsm->setSymbolizer(Symzer);
- }
-
- MIA.reset(target->createMCInstrAnalysis(MII.get()));
-
- int AsmPrinterVariant = AsmInfo->getAssemblerDialect();
- IP.reset(target->createMCInstPrinter(AsmPrinterVariant, *AsmInfo, *MII, *MRI, *STI));
- if (!IP) {
- LOG4CXX_ERROR(logger, "no instruction printer for target " << tripleName);
- return;
- }
-
- IP->setPrintImmHex(llvm::HexStyle::C);
- IP->setPrintImmHex(true);
-
- OwningPtr<MCObjectDisassembler> OD(
- new MCObjectDisassembler(*o, *DisAsm, *MIA));
- Mod.reset(OD->buildModule(false));
-
- readSymbols();
- readSections();
- disassemble();
+ LOG4CXX_DEBUG(logger, "Handling file " << filename);
+
+ 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());
+
+ o = dyn_cast<ObjectFile>(binary.get());
+ } else {
+ o = file;
+ binary.reset(file);
+ }
+
+ triple.setArch(Triple::ArchType(o->getArch()));
+ std::string tripleName(triple.getTriple());
+
+ LOG4CXX_INFO(logger, "Architecture " << tripleName);
+
+
+ std::string es;
+ target = TargetRegistry::lookupTarget("", triple, es);
+ if (!target) {
+ LOG4CXX_ERROR(logger, es);
+ return;
+ }
+
+ LOG4CXX_INFO(logger, "Target " << target->getName());
+
+ MRI.reset(target->createMCRegInfo(tripleName));
+ if (!MRI) {
+ LOG4CXX_ERROR(logger, "no register info for target " << tripleName);
+ return;
+ }
+
+ // Set up disassembler.
+ AsmInfo.reset(target->createMCAsmInfo(*MRI, tripleName));
+ if (!AsmInfo) {
+ LOG4CXX_ERROR(logger, "no assembly info for target " << tripleName);
+ return;
+ }
+
+ STI.reset(target->createMCSubtargetInfo(tripleName, "", ""));
+ if (!STI) {
+ LOG4CXX_ERROR(logger, "no subtarget info for target " << tripleName);
+ return;
+ }
+
+ MII.reset(target->createMCInstrInfo());
+ if (!MII) {
+ LOG4CXX_ERROR(logger, "no instruction info for target " << tripleName);
+ return;
+ }
+
+ 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;
+ }
+ RelInfo.reset(
+ target->createMCRelocationInfo(tripleName, Ctx));
+ if (RelInfo) {
+ // Symzer.reset(
+ // MCObjectSymbolizer::createObjectSymbolizer(Ctx, std::move(RelInfo), o));
+ // if (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));
+ if (!IP) {
+ LOG4CXX_ERROR(logger, "no instruction printer for target " << tripleName);
+ return;
+ }
+
+ IP->setPrintImmHex(llvm::HexStyle::C);
+ IP->setPrintImmHex(true);
+
+ std::unique_ptr<MCObjectDisassembler> OD(
+ new MCObjectDisassembler(*o, *DisAsm, *MIA));
+ Mod.reset(OD->buildModule(false));
+
+ readSections();
+}
+
+template <typename ELFT>
+void LLVMDisassembler<ELFT>::start() {
+ readSymbols();
+ disassemble();
+ readDynamicSymbols();
+}
+
+template <typename ELFT>
+LLVMDisassembler<ELFT>::~LLVMDisassembler() {}
+
+template <typename ELFT>
+Function* LLVMDisassembler<ELFT>::disassembleFunctionAt(uint64_t address, const std::string& name) {
+ Function * function;
+ 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 (NULL == (function = manager->getFunction(address))) {
+
+ if (name == "") {
+ std::stringstream s;
+ s << "<Unnamed 0x" << std::hex << address << ">";
+ function = manager->newFunction(address);
+ function->setName(s.str());
+ } else {
+ function = manager->newFunction(address);
+ function->setName(name);
+ }
+ disassembleFunction(function);
+ }
+
+ return function;