diff options
Diffstat (limited to 'Source/cmELF.h')
-rw-r--r-- | Source/cmELF.h | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/Source/cmELF.h b/Source/cmELF.h new file mode 100644 index 000000000..ab9be4245 --- /dev/null +++ b/Source/cmELF.h @@ -0,0 +1,108 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#ifndef cmELF_h +#define cmELF_h + +#if !defined(CMAKE_USE_ELF_PARSER) +# error "This file may be included only if CMAKE_USE_ELF_PARSER is enabled." +#endif + +class cmELFInternal; + +/** \class cmELF + * \brief Executable and Link Format (ELF) parser. + */ +class cmELF +{ +public: + /** Construct with the name of the ELF input file to parse. */ + cmELF(const char* fname); + + /** Destruct. */ + ~cmELF(); + + /** Get the error message if any. */ + std::string const& GetErrorMessage() const + { + return this->ErrorMessage; + } + + /** Boolean conversion. True if the ELF file is valid. */ + operator bool() const { return this->Valid(); } + + /** Enumeration of ELF file types. */ + enum FileType + { + FileTypeInvalid, + FileTypeRelocatableObject, + FileTypeExecutable, + FileTypeSharedLibrary, + FileTypeCore, + FileTypeSpecificOS, + FileTypeSpecificProc + }; + + /** Represent string table entries. */ + struct StringEntry + { + // The string value itself. + std::string Value; + + // The position in the file at which the string appears. + unsigned long Position; + + // The size of the string table entry. This includes the space + // allocated for one or more null terminators. + unsigned long Size; + + // The index of the section entry referencing the string. + int IndexInSection; + }; + + /** Get the type of the file opened. */ + FileType GetFileType() const; + + /** Get the number of ELF sections present. */ + unsigned int GetNumberOfSections() const; + + /** Get the number of DYNAMIC section entries before the first + DT_NULL. Returns zero on error. */ + unsigned int GetDynamicEntryCount() const; + + /** Get the position of a DYNAMIC section header entry. Returns + zero on error. */ + unsigned long GetDynamicEntryPosition(int index) const; + + /** Read bytes from the file. */ + bool ReadBytes(unsigned long pos, unsigned long size, char* buf) const; + + /** Get the SONAME field if any. */ + bool GetSOName(std::string& soname); + StringEntry const* GetSOName(); + + /** Get the RPATH field if any. */ + StringEntry const* GetRPath(); + + /** Get the RUNPATH field if any. */ + StringEntry const* GetRunPath(); + + /** Print human-readable information about the ELF file. */ + void PrintInfo(std::ostream& os) const; + +private: + friend class cmELFInternal; + bool Valid() const; + cmELFInternal* Internal; + std::string ErrorMessage; +}; + +#endif |