15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- GNUArchiveReader.h -------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_GNU_ARCHIVE_READER_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_GNU_ARCHIVE_READER_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/ArchiveReader.h> 16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/Archive.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module; 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Input; 22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass ELFObjectReader; 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MemoryAreaFactory; 24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Archive; 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GNUArchiveReader 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief GNUArchiveReader reads GNU archive files. 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GNUArchiveReader : public ArchiveReader 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader); 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao ~GNUArchiveReader(); 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readArchive - read an archive, include the needed members, and build up 37cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// the subtree 38cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool readArchive(Archive& pArchive); 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 40cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isMyFormat 41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isMyFormat(Input& input) const; 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isArchive 45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isArchive(const char* pStr) const; 46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isThinArchive 48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isThinArchive(const char* pStr) const; 49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isThinArchive 51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isThinArchive(Input& input) const; 52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readMemberHeader - read the header of a member in a archive file and then 54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// return the corresponding archive member (it may be an input object or 55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// another archive) 56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pArchiveRoot - the archive root that holds the strtab (extended 57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// name table) 58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pArchiveFile - the archive that contains the needed object 59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pFileOffset - file offset of the member header in the archive 60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pNestedOffset - used when we find a nested archive 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pMemberSize - the file size of this member 62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Input* readMemberHeader(Archive& pArchiveRoot, 63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Input& pArchiveFile, 64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao uint32_t pFileOffset, 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint32_t& pNestedOffset, 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t& pMemberSize); 67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readSymbolTable - read the archive symbol map (armap) 69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool readSymbolTable(Archive& pArchive); 70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readStringTable - read the strtab for long file name of the archive 72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool readStringTable(Archive& pArchive); 73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// shouldIncludeSymbol - given a sym name from armap and check if we should 75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// include the corresponding archive member, and then return the decision 76cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao enum Archive::Symbol::Status 77cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao shouldIncludeSymbol(const llvm::StringRef& pSymName) const; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// includeMember - include the object member in the given file offset, and 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// return the size of the object 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pArchiveRoot - the archive root 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pFileOffset - file offset of the member header in the archive 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t includeMember(Archive& pArchiveRoot, uint32_t pFileOffset); 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// includeAllMembers - include all object members. This is called if 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// --whole-archive is the attribute for this archive file. 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool includeAllMembers(Archive& pArchive); 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module& m_Module; 91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao ELFObjectReader& m_ELFObjectReader; 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 98