1 //===- GNUArchiveReader.h -------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef MCLD_GNU_ARCHIVE_READER_H 10 #define MCLD_GNU_ARCHIVE_READER_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 15 #include <mcld/LD/ArchiveReader.h> 16 #include <mcld/LD/Archive.h> 17 18 namespace mcld { 19 20 class Module; 21 class Input; 22 class ELFObjectReader; 23 class MemoryAreaFactory; 24 class Archive; 25 26 /** \class GNUArchiveReader 27 * \brief GNUArchiveReader reads GNU archive files. 28 */ 29 class GNUArchiveReader : public ArchiveReader 30 { 31 public: 32 GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader); 33 34 ~GNUArchiveReader(); 35 36 /// readArchive - read an archive, include the needed members, and build up 37 /// the subtree 38 bool readArchive(Archive& pArchive); 39 40 /// isMyFormat 41 bool isMyFormat(Input& input) const; 42 43 private: 44 /// isArchive 45 bool isArchive(const char* pStr) const; 46 47 /// isThinArchive 48 bool isThinArchive(const char* pStr) const; 49 50 /// isThinArchive 51 bool isThinArchive(Input& input) const; 52 53 /// readMemberHeader - read the header of a member in a archive file and then 54 /// return the corresponding archive member (it may be an input object or 55 /// another archive) 56 /// @param pArchiveRoot - the archive root that holds the strtab (extended 57 /// name table) 58 /// @param pArchiveFile - the archive that contains the needed object 59 /// @param pFileOffset - file offset of the member header in the archive 60 /// @param pNestedOffset - used when we find a nested archive 61 /// @param pMemberSize - the file size of this member 62 Input* readMemberHeader(Archive& pArchiveRoot, 63 Input& pArchiveFile, 64 uint32_t pFileOffset, 65 uint32_t& pNestedOffset, 66 size_t& pMemberSize); 67 68 /// readSymbolTable - read the archive symbol map (armap) 69 bool readSymbolTable(Archive& pArchive); 70 71 /// readStringTable - read the strtab for long file name of the archive 72 bool readStringTable(Archive& pArchive); 73 74 /// shouldIncludeSymbol - given a sym name from armap and check if we should 75 /// include the corresponding archive member, and then return the decision 76 enum Archive::Symbol::Status 77 shouldIncludeSymbol(const llvm::StringRef& pSymName) const; 78 79 /// includeMember - include the object member in the given file offset, and 80 /// return the size of the object 81 /// @param pArchiveRoot - the archive root 82 /// @param pFileOffset - file offset of the member header in the archive 83 size_t includeMember(Archive& pArchiveRoot, uint32_t pFileOffset); 84 85 /// includeAllMembers - include all object members. This is called if 86 /// --whole-archive is the attribute for this archive file. 87 bool includeAllMembers(Archive& pArchive); 88 89 private: 90 Module& m_Module; 91 ELFObjectReader& m_ELFObjectReader; 92 }; 93 94 } // namespace of mcld 95 96 #endif 97 98