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