Linker.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
1//===- Linker.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 10#ifndef ALONE_LINKER_H 11#define ALONE_LINKER_H 12 13#include <string> 14 15namespace mcld { 16 17class Module; 18class TargetLDBackend; 19class ObjectLinker; 20class ContextFactory; 21class LinkerConfig; 22class TreeIteratorBase; 23class Input; 24class InputFactory; 25class InputBuilder; 26class MemoryArea; 27class MemoryAreaFactory; 28 29namespace sys { namespace fs { 30 31class Path; 32 33} } // end namespace sys::fs 34 35} // end namespace mcld 36 37namespace alone { 38 39class LinkerConfig; 40 41class Linker { 42public: 43 enum ErrorCode { 44 kSuccess, 45 kDoubleConfig, 46 kCreateBackend, 47 kDelegateLDInfo, 48 kFindNameSpec, 49 kOpenNameSpec, 50 kOpenObjectFile, 51 kNotConfig, 52 kNotSetUpOutput, 53 kOpenOutput, 54 kReadSections, 55 kReadSymbols, 56 kAddAdditionalSymbols, 57 kMaxErrorCode 58 }; 59 60 static const char *GetErrorString(enum ErrorCode pErrCode); 61 62private: 63 const mcld::LinkerConfig *mLDConfig; 64 mcld::Module *mModule; 65 mcld::TargetLDBackend *mBackend; 66 mcld::ObjectLinker *mObjLinker; 67 mcld::InputFactory *mInputFactory; 68 mcld::MemoryAreaFactory *mMemAreaFactory; 69 mcld::ContextFactory *mContextFactory; 70 mcld::InputBuilder *mBuilder; 71 mcld::TreeIteratorBase *mRoot; 72 std::string mSOName; 73 mcld::MemoryArea* mOutput; 74 75public: 76 Linker(); 77 78 Linker(const LinkerConfig& pConfig); 79 80 ~Linker(); 81 82 enum ErrorCode config(const LinkerConfig& pConfig); 83 84 enum ErrorCode addNameSpec(const std::string &pNameSpec); 85 86 enum ErrorCode addObject(const std::string &pObjectPath); 87 88 enum ErrorCode addObject(void* pMemory, size_t pSize); 89 90 enum ErrorCode addCode(void* pMemory, size_t pSize); 91 92 enum ErrorCode setOutput(const std::string &pPath); 93 94 enum ErrorCode setOutput(int pFileHandler); 95 96 enum ErrorCode link(); 97 98private: 99 enum ErrorCode extractFiles(const LinkerConfig& pConfig); 100 101 enum ErrorCode openFile(const mcld::sys::fs::Path& pPath, 102 enum ErrorCode pCode, 103 mcld::Input& pInput); 104 105 void advanceRoot(); 106}; 107 108} // end namespace alone 109 110#endif // ALONE_LINKER_H 111