From ac7cec76842c8f54f4d794fd9a4d25457e27ffd9 Mon Sep 17 00:00:00 2001 From: hoffmann Date: Tue, 15 Jan 2013 12:53:49 +0000 Subject: [PATCH] ElfReader: Constructor tries to get ELF from ENV FAIL_ELF_PATH git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@2002 8c4709b5-6ec9-48aa-a5cd-a96041d1645a --- doc/how-to-build.txt | 1 + src/core/util/ElfReader.cc | 241 +++++++++++--------- src/core/util/ElfReader.hpp | 11 +- src/experiments/vezs-example/experiment.cc | 71 +++--- src/experiments/vezs-example/experiment.hpp | 11 +- 5 files changed, 181 insertions(+), 154 deletions(-) diff --git a/doc/how-to-build.txt b/doc/how-to-build.txt index f4c00390..7ec573e2 100644 --- a/doc/how-to-build.txt +++ b/doc/how-to-build.txt @@ -10,6 +10,7 @@ Required for Fail*: - protobuf-compiler - cmake - cmake-curses-gui + - binutils-dev - AspectC++ (ag++, ac++): AspectC++ 1.1 or newer is known to work and can be obtained from http://www.aspectc.org; nightlies can be downloaded from http://akut.aspectc.org diff --git a/src/core/util/ElfReader.cc b/src/core/util/ElfReader.cc index b18ce290..91a8c1d8 100644 --- a/src/core/util/ElfReader.cc +++ b/src/core/util/ElfReader.cc @@ -10,157 +10,172 @@ namespace fail { const std::string ElfReader::NOTFOUND = "[ELFReader] Function not found."; - ElfReader::ElfReader(const char* path) : m_log("Fail*Elfinfo", false){ - // Try to open the ELF file - FILE * fp = fopen(path, "r"); - if (!fp) { - m_log << "Error: Could not open " << path << std::endl; - return; - } - // Evaluate headers - Elf32_Ehdr ehdr; - Elf32_Shdr sec_hdr; - int num_hdrs,i; - fseek(fp,(off_t)0,SEEK_SET); - read_ELF_file_header(fp, &ehdr); - num_hdrs=ehdr.e_shnum; - m_log << "Evaluating ELF File: " << path << std::endl; - // Parse symbol table and generate internal map - for(i=0;isecond; - } + const_iterator_t iterator = map.left.find(name); + if(iterator == map.left.end()){ + return ADDR_INV; + }else{ + return iterator->second; } +} #endif #ifndef __puma - std::string ElfReader::getName(const bimap_t& map, guest_address_t address){ - // .right switches key/value - typedef bimap_t::right_map::const_iterator const_iterator_t; +std::string ElfReader::getName(const bimap_t& map, guest_address_t address){ + // .right switches key/value + typedef bimap_t::right_map::const_iterator const_iterator_t; - const_iterator_t iterator = map.right.find(address); - if(iterator != map.right.end()){ - return iterator->second; - } - return NOTFOUND; + const_iterator_t iterator = map.right.find(address); + if(iterator != map.right.end()){ + return iterator->second; } + return NOTFOUND; +} - std::string ElfReader::getNameByAddress(guest_address_t address) { - std::string res = getName(m_bimap_demangled, address); - if(res == NOTFOUND){ - return getName(m_bimap_mangled, address); - } - return res; - } - - std::string ElfReader::getMangledNameByAddress(guest_address_t address) { +std::string ElfReader::getNameByAddress(guest_address_t address) { + std::string res = getName(m_bimap_demangled, address); + if(res == NOTFOUND){ return getName(m_bimap_mangled, address); } + return res; +} - std::string ElfReader::getDemangledNameByAddress(guest_address_t address) { - return getName(m_bimap_demangled, address); - } +std::string ElfReader::getMangledNameByAddress(guest_address_t address) { + return getName(m_bimap_mangled, address); +} - void ElfReader::printDemangled(){ - print_map(m_bimap_demangled.right); // print Address as first element - } +std::string ElfReader::getDemangledNameByAddress(guest_address_t address) { + return getName(m_bimap_demangled, address); +} - void ElfReader::printMangled(){ - print_map(m_bimap_mangled.right); // print Address as first element - } +void ElfReader::printDemangled(){ + print_map(m_bimap_demangled.right); // print Address as first element +} + +void ElfReader::printMangled(){ + print_map(m_bimap_mangled.right); // print Address as first element +} #endif diff --git a/src/core/util/ElfReader.hpp b/src/core/util/ElfReader.hpp index 7846be0d..640407bc 100644 --- a/src/core/util/ElfReader.hpp +++ b/src/core/util/ElfReader.hpp @@ -22,13 +22,19 @@ namespace fail { public: - /** + /** * Constructor. * @param path Path to the ELF file. */ ElfReader(const char* path); /** + * Constructor. + * @note The path is guessed from a FAIL_ELF_PATH environment variable + */ + ElfReader(); + + /** * Get guest address by symbol name. * Both mangled an demangled symbols are searched. * @param name The symbol name as string @@ -79,11 +85,12 @@ namespace fail { Logger m_log; + void setup(const char*); int process_symboltable(int sect_num, FILE* fp); #ifndef __puma typedef boost::bimap< std::string, guest_address_t > bimap_t; typedef bimap_t::value_type entry; - + bimap_t m_bimap_mangled; bimap_t m_bimap_demangled; diff --git a/src/experiments/vezs-example/experiment.cc b/src/experiments/vezs-example/experiment.cc index 39329272..a6164baf 100644 --- a/src/experiments/vezs-example/experiment.cc +++ b/src/experiments/vezs-example/experiment.cc @@ -5,9 +5,7 @@ #include #include -#include "util/Logger.hpp" -#include "util/ElfReader.hpp" #include #include "experiment.hpp" #include "experimentInfo.hpp" @@ -28,61 +26,58 @@ using namespace fail; #error This experiment needs: breakpoints, traps, save, and restore. Enable these in the configuration. #endif +#define SAVESTATE (1) + +void VEZSExperiment::printEIP() { + m_log << "EIP = 0x" << hex << simulator.getCPU(0).getInstructionPointer() <<" "<< m_elf.getNameByAddress(simulator.getCPU(0).getInstructionPointer()) << endl; +} + bool VEZSExperiment::run() { - Logger log("VEZS-Example", false); - // Elf image path must be set in a environment variable. - char * elfpath = getenv("CIAO_ELF_PATH"); - if(elfpath == NULL){ - log << " CIAO_ELF_PATH not set :(" << std::endl; - simulator.terminate(); - } - - ElfReader elf(elfpath); - log << "STARTING EXPERIMENT" << endl; - log << "main() address: " << elf.getAddressByName("main") << endl; - //elf.printMangled(); - //elf.printDemangled(); + m_log << "STARTING EXPERIMENT" << endl; + printEIP(); +#if(SAVESTATE) + m_log << "Booting, and saving state at "; BPSingleListener bp; -#if 0 // STEP 1: run until interesting function starts, and save state - bp.setWatchInstructionPointer(elf.getAddressByName("main")); + bp.setWatchInstructionPointer(m_elf.getAddressByName("main")); if(simulator.addListenerAndResume(&bp) == &bp){ - log << "test function entry reached, saving state" << endl; + m_log << "test function entry reached, saving state" << endl; } - log << "EIP = " << hex << bp.getTriggerInstructionPointer() << endl; + printEIP(); //simulator.terminate(); simulator.save("vezs.state"); simulator.terminate(); -#endif -#if 1 +#else //int bit_offset = 2; //for (int instr_offset = 0; instr_offset < OOSTUBS_NUMINSTR; ++instr_offset) { // STEP 3: The actual experiment. - log << "restoring state" << endl; + m_log << "restoring state" << endl; simulator.restore("vezs.state"); - log << " current EIP = " << simulator.getCPU(0).getInstructionPointer() << endl; - BPSingleListener bpt0; - BPSingleListener bpt1; - bpt0.setWatchInstructionPointer(elf.getAddressByName("Alpha::functionTaskTask0")); - bpt1.setWatchInstructionPointer(elf.getAddressByName("_ZN4Beta17functionTaskTask1Ev")); // both mangled and demangled name a working. + printEIP(); - simulator.addListener(&bpt1); - simulator.addListenerAndResume(&bpt0); - log << "EIP = " << simulator.getCPU(0).getInstructionPointer() <<" "<getData(); diff --git a/src/experiments/vezs-example/experiment.hpp b/src/experiments/vezs-example/experiment.hpp index 09404a29..f32d7733 100644 --- a/src/experiments/vezs-example/experiment.hpp +++ b/src/experiments/vezs-example/experiment.hpp @@ -3,10 +3,19 @@ #include "efw/ExperimentFlow.hpp" #include "efw/JobClient.hpp" +#include "util/Logger.hpp" +#include "util/ElfReader.hpp" class VEZSExperiment : public fail::ExperimentFlow { - fail::JobClient m_jc; + + fail::JobClient m_jc; + fail::ElfReader m_elf; + fail::Logger m_log; + + void printEIP(); + public: + VEZSExperiment() : m_log("VEZS-example", false) {}; bool run(); };