ELFObjectWriter.h revision a790f0a8f3175183bea088389b3e4ae41813e192
1//===- ELFObjectWriter.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#ifndef MCLD_LD_ELFOBJWRITER_H
10#define MCLD_LD_ELFOBJWRITER_H
11#include <mcld/LD/ObjectWriter.h>
12#include <cassert>
13
14#include <mcld/Support/FileOutputBuffer.h>
15
16namespace mcld {
17
18class EhFrame;
19class Module;
20class LinkerConfig;
21class GNULDBackend;
22class FragmentLinker;
23class Relocation;
24class LDSection;
25class SectionData;
26class RelocData;
27class Output;
28
29/** \class ELFObjectWriter
30 *  \brief ELFObjectWriter writes the target-independent parts of object files.
31 *  ELFObjectWriter reads a MCLDFile and writes into raw_ostream
32 *
33 */
34class ELFObjectWriter : public ObjectWriter
35{
36public:
37  ELFObjectWriter(GNULDBackend& pBackend, const LinkerConfig& pConfig);
38
39  ~ELFObjectWriter();
40
41  std::error_code writeObject(Module& pModule, FileOutputBuffer& pOutput);
42
43  size_t getOutputSize(const Module& pModule) const;
44
45private:
46  void writeSection(Module& pModule,
47                    FileOutputBuffer& pOutput, LDSection *section);
48
49  GNULDBackend&       target()        { return m_Backend; }
50
51  const GNULDBackend& target() const  { return m_Backend; }
52
53  // writeELFHeader - emit ElfXX_Ehdr
54  template<size_t SIZE>
55  void writeELFHeader(const LinkerConfig& pConfig,
56                      const Module& pModule,
57                      FileOutputBuffer& pOutput) const;
58
59  uint64_t getEntryPoint(const LinkerConfig& pConfig,
60                         const Module& pModule) const;
61
62  // emitSectionHeader - emit ElfXX_Shdr
63  template<size_t SIZE>
64  void emitSectionHeader(const Module& pModule,
65                         const LinkerConfig& pConfig,
66                         FileOutputBuffer& pOutput) const;
67
68  // emitProgramHeader - emit ElfXX_Phdr
69  template<size_t SIZE>
70  void emitProgramHeader(FileOutputBuffer& pOutput) const;
71
72  // emitShStrTab - emit .shstrtab
73  void emitShStrTab(const LDSection& pShStrTab,
74                    const Module& pModule,
75                    FileOutputBuffer& pOutput);
76
77  void emitSectionData(const LDSection& pSection, MemoryRegion& pRegion) const;
78
79  void emitEhFrame(Module& pModule,
80                   EhFrame& pFrame, MemoryRegion& pRegion) const;
81
82  void emitRelocation(const LinkerConfig& pConfig,
83                      const LDSection& pSection,
84                      MemoryRegion& pRegion) const;
85
86  // emitRel - emit ElfXX_Rel
87  template<size_t SIZE>
88  void emitRel(const LinkerConfig& pConfig,
89               const RelocData& pRelocData,
90               MemoryRegion& pRegion) const;
91
92  // emitRela - emit ElfXX_Rela
93  template<size_t SIZE>
94  void emitRela(const LinkerConfig& pConfig,
95                const RelocData& pRelocData,
96                MemoryRegion& pRegion) const;
97
98  // getSectEntrySize - compute ElfXX_Shdr::sh_entsize
99  template<size_t SIZE>
100  uint64_t getSectEntrySize(const LDSection& pSection) const;
101
102  // getSectLink - compute ElfXX_Shdr::sh_link
103  uint64_t getSectLink(const LDSection& pSection,
104                       const LinkerConfig& pConfig) const;
105
106  // getSectInfo - compute ElfXX_Shdr::sh_info
107  uint64_t getSectInfo(const LDSection& pSection) const;
108
109  template<size_t SIZE>
110  uint64_t getLastStartOffset(const Module& pModule) const
111  {
112    assert(0 && "Call invalid ELFObjectWriter::getLastStartOffset");
113    return 0;
114  }
115
116  void emitSectionData(const SectionData& pSD, MemoryRegion& pRegion) const;
117
118private:
119  GNULDBackend& m_Backend;
120
121  const LinkerConfig& m_Config;
122};
123
124template<>
125uint64_t ELFObjectWriter::getLastStartOffset<32>(const Module& pModule) const;
126
127template<>
128uint64_t ELFObjectWriter::getLastStartOffset<64>(const Module& pModule) const;
129
130} // namespace of mcld
131
132#endif
133
134