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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_GNUARCHIVEREADER_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_GNUARCHIVEREADER_H_ 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/Archive.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ArchiveReader.h" 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Archive; 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ELFObjectReader; 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Input; 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig; 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Module; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GNUArchiveReader 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief GNUArchiveReader reads GNU archive files. 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass GNUArchiveReader : public ArchiveReader { 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader); 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao ~GNUArchiveReader(); 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readArchive - read an archive, include the needed members, and build up 33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// the subtree 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool readArchive(const LinkerConfig& pConfig, Archive& pArchive); 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isMyFormat 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool isMyFormat(Input& input, bool& pContinue) const; 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 40cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isArchive 41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isArchive(const char* pStr) const; 42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isThinArchive 44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isThinArchive(const char* pStr) const; 45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// isThinArchive 47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool isThinArchive(Input& input) const; 48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readMemberHeader - read the header of a member in a archive file and then 50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// return the corresponding archive member (it may be an input object or 51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// another archive) 52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pArchiveRoot - the archive root that holds the strtab (extended 53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// name table) 54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pArchiveFile - the archive that contains the needed object 55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pFileOffset - file offset of the member header in the archive 56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pNestedOffset - used when we find a nested archive 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pMemberSize - the file size of this member 58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Input* readMemberHeader(Archive& pArchiveRoot, 59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Input& pArchiveFile, 60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao uint32_t pFileOffset, 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint32_t& pNestedOffset, 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t& pMemberSize); 63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readSymbolTable - read the archive symbol map (armap) 65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool readSymbolTable(Archive& pArchive); 66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// readStringTable - read the strtab for long file name of the archive 68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao bool readStringTable(Archive& pArchive); 69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// shouldIncludeSymbol - given a sym name from armap and check if we should 71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// include the corresponding archive member, and then return the decision 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum Archive::Symbol::Status shouldIncludeSymbol( 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const llvm::StringRef& pSymName) const; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// includeMember - include the object member in the given file offset, and 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// return the size of the object 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @param pConfig - LinkerConfig 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pArchiveRoot - the archive root 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pFileOffset - file offset of the member header in the archive 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t includeMember(const LinkerConfig& pConfig, 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Archive& pArchiveRoot, 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint32_t pFileOffset); 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// includeAllMembers - include all object members. This is called if 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// --whole-archive is the attribute for this archive file. 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool includeAllMembers(const LinkerConfig& pConfig, Archive& pArchive); 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module& m_Module; 90cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao ELFObjectReader& m_ELFObjectReader; 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_GNUARCHIVEREADER_H_ 96