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/Support/Path.h" 17#include <llvm/ADT/OwningPtr.h> 18 19#include <vector> 20#include <string> 21 22namespace llvm 23{ 24class MemoryBuffer; 25 26} 27 28namespace mcld 29{ 30class MCLDInfo; 31class Input; 32class InputTree; 33 34/** \class GNUArchiveReader 35 * \brief GNUArchiveReader reads GNU archive files. 36 */ 37class GNUArchiveReader : public ArchiveReader 38{ 39private: 40 struct ArchiveMemberHeader; 41 struct SymbolTableEntry; 42 43public: 44 explicit GNUArchiveReader(MCLDInfo &pLDInfo, LDReader::Endian endian) 45 : m_pLDInfo(pLDInfo), 46 m_endian(endian) 47 { } 48 49 ~GNUArchiveReader() 50 { } 51 52 /// Read an archive and extract each member in. 53 /// Construct the coresponding Input for each member. 54 InputTree *readArchive(Input &input); 55 56 bool isMyFormat(Input &input) const; 57 58 LDReader::Endian endian(Input& pFile) const; 59 60private: 61 /// set up the archive, including 62 /// first, read symbol table 63 /// second, read extended file name which is used in thin archive 64 InputTree *setupNewArchive(Input &pInput, size_t off); 65 66 /// parse the archive header, and return the member size 67 size_t parseMemberHeader(llvm::OwningPtr<llvm::MemoryBuffer> &mapFile, 68 off_t off, 69 std::string *p_Name, 70 off_t *nestedOff, 71 std::string &p_ExtendedName); 72 73 void readSymbolTable(llvm::OwningPtr<llvm::MemoryBuffer> &mapFile, 74 std::vector<SymbolTableEntry> &pSymbolTable, 75 off_t start, 76 size_t size); 77 78private: 79 MCLDInfo &m_pLDInfo; 80 LDReader::Endian m_endian; 81}; 82 83} // namespace of mcld 84 85#endif 86