GNUArchiveReader.h revision 533eae20118036f425f27bf0536ef0ccbb090b65
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
15namespace mcld {
16
17class Module;
18class Input;
19class ELFObjectReader;
20class Archive;
21class LinkerConfig;
22
23/** \class GNUArchiveReader
24 *  \brief GNUArchiveReader reads GNU archive files.
25 */
26class GNUArchiveReader : public ArchiveReader
27{
28public:
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
40private:
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
89private:
90  Module& m_Module;
91  ELFObjectReader& m_ELFObjectReader;
92};
93
94} // namespace of mcld
95
96#endif
97
98