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//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_LD_GNUARCHIVEREADER_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LD_GNUARCHIVEREADER_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/ArchiveReader.h> 13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/Archive.h> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module; 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Input; 19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass ELFObjectReader; 20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Archive; 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GNUArchiveReader 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief GNUArchiveReader reads GNU archive files. 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GNUArchiveReader : public ArchiveReader 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader); 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao ~GNUArchiveReader(); 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readArchive - read an archive, include the needed members, and build up 34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// the subtree 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool readArchive(const LinkerConfig& pConfig, Archive& pArchive); 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 37cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isMyFormat 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool isMyFormat(Input& input, bool &pContinue) const; 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isArchive 42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isArchive(const char* pStr) const; 43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isThinArchive 45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isThinArchive(const char* pStr) const; 46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isThinArchive 48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isThinArchive(Input& input) const; 49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readMemberHeader - read the header of a member in a archive file and then 51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// return the corresponding archive member (it may be an input object or 52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// another archive) 53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pArchiveRoot - the archive root that holds the strtab (extended 54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// name table) 55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pArchiveFile - the archive that contains the needed object 56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pFileOffset - file offset of the member header in the archive 57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pNestedOffset - used when we find a nested archive 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pMemberSize - the file size of this member 59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Input* readMemberHeader(Archive& pArchiveRoot, 60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Input& pArchiveFile, 61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao uint32_t pFileOffset, 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint32_t& pNestedOffset, 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t& pMemberSize); 64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readSymbolTable - read the archive symbol map (armap) 66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool readSymbolTable(Archive& pArchive); 67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readStringTable - read the strtab for long file name of the archive 69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool readStringTable(Archive& pArchive); 70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// shouldIncludeSymbol - given a sym name from armap and check if we should 72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// include the corresponding archive member, and then return the decision 73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao enum Archive::Symbol::Status 74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao shouldIncludeSymbol(const llvm::StringRef& pSymName) const; 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// includeMember - include the object member in the given file offset, and 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// return the size of the object 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @param pConfig - LinkerConfig 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pArchiveRoot - the archive root 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pFileOffset - file offset of the member header in the archive 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t includeMember(const LinkerConfig& pConfig, 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Archive& pArchiveRoot, 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 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. 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool includeAllMembers(const LinkerConfig& pConfig, 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