int main(int argc, char *argv[]) { ROSE_INITIALIZE; Diagnostics::initAndRegister(&mlog, "tool"); // Parse command line Settings settings; std::vector<std::string> args = parseCommandLine(argc, argv, settings).unreachedArgs(); if (args.size()!=2) throw std::runtime_error("invalid usage; see --help"); // Load the CSV files FunctionByAddress code1, data1, code2, data2; readCsvFile(args[0], code1 /*out*/, data1 /*out*/); readCsvFile(args[1], code2 /*out*/, data2 /*out*/); showStats(FileSystem::Path(args[0]).filename().string(), code1, data1, FileSystem::Path(args[1]).filename().string(), code2, data2); std::cout <<"\n"; // Parse the specimen if (!settings.specimenName.empty()) { P2::Engine engine; MemoryMap::Ptr map = engine.loadSpecimens(settings.specimenName); InstructionProvider::Ptr insns = InstructionProvider::instance(engine.obtainDisassembler(), map); map->dump(std::cout); listInstructions(insns, map, code1, code2); } }
SgAsmInterpretation* RSIM_ColdFire::parseMainExecutable(RSIM_Process *process) { namespace P2 = rose::BinaryAnalysis::Partitioner2; using namespace Sawyer::CommandLine; // This is raw hardware, so assume that all the arguments are for loading the specimen. P2::Engine engine; Parser parser; parser .purpose("initializes ColdFire memory") .version(std::string(ROSE_SCM_VERSION_ID).substr(0, 8), ROSE_CONFIGURE_DATE) .chapter(1, "ROSE Command-line Tools") .doc("Synopsis", "@prop{programName} ... -- [@v{loader_switches}] @v{resources}") .doc("Description", "This part of the simulator command-line is responsible for configuring how @v{resources} are loaded into " "simulated FreeScale ColdFire system memory. If switches are provided here they must be separated from " "simulator switches with a \"--\" to prevent the simulator itself from interpreting them.\n\n" + engine.specimenNameDocumentation()) .with(Switch("help", 'h') .hidden(true) .action(showHelpAndExit(0))) .with(engine.loaderSwitches()); std::vector<std::string> resources = parser.parse(exeArgs()).apply().unreachedArgs(); engine.isaName("coldfire"); MemoryMap::Ptr map = engine.loadSpecimens(resources); process->mem_transaction_start("specimen main memory"); *process->get_memory() = *map; // shallow copy, new segments point to same old data // The initial program counter is stored at address 4, the second entry in the interrupt vector. uint32_t initialIpBe = 0; if (!map->at(4).limit(sizeof initialIpBe).read((uint8_t*)&initialIpBe)) { mlog[FATAL] <<"failed to read initial program counter from address zero\n"; exit(1); } uint32_t initialIp = ByteOrder::be_to_host(initialIpBe); process->entryPointOriginalVa(initialIp); process->entryPointStartVa(initialIp); process->disassembler(engine.obtainDisassembler()); return engine.interpretation(); // probably null since args not likely to be ELF or PE }
int main(int argc, char *argv[]) { ROSE_INITIALIZE; Diagnostics::initAndRegister(mlog, "tool"); Sawyer::ProgressBarSettings::minimumUpdateInterval(0.2); // more fluid spinner // Parse command-line P2::Engine engine; Settings settings; std::vector<std::string> args = parseCommandLine(argc, argv, engine, settings); ASSERT_always_require2(args.size() >= 2, "incorrect usage; see --help"); // Parse file containing instruction addresses std::string addrFileName = args[0]; std::set<rose_addr_t> knownVas = parseAddressFile(addrFileName); mlog[INFO] <<"parsed " <<plural(knownVas.size(), "unique addresses") <<"\n"; // Load specimen natively and attach debugger std::vector<std::string> specimen_cmd(args.begin()+1, args.end()); BinaryDebugger debugger(specimen_cmd); debugger.setBreakpoint(AddressInterval::whole()); ASSERT_always_require(debugger.isAttached()); ASSERT_always_forbid(debugger.isTerminated()); pid_t pid = debugger.isAttached(); mlog[INFO] <<"child PID " <<pid <<"\n"; // Get memory map. MemoryMap map; if (MAP_ROSE==settings.mapSource) { map = engine.loadSpecimens(specimen_cmd[0]); } else { map.insertProcess(":noattach:" + numberToString(pid)); } map.dump(mlog[INFO]); // The addresses specified in the instruction address file must all be in memory that is mapped. BOOST_FOREACH (rose_addr_t va, knownVas) { ASSERT_always_require2(map.at(va).require(MemoryMap::EXECUTABLE).exists(), "given address " + addrToString(va) + " is not mapped or lacks execute permission"); }