]>
git.siccegge.de Git - frida/frida.git/blob - src/disassembler/llvm/LLVMDisassembler.cxx
881c662961717041f2d6a9b8ab60b47cf7782f6f
1 #include "disassembler/llvm/LLVMDisassembler.hxx"
4 using namespace llvm::object
;
7 * TODO: fallback code falls die Datei kein ELF/PE/COFF/MacO/.. binary
8 * ist sondern z.B. einfach nur Instruktionen oder ein Bootsektor oder
12 LLVMDisassembler::LLVMDisassembler(const std::string
& filename
)
13 : Disassembler(filename
)
14 , logger(log4cxx::Logger::getLogger("LLVMDisassembler"))
15 , triple("unknown-unknown-unknown")
17 LOG4CXX_DEBUG(logger
, "Handling file" << filename
);
18 auto result
= createBinary(filename
);
21 if ((ec
= result
.getError())) {
22 LOG4CXX_ERROR(logger
, "Failed to load Binary" << ec
.message());
27 binary
.reset(result
.get());
29 o
= dyn_cast
<ObjectFile
>(binary
.get());
31 triple
.setArch(Triple::ArchType(o
->getArch()));
32 std::string
tripleName(triple
.getTriple());
34 LOG4CXX_INFO(logger
, "Architecture " << tripleName
);
38 target
= TargetRegistry::lookupTarget("", triple
, es
);
40 LOG4CXX_ERROR(logger
, es
);
44 LOG4CXX_INFO(logger
, "Target " << target
->getName());
46 MRI
.reset(target
->createMCRegInfo(tripleName
));
48 LOG4CXX_ERROR(logger
, "no register info for target " << tripleName
);
52 // Set up disassembler.
53 AsmInfo
.reset(target
->createMCAsmInfo(*MRI
, tripleName
));
55 LOG4CXX_ERROR(logger
, "no assembly info for target " << tripleName
);
59 STI
.reset(target
->createMCSubtargetInfo(tripleName
, "", ""));
61 LOG4CXX_ERROR(logger
, "no subtarget info for target " << tripleName
);
65 MII
.reset(target
->createMCInstrInfo());
67 LOG4CXX_ERROR(logger
, "no instruction info for target " << tripleName
);
71 DisAsm
.reset(target
->createMCDisassembler(*STI
));
73 LOG4CXX_ERROR(logger
, "no disassembler for target " << tripleName
);
77 MOFI
.reset(new MCObjectFileInfo
);
78 Ctx
.reset(new MCContext(AsmInfo
.get(), MRI
.get(), MOFI
.get()));
80 target
->createMCRelocationInfo(tripleName
, *Ctx
.get()));
83 MCObjectSymbolizer::createObjectSymbolizer(*Ctx
.get(), RelInfo
, o
));
85 DisAsm
->setSymbolizer(Symzer
);
88 MIA
.reset(target
->createMCInstrAnalysis(MII
.get()));
90 int AsmPrinterVariant
= AsmInfo
->getAssemblerDialect();
91 IP
.reset(target
->createMCInstPrinter(AsmPrinterVariant
, *AsmInfo
, *MII
, *MRI
, *STI
));
93 LOG4CXX_ERROR(logger
, "no instruction printer for target " << tripleName
);
97 OwningPtr
<MCObjectDisassembler
> OD(
98 new MCObjectDisassembler(*o
, *DisAsm
, *MIA
));
99 Mod
.reset(OD
->buildModule(false));