#include "Binary.hxx"
+#include "disassembler/Disassembler.hxx"
+
#include <iostream>
#include <string>
#include <algorithm>
std::map<std::string, SectionRef> readSections(const ObjectFile& o) {
error_code ec;
std::map<std::string, SectionRef> result;
- section_iterator i(o.begin_sections()), e(o.end_sections());
- for (; i != e; i.increment(ec)) {
+ section_iterator i(o.section_begin()), e(o.section_end());
+ for (; i != e; ++i) {
StringRef name;
if (error(i->getName(name))) break;
std::map<std::string, SymbolRef> readSymbols(const ObjectFile& o) {
error_code ec;
std::map<std::string, SymbolRef> result;
- symbol_iterator si(o.begin_symbols()), se(o.end_symbols());
- for (; si != se; si.increment(ec)) {
+ symbol_iterator si(o.symbol_begin()), se(o.symbol_end());
+ for (; si != se; ++si) {
StringRef name;
if (error(si->getName(name))) break;
Binary::Binary(const std::string& filename)
: triple("unkown-unknown-unknown")
{
+ ::Disassembler d(filename);
std::string error;
- createBinary(filename, binary);
- if (Archive *a = dyn_cast<Archive>(binary.get())) {
+ binary = createBinary(filename).get();
+ if (Archive *a = dyn_cast<Archive>(binary)) {
std::cerr << "Got an archive!" << std::endl;
return;
}
- o = dyn_cast<ObjectFile>(binary.get());
+ o = dyn_cast<ObjectFile>(binary);
triple.setArch(Triple::ArchType(o->getArch()));
std::string tripleName(triple.getTriple());
std::vector<std::string> result;
for_each(symbols.begin(), symbols.end(), [&](const std::pair<std::string, SymbolRef>& i) {
bool contains;
- if (!error(r.containsSymbol(i.second, contains)) && contains)
- result.push_back(i.first);
+ SymbolRef::Type t;
+ if (!error(r.containsSymbol(i.second, contains)) && contains) {
+ i.second.getType(t);
+ if (SymbolRef::ST_Function == t)
+ result.push_back(i.first);
+ }
});
return result;
}
void Binary::for_each_instruction(const std::string& function,
std::function<void (long, std::string, std::string)> callback) {
StringRef bytes;
- SymbolRef ref = symbols[function];
- section_iterator sec(o->begin_sections());
uint64_t base_address, address, ssize, size(0), index, end;
+ StringRefMemoryObject memoryObject("");
- // outs() << "Start for_each_instruction " << function << "\n";
+ if (symbols.end() != symbols.find(function)) {
+ SymbolRef ref;
+ section_iterator sec(o->section_begin());
- if (error(ref.getSection(sec))) return;
- if (error(ref.getAddress(address))) return;
- if (address == UnknownAddressOrSize) return;
- if (error(ref.getSize(ssize))) return;
- if (error(sec->getAddress(base_address))) return;
- if (error(sec->getContents(bytes))) return;
+ ref = symbols.at(function);
+ if (error(ref.getSection(sec))) return;
+ if (error(ref.getAddress(address))) return;
+ if (address == UnknownAddressOrSize) return;
+ if (error(ref.getSize(ssize))) return;
+ if (error(sec->getAddress(base_address))) return;
+ if (error(sec->getContents(bytes))) return;
+ memoryObject = bytes;
- // outs() << "Middle for_each_instruction " << function << " Size: " << ssize << "\n";
+ }
+ else if (sections.end() != sections.find(function)) {
+ SectionRef sref = sections.at(function);
+ if (error(sref.getAddress(address))) return;
+ if (address == UnknownAddressOrSize) return;
+ if (error(sref.getSize(ssize))) return;
+ if (error(sref.getContents(bytes))) return;
+ base_address = address;
+ memoryObject = bytes;
+ }
+
+
+ // outs() << "Start for_each_instruction " << function << "\n";
- StringRefMemoryObject memoryObject(bytes);
for (end = address + ssize - base_address, index = address - base_address; index < end; index += size) {
MCInst Inst;
void Binary::disassemble_functions() {
error_code ec;
- for (section_iterator i = o->begin_sections(),
- e = o->end_sections();
- i != e; i.increment(ec)) {
+ for (section_iterator i = o->section_begin(),
+ e = o->section_end();
+ i != e; ++i) {
if (error(ec)) break;
bool text;
if (error(i->isText(text))) break;
// Make a list of all the symbols in this section.
std::vector<std::pair<uint64_t, StringRef> > Symbols;
- for (symbol_iterator si = o->begin_symbols(),
- se = o->end_symbols();
- si != se; si.increment(ec)) {
+ for (symbol_iterator si = o->symbol_begin(),
+ se = o->symbol_end();
+ si != se; ++si) {
bool contains;
if (!error(i->containsSymbol(*si, contains)) && contains) {
uint64_t Address;
outs() << '\n' << Symbols[si].second << ":\n";
#ifndef NDEBUG
- raw_ostream &DebugOut = DebugFlag ? dbgs() : nulls();
+ raw_ostream &DebugOut = nulls(); //DebugFlag ? dbgs() : nulls();
#else
raw_ostream &DebugOut = nulls();
#endif