Home | History | Annotate | Download | only in LD
      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