[LLVMdev] Disassembly arbitrary machine-code byte arrays

Aidan Steele llvm at aidans.org
Sun Dec 18 20:29:54 PST 2011


Hi,

My apologies if this appears to be a very trivial question -- I have
tried to solve this on my own and I am stuck. Any assistance that
could be provided would be immensely appreciated.

What is the absolute bare minimum that I need to do to disassemble an
array of, say, ARM machine code bytes? Or an array of Thumb machine
code bytes? For example, I might have an array of unsigned chars --
how could I go about decoding these into MCInst objects? Does such a
decoding process take place in one fell swoop or do I parse the stream
one instruction at a time? Can I ask it to "decode the next 10 bytes"?
What follows is my (feeble) attempt at getting started. It probably
doesn't help that I am only familiar with C and Objective-C and find
C++ syntax absolutely bewildering.

Kind regards,
Aidan Steele

int main (int argc, const char *argv[])
{
 LLVMInitializeARMTargetInfo();
 LLVMInitializeARMTargetMC();
 LLVMInitializeARMAsmParser();
 LLVMInitializeARMDisassembler();

 const llvm::Target Target;

 llvm::OwningPtr<const llvm::MCSubtargetInfo>
STI(Target.createMCSubtargetInfo("", "", ""));
 llvm::OwningPtr<const llvm::MCDisassembler>
disassembler(Target.createMCDisassembler(*STI));

 llvm::OwningPtr<llvm::MemoryBuffer> Buffer;
 llvm::MemoryBuffer::getFile(llvm::StringRef("/path/to/file.bin"), Buffer);
 llvm::MCInst Inst;
 uint64_t Size = 0;

 disassembler->getInstruction(Inst, Size, *Buffer.take(), 0,
llvm::nulls(), llvm::nulls());

//  llvm::StringRef TheArchString("arm-apple-darwin");
//  std::string normalized = llvm::Triple::normalize(TheArchString);
//
//  llvm::Triple TheTriple;
//  TheTriple.setArch(llvm::Triple::arm);
//  TheTriple.setOS(llvm::Triple::Darwin);
//  TheTriple.setVendor(llvm::Triple::Apple);
//  llvm::Target *TheTarget = NULL;

 return 0;
}



More information about the llvm-dev mailing list