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