using namespace llvm::object;
using std::error_code;
+namespace {
+ class COFFT {
+
+ };
+}
+
/*
*
*/
if (ELF64BEObjectFile * object = dyn_cast<ELF64BEObjectFile>(op)) {
return new LLVMDisassembler<ELFType<support::big, 2, true>>(filename, manager, object);
}
+ if (COFFObjectFile * object = dyn_cast<COFFObjectFile>(op)) {
+ return new LLVMDisassembler<COFFT>(filename, manager, object);
+ }
return NULL;
}
template <typename ELFT>
LLVMDisassembler<ELFT>::LLVMDisassembler(const std::string& filename,
InformationManager* manager,
- ELFObjectFile<ELFT>* file)
+ ObjectFile* file)
: Disassembler()
, logger(log4cxx::Logger::getLogger("LLVMDisassembler"))
, triple("unknown-unknown-unknown")
binary.reset(result.get());
- o = dyn_cast<ELFObjectFile<ELFT>>(binary.get());
+ o = dyn_cast<ObjectFile>(binary.get());
} else {
o = file;
binary.reset(file);
}
if (binary->isELF()) {
- const ELFO * elffile = o->getELFFile();
- const typename ELFO::Elf_Ehdr * header = elffile->getHeader();
-
- _entryAddress = header->e_entry;
+ uint64_t _entryAddress = entryAddress();
LOG4CXX_DEBUG(logger, "Adding entryAddress at: " << std::hex << _entryAddress);
std::stringstream s;
s << "<_start 0x" << std::hex << _entryAddress << ">";
}
}
+template <>
+uint64_t LLVMDisassembler<COFFT>::entryAddress() {
+ const auto coffobject = dyn_cast<COFFObjectFile>(o);
+ const struct pe32_header* pe32_header;
+ const struct pe32plus_header* pe32plus_header;
+
+ coffobject->getPE32PlusHeader(pe32plus_header);
+
+ if (pe32plus_header) {
+ return pe32plus_header->AddressOfEntryPoint;
+ } else {
+ coffobject->getPE32Header(pe32_header);
+ return pe32_header->AddressOfEntryPoint;
+ }
+}
+
+template <typename ELFT>
+uint64_t LLVMDisassembler<ELFT>::entryAddress() {
+ const auto elffile = dyn_cast<ELFObjectFile<ELFT>>(o)->getELFFile();
+ const auto * header = elffile->getHeader();
+
+ return header->e_entry;
+}
+
template <typename ELFT>
void LLVMDisassembler<ELFT>::splitBlocks(Function* function) {
SectionRef text_section = sections[".text"];
}
}
+template<>
+void LLVMDisassembler<COFFT>::readDynamicSymbols() {
+ //TODO
+}
+
template <typename ELFT>
void LLVMDisassembler<ELFT>::readDynamicSymbols() {
- const ELFO * elffile = o->getELFFile();
- for (typename ELFO::Elf_Sym_Iter
- it = elffile->begin_dynamic_symbols(),
+ const auto elffile = dyn_cast<ELFObjectFile<ELFT>>(o)->getELFFile();
+ for (auto it = elffile->begin_dynamic_symbols(),
end = elffile->end_dynamic_symbols();
it != end;
++it) {
Disassembler * createLLVMDisassembler(const std::string& filename, InformationManager* manager);
-template <typename ELFT>
+template <typename ObjectType>
class LLVMDisassembler
: public Disassembler {
public:
LLVMDisassembler(const std::string& filename, InformationManager* manager,
- llvm::object::ELFObjectFile<ELFT>* file = NULL);
+ llvm::object::ObjectFile* file = NULL);
virtual ~LLVMDisassembler();
void start();
void getSymbols() {}
- uint64_t entryAddress() {return _entryAddress;}
+ uint64_t entryAddress();
void printEachInstruction(uint64_t start, uint64_t end,
std::function<void (uint8_t*, size_t, const std::string&,
Function * disassembleFunctionAt(uint64_t address, const std::string& name = "");
private:
- typedef llvm::object::ELFFile<ELFT> ELFO;
-
// http://llvm.org/docs/doxygen/html/MCObjectDisassembler_8cpp_source.html +197
void disassembleFunction(Function* function);
void splitBlocks(Function* fun);
std::shared_ptr<llvm::object::Binary> binary;
const llvm::Target * target;
- llvm::object::ELFObjectFile<ELFT> * o;
+ llvm::object::ObjectFile * o;
std::unique_ptr<const llvm::MCRegisterInfo> MRI;
std::unique_ptr<const llvm::MCAsmInfo> AsmInfo;