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