• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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