1//===- FragmentLinker.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// This file provides a number of APIs used by SectLinker.
11// These APIs do the things which a linker should do.
12//
13//===----------------------------------------------------------------------===//
14#ifndef MCLD_FRAGMENT_FRAGMENT_LINKER_H
15#define MCLD_FRAGMENT_FRAGMENT_LINKER_H
16#ifdef ENABLE_UNITTEST
17#include <gtest.h>
18#endif
19
20#include <string>
21
22#include <mcld/LinkerConfig.h>
23#include <mcld/LD/LDFileFormat.h>
24#include <mcld/LD/LDSymbol.h>
25#include <mcld/Fragment/Relocation.h>
26#include <mcld/MC/MCLDInput.h>
27
28namespace mcld {
29
30class Module;
31class TargetLDBackend;
32class LinkerConfig;
33class MemoryArea;
34
35/** \class FragmentLinker
36 *  \brief FragmentLinker provides a pass to link object files.
37 */
38class FragmentLinker
39{
40public:
41  FragmentLinker(const LinkerConfig& pConfig,
42                 Module& pModule,
43                 TargetLDBackend& pBackend);
44
45  ~FragmentLinker();
46
47  bool finalizeSymbols();
48
49  /// applyRelocations - apply all relocation enties.
50  bool applyRelocations();
51
52  /// syncRelocationResult - After applying relocation, write back relocation target
53  /// data to output file.
54  void syncRelocationResult(MemoryArea& pOutput);
55
56private:
57  /// normalSyncRelocationResult - sync relocation result when producing shared
58  /// objects or executables
59  void normalSyncRelocationResult(MemoryArea& pOutput);
60
61  /// partialSyncRelocationResult - sync relocation result when doing partial
62  /// link
63  void partialSyncRelocationResult(MemoryArea& pOutput);
64
65  /// writeRelocationResult - helper function of syncRelocationResult, write
66  /// relocation target data to output
67  void writeRelocationResult(Relocation& pReloc, uint8_t* pOutput);
68
69private:
70  const LinkerConfig& m_Config;
71  Module& m_Module;
72  TargetLDBackend& m_Backend;
73};
74
75} // namespace of mcld
76
77#endif
78
79