//===- GNUArchiveReader.h -------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_LD_GNUARCHIVEREADER_H_ #define MCLD_LD_GNUARCHIVEREADER_H_ #include "mcld/LD/Archive.h" #include "mcld/LD/ArchiveReader.h" namespace mcld { class Archive; class ELFObjectReader; class Input; class LinkerConfig; class Module; /** \class GNUArchiveReader * \brief GNUArchiveReader reads GNU archive files. */ class GNUArchiveReader : public ArchiveReader { public: GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader); ~GNUArchiveReader(); /// readArchive - read an archive, include the needed members, and build up /// the subtree bool readArchive(const LinkerConfig& pConfig, Archive& pArchive); /// isMyFormat bool isMyFormat(Input& input, bool& pContinue) const; private: /// isArchive bool isArchive(const char* pStr) const; /// isThinArchive bool isThinArchive(const char* pStr) const; /// isThinArchive bool isThinArchive(Input& input) const; /// readMemberHeader - read the header of a member in a archive file and then /// return the corresponding archive member (it may be an input object or /// another archive) /// @param pArchiveRoot - the archive root that holds the strtab (extended /// name table) /// @param pArchiveFile - the archive that contains the needed object /// @param pFileOffset - file offset of the member header in the archive /// @param pNestedOffset - used when we find a nested archive /// @param pMemberSize - the file size of this member Input* readMemberHeader(Archive& pArchiveRoot, Input& pArchiveFile, uint32_t pFileOffset, uint32_t& pNestedOffset, size_t& pMemberSize); /// readSymbolTable - read the archive symbol map (armap) bool readSymbolTable(Archive& pArchive); /// readStringTable - read the strtab for long file name of the archive bool readStringTable(Archive& pArchive); /// shouldIncludeSymbol - given a sym name from armap and check if we should /// include the corresponding archive member, and then return the decision enum Archive::Symbol::Status shouldIncludeSymbol( const llvm::StringRef& pSymName) const; /// includeMember - include the object member in the given file offset, and /// return the size of the object /// @param pConfig - LinkerConfig /// @param pArchiveRoot - the archive root /// @param pFileOffset - file offset of the member header in the archive size_t includeMember(const LinkerConfig& pConfig, Archive& pArchiveRoot, uint32_t pFileOffset); /// includeAllMembers - include all object members. This is called if /// --whole-archive is the attribute for this archive file. bool includeAllMembers(const LinkerConfig& pConfig, Archive& pArchive); private: Module& m_Module; ELFObjectReader& m_ELFObjectReader; }; } // namespace mcld #endif // MCLD_LD_GNUARCHIVEREADER_H_