From 5460a1f25d9ddecb5c70667267d66d51af177a99 Mon Sep 17 00:00:00 2001 From: Shih-wei Liao Date: Fri, 16 Mar 2012 22:41:16 -0700 Subject: Linkloader improvement: mclinker. Change-Id: I8805e39ccbc2ee204234fb3e71c70c906f3990bb --- include/mcld/LD/GNUArchiveReader.h | 86 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 include/mcld/LD/GNUArchiveReader.h (limited to 'include/mcld/LD/GNUArchiveReader.h') diff --git a/include/mcld/LD/GNUArchiveReader.h b/include/mcld/LD/GNUArchiveReader.h new file mode 100644 index 0000000..57aee10 --- /dev/null +++ b/include/mcld/LD/GNUArchiveReader.h @@ -0,0 +1,86 @@ +//===- GNUArchiveReader.h -------------------------------------------------===// +// +// The MCLinker Project +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#ifndef MCLD_GNU_ARCHIVE_READER_H +#define MCLD_GNU_ARCHIVE_READER_H +#ifdef ENABLE_UNITTEST +#include +#endif + +#include "mcld/LD/ArchiveReader.h" +#include "mcld/Support/Path.h" +#include + +#include +#include + +namespace llvm +{ +class MemoryBuffer; + +} + +namespace mcld +{ +class MCLDInfo; +class Input; +class InputTree; + +/** \class GNUArchiveReader + * \brief GNUArchiveReader reads GNU archive files. + */ +class GNUArchiveReader : public ArchiveReader +{ +private: + struct ArchiveMemberHeader; + struct SymbolTableEntry; + +public: + explicit GNUArchiveReader(MCLDInfo &pLDInfo, LDReader::Endian endian) + : m_pLDInfo(pLDInfo), + m_endian(endian) + { } + + ~GNUArchiveReader() + { } + + /// Read an archive and extract each member in. + /// Construct the coresponding Input for each member. + InputTree *readArchive(Input &input); + + bool isMyFormat(Input &input) const; + + LDReader::Endian endian(Input& pFile) const; + +private: + /// set up the archive, including + /// first, read symbol table + /// second, read extended file name which is used in thin archive + InputTree *setupNewArchive(Input &pInput, size_t off); + + /// parse the archive header, and return the member size + size_t parseMemberHeader(llvm::OwningPtr &mapFile, + off_t off, + std::string *p_Name, + off_t *nestedOff, + std::string &p_ExtendedName); + + void readSymbolTable(llvm::OwningPtr &mapFile, + std::vector &pSymbolTable, + off_t start, + size_t size); + +private: + MCLDInfo &m_pLDInfo; + LDReader::Endian m_endian; +}; + +} // namespace of mcld + +#endif + -- cgit v1.2.3