| /*============================================================================ |
| 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 |