1cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===- Archive.cpp --------------------------------------------------------===//
2cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
3cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//                     The MCLinker Project
4cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
5cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// This file is distributed under the University of Illinois Open Source
6cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// License. See LICENSE.TXT for details.
7cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
8cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/Archive.h>
10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/MC/InputFactory.h>
11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/ADT/StringRef.h>
12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaousing namespace mcld;
14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// Archive
17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::MAGIC[]            = "!<arch>\n";
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::THIN_MAGIC[]       = "!<thin>\n";
19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst size_t Archive::MAGIC_LEN          = sizeof(Archive::MAGIC) - 1;
20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::SVR4_SYMTAB_NAME[] = "/               ";
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::STRTAB_NAME[]      = "//              ";
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::PAD[]              = "\n";
23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::MEMBER_MAGIC[]     = "`\n";
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::Archive(Input& pInputFile, InputFactory& pInputFactory)
26cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao : m_ArchiveFile(pInputFile),
27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao   m_pInputTree(NULL),
28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao   m_SymbolFactory(32)
29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  m_pInputTree = new InputTree(pInputFactory);
31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::~Archive()
34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
35cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  delete m_pInputTree;
36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
37cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
38cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getARFile - get the Input& of the archive file
39cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoInput& Archive::getARFile()
40cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ArchiveFile;
42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getARFile - get the Input& of the archive file
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst Input& Archive::getARFile() const
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ArchiveFile;
48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// inputs - get the input tree built from this archive
51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoInputTree& Archive::inputs()
52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return *m_pInputTree;
54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// inputs - get the input tree built from this archive
57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst InputTree& Archive::inputs() const
58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return *m_pInputTree;
60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getObjectMemberMap - get the map that contains the included object files
63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::ObjectMemberMapType& Archive::getObjectMemberMap()
64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ObjectMemberMap;
66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getObjectMemberMap - get the map that contains the included object files
69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst Archive::ObjectMemberMapType& Archive::getObjectMemberMap() const
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ObjectMemberMap;
72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// numOfObjectMember - return the number of included object files
75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaosize_t Archive::numOfObjectMember() const
76cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
77cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ObjectMemberMap.numOfEntries();
78cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
79cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
80cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// addObjectMember - add a object in the object member map
81cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pFileOffset - file offset in symtab represents a object file
82cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pIter - the iterator in the input tree built from this archive
83cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaobool Archive::addObjectMember(uint32_t pFileOffset, InputTree::iterator pIter)
84cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
85cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool exist;
86cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ObjectMemberEntryType* entry = m_ObjectMemberMap.insert(pFileOffset, exist);
87cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  if (!exist)
88cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    entry->setValue(pIter);
89cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return !exist;
90cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
92cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// hasObjectMember - check if a object file is included or not
93cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pFileOffset - file offset in symtab represents a object file
94cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaobool Archive::hasObjectMember(uint32_t pFileOffset) const
95cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
96cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return (m_ObjectMemberMap.find(pFileOffset) != m_ObjectMemberMap.end());
97cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
98cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
99cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getArchiveMemberMap - get the map that contains the included archive files
100cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::ArchiveMemberMapType& Archive::getArchiveMemberMap()
101cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
102cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ArchiveMemberMap;
103cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
104cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
105cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getArchiveMemberMap - get the map that contains the included archive files
106cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst Archive::ArchiveMemberMapType& Archive::getArchiveMemberMap() const
107cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
108cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ArchiveMemberMap;
109cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
110cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
111cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// addArchiveMember - add an archive in the archive member map
112cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pName    - the name of the new archive member
113cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pLastPos - this records the point to insert the next node in the
114cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao///                   subtree of this archive member
115cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pMove    - this records the direction to insert the next node in the
116cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao///                   subtree of this archive member
117cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaobool Archive::addArchiveMember(const llvm::StringRef& pName,
118cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                               InputTree::iterator pLastPos,
119cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                               InputTree::Mover* pMove)
120cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
121cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool exist;
122cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMemberEntryType* entry = m_ArchiveMemberMap.insert(pName, exist);
123cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  if (!exist) {
124cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    ArchiveMember& ar = entry->value();
125cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    ar.file = *pLastPos;
126cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    ar.lastPos = pLastPos;
127cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    ar.move = pMove;
128cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  }
129cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return !exist;
130cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
131cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
132cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// hasArchiveMember - check if an archive file is included or not
133cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaobool Archive::hasArchiveMember(const llvm::StringRef& pName) const
134cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
135cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return (m_ArchiveMemberMap.find(pName) != m_ArchiveMemberMap.end());
136cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
137cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
138cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getArchiveMember - get a archive member
139cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::ArchiveMember* Archive::getArchiveMember(const llvm::StringRef& pName)
140cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
141cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMemberMapType::iterator it = m_ArchiveMemberMap.find(pName);
142cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  if (it != m_ArchiveMemberMap.end())
143cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    return &(it.getEntry()->value());
144cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return NULL;
145cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
146cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
147cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymbolTable - get the symtab
148cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::SymTabType& Archive::getSymbolTable()
149cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
150cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab;
151cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
152cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
153cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymbolTable - get the symtab
154cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst Archive::SymTabType& Archive::getSymbolTable() const
155cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
156cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab;
157cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
158cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
159cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// setSymTabSize - set the memory size of symtab
160cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaovoid Archive::setSymTabSize(size_t pSize)
161cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
162cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  m_SymTabSize = pSize;
163cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
164cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
165cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymTabSize - get the memory size of symtab
166cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaosize_t Archive::getSymTabSize() const
167cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
168cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTabSize;
169cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
170cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
171cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// numOfSymbols - return the number of symbols in symtab
172cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaosize_t Archive::numOfSymbols() const
173cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
174cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab.size();
175cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
176cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
177cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// addSymbol - add a symtab entry to symtab
178cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pName - symbol name
179cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pFileOffset - file offset in symtab represents a object file
180cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaovoid Archive::addSymbol(const char* pName,
181cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                        uint32_t pFileOffset,
182cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                        enum Archive::Symbol::Status pStatus)
183cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
184cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Symbol* entry = m_SymbolFactory.allocate();
185cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  new (entry) Symbol(pName, pFileOffset, pStatus);
186cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  m_SymTab.push_back(entry);
187cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
188cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
189cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymbolName - get the symbol name with the given index
190cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst std::string& Archive::getSymbolName(size_t pSymIdx) const
191cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
192cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  assert(pSymIdx < numOfSymbols());
193cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab[pSymIdx]->name;
194cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
195cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
196cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getObjFileOffset - get the file offset that represent a object file
197cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaouint32_t Archive::getObjFileOffset(size_t pSymIdx) const
198cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
199cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  assert(pSymIdx < numOfSymbols());
200cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab[pSymIdx]->fileOffset;
201cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
202cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
203cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymbolStatus - get the status of a symbol
204cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoenum Archive::Symbol::Status Archive::getSymbolStatus(size_t pSymIdx) const
205cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
206cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  assert(pSymIdx < numOfSymbols());
207cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab[pSymIdx]->status;
208cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
209cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
210cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// setSymbolStatus - set the status of a symbol
211cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaovoid Archive::setSymbolStatus(size_t pSymIdx,
212cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                              enum Archive::Symbol::Status pStatus)
213cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
214cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  assert(pSymIdx < numOfSymbols());
215cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  m_SymTab[pSymIdx]->status = pStatus;
216cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
217cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
218cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getStrTable - get the extended name table
219cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaostd::string& Archive::getStrTable()
220cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
221cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_StrTab;
222cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
223cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
224cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getStrTable - get the extended name table
225cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst std::string& Archive::getStrTable() const
226cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
227cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_StrTab;
228cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
229cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
230