ELFSourceFile.h revision 1.1
1/* 2 * File: ELFSourceFile.h 3 * 4 * Copyright (c) Freescale Semiconductor, Inc. All rights reserved. 5 * See included license file for license details. 6 */ 7#if !defined(_ELFSourceFile_h_) 8#define _ELFSourceFile_h_ 9 10#include "SourceFile.h" 11#include "StELFFile.h" 12#include "smart_ptr.h" 13#include "DataSource.h" 14#include "DataTarget.h" 15#include "ELF.h" 16 17namespace elftosb 18{ 19 20//! Set of supported compiler toolsets. 21enum elf_toolset_t 22{ 23 kUnknownToolset, //!< Unknown. 24 kGHSToolset, //!< Green Hills Software MULTI 25 kGCCToolset, //!< GNU GCC 26 kADSToolset //!< ARM UK RealView 27}; 28 29//! Options for handling the .secinfo section in GHS-produced ELF files. 30enum secinfo_clear_t 31{ 32 // Default value for the .secinfo action. 33 kSecinfoDefault, 34 35 //! Ignore the .secinfo section if present. The standard ELF loading 36 //! rules are followed. 37 kSecinfoIgnore, 38 39 //! The boot ROM clears only those SHT_NOBITS sections present in .secinfo. 40 kSecinfoROMClear, 41 42 //! The C startup is responsible for clearing sections. No fill commands 43 //! are generated for any SHT_NOBITS sections. 44 kSecinfoCStartupClear 45}; 46 47/*! 48 * \brief Executable and Loading Format (ELF) source file. 49 */ 50class ELFSourceFile : public SourceFile 51{ 52public: 53 //! \brief Default constructor. 54 ELFSourceFile(const std::string & path); 55 56 //! \brief Destructor. 57 virtual ~ELFSourceFile(); 58 59 //! \brief Identifies whether the stream contains an ELF file. 60 static bool isELFFile(std::istream & stream); 61 62 //! \name Opening and closing 63 //@{ 64 //! \brief Opens the file. 65 virtual void open(); 66 67 //! \brief Closes the file. 68 virtual void close(); 69 //@} 70 71 //! \name Format capabilities 72 //@{ 73 virtual bool supportsNamedSections() const { return true; } 74 virtual bool supportsNamedSymbols() const { return true; } 75 //@} 76 77 //! \name Data source 78 //@{ 79 //! \brief Creates a data source from the entire file. 80 virtual DataSource * createDataSource(); 81 82 //! \brief Creates a data source from one or more sections of the file. 83 virtual DataSource * createDataSource(StringMatcher & matcher); 84 //@} 85 86 //! \name Entry point 87 //@{ 88 //! \brief Returns true if an entry point was set in the file. 89 virtual bool hasEntryPoint(); 90 91 //! \brief Returns the entry point address. 92 virtual uint32_t getEntryPointAddress(); 93 //@} 94 95 //! \name Data target 96 //@{ 97 virtual DataTarget * createDataTargetForSection(const std::string & section); 98 virtual DataTarget * createDataTargetForSymbol(const std::string & symbol); 99 //@} 100 101 //! \name Symbols 102 //@{ 103 //! \brief Returns whether a symbol exists in the source file. 104 virtual bool hasSymbol(const std::string & name); 105 106 //! \brief Returns the value of a symbol. 107 virtual uint32_t getSymbolValue(const std::string & name); 108 109 //! \brief Returns the size of a symbol. 110 virtual unsigned getSymbolSize(const std::string & name); 111 //@} 112 113 //! \name Direct ELF format access 114 //@{ 115 //! \brief Returns the underlying StELFFile object. 116 StELFFile * getELFFile() { return m_file; } 117 118 //! \brief Gets information about a symbol in the ELF file. 119 bool lookupSymbol(const std::string & name, Elf32_Sym & info); 120 //@} 121 122protected: 123 smart_ptr<StELFFile> m_file; //!< Parser for the ELF file. 124 elf_toolset_t m_toolset; //!< Toolset that produced the ELF file. 125 secinfo_clear_t m_secinfoOption; //!< How to deal with the .secinfo section. Ignored if the toolset is not GHS. 126 127protected: 128 //! \brief Parses the toolset option value. 129 elf_toolset_t readToolsetOption(); 130 131 //! \brief Reads the secinfoClear option. 132 secinfo_clear_t readSecinfoClearOption(); 133 134protected: 135 /*! 136 * \brief A data source with ELF file sections as the contents. 137 * 138 * Each segment of this data source corresponds directly with a named section 139 * of the ELF file it represents. When the data source is created, it contains 140 * no segments. Segments are created with the addSection() method, which takes 141 * the index of an ELF section and creates a corresponding segment. 142 * 143 * Two segment subclasses are used with this data source. The first, ProgBitsSegment, 144 * is used to represent sections whose type is #SHT_PROGBITS. These sections have 145 * binary data stored in the ELF file. The second segment type is NoBitsSegment. 146 * It is used to represent sections whose type is #SHT_NOBITS. These sections have 147 * no data, but simply allocate a region of memory to be filled with zeroes. 148 * As such, the NoBitsSegment class is a subclass of DataSource::PatternSegment. 149 */ 150 class ELFDataSource : public DataSource 151 { 152 public: 153 /*! 154 * \brief Represents one named #SHT_PROGBITS section within the ELF file. 155 */ 156 class ProgBitsSegment : public DataSource::Segment 157 { 158 public: 159 ProgBitsSegment(ELFDataSource & source, StELFFile * elf, unsigned index); 160 161 virtual unsigned getData(unsigned offset, unsigned maxBytes, uint8_t * buffer); 162 virtual unsigned getLength(); 163 164 virtual bool hasNaturalLocation() { return true; } 165 virtual uint32_t getBaseAddress(); 166 167 protected: 168 StELFFile * m_elf; //!< The format parser instance for this ELF file. 169 unsigned m_sectionIndex; //!< The index of the section this segment represents. 170 }; 171 172 /*! 173 * \brief Represents one named #SHT_NOBITS section within the ELF file. 174 * 175 * This segment class is a subclass of DataSource::PatternSegment since it 176 * represents a region of memory to be filled with zeroes. 177 */ 178 class NoBitsSegment : public DataSource::PatternSegment 179 { 180 public: 181 NoBitsSegment(ELFDataSource & source, StELFFile * elf, unsigned index); 182 183 virtual unsigned getLength(); 184 185 virtual bool hasNaturalLocation() { return true; } 186 virtual uint32_t getBaseAddress(); 187 188 protected: 189 StELFFile * m_elf; //!< The format parser instance for this ELF file. 190 unsigned m_sectionIndex; //!< The index of the section this segment represents. 191 }; 192 193 public: 194 //! \brief Default constructor. 195 ELFDataSource(StELFFile * elf) : DataSource(), m_elf(elf) {} 196 197 //! \brief Destructor. 198 virtual ~ELFDataSource(); 199 200 //! Set the option to control .secinfo usage. 201 inline void setSecinfoOption(secinfo_clear_t option) { m_secinfoOption = option; } 202 203 //! \brief Adds the ELF section at position \a sectionIndex to the data source. 204 void addSection(unsigned sectionIndex); 205 206 //! \brief Returns the number of segments in the source. 207 virtual unsigned getSegmentCount() { return (unsigned)m_segments.size(); } 208 209 //! \brief Returns the segment at position \a index. 210 virtual DataSource::Segment * getSegmentAt(unsigned index) { return m_segments[index]; } 211 212 protected: 213 StELFFile * m_elf; //!< The ELF file parser. 214 secinfo_clear_t m_secinfoOption; //!< How to deal with the .secinfo section. Ignored if the toolset is not GHS. 215 216 typedef std::vector<DataSource::Segment*> segment_vector_t; //!< A list of segment instances. 217 segment_vector_t m_segments; //!< The segments of this data source. 218 }; 219 220}; 221 222}; // namespace elftosb 223 224#endif // _ELFSourceFile_h_ 225