Home | History | Annotate | Download | only in LD
      1 //===- ELFWriter.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_ELF_WRITER_H
     10 #define MCLD_ELF_WRITER_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 
     15 #include <llvm/Support/ELF.h>
     16 #include <mcld/MC/MCLDOutput.h>
     17 
     18 namespace llvm {
     19 class MCSectionData;
     20 }
     21 
     22 namespace mcld
     23 {
     24 
     25 class MCLDInfo;
     26 class Layout;
     27 class GNULDBackend;
     28 class Relocation;
     29 class LDSection;
     30 
     31 /** \class ELFWriter
     32  *  \brief ELFWriter provides basic functions to write ELF sections, symbols,
     33  *  and so on.
     34  */
     35 class ELFWriter
     36 {
     37 public:
     38   typedef uint64_t FileOffset;
     39 
     40 protected:
     41   ELFWriter(GNULDBackend& pBackend)
     42   : f_Backend(pBackend) {
     43   }
     44 
     45 public:
     46   virtual ~ELFWriter() { }
     47 
     48   GNULDBackend& target()
     49   { return f_Backend; }
     50 
     51   const GNULDBackend& target() const
     52   { return f_Backend; }
     53 
     54   virtual void writeELF32Header(const MCLDInfo& pInfo,
     55                                 const Layout& pLayout,
     56                                 const GNULDBackend& pBackend,
     57                                 Output& pOutput) const;
     58 
     59   virtual void writeELF64Header(const MCLDInfo& pInfo,
     60                                 const Layout& pLayout,
     61                                 const GNULDBackend& pBackend,
     62                                 Output& pOutput) const;
     63 
     64   virtual uint64_t getEntryPoint(const MCLDInfo& pInfo,
     65                                  const Layout& pLayout,
     66                                  const GNULDBackend& pBackend,
     67                                  const Output& pOutput) const;
     68 
     69 protected:
     70   void emitELF32SectionHeader(Output& pOutput, MCLinker& pLinker) const;
     71 
     72   void emitELF64SectionHeader(Output& pOutput, MCLinker& pLinker) const;
     73 
     74   // emitShStrTab - emit .shstrtab
     75   void emitELF32ShStrTab(Output& pOutput, MCLinker& pLinker) const;
     76 
     77   void emitELF64ShStrTab(Output& pOutput, MCLinker& pLinker) const;
     78 
     79   void emitSectionData(const Layout& pLayout,
     80                        const LDSection& pSection,
     81                        MemoryRegion& pRegion) const;
     82 
     83   void emitRelocation(const Layout& pLayout,
     84                       const Output& pOutput,
     85                       const LDSection& pSection,
     86                       MemoryRegion& pRegion) const;
     87 
     88   void emitRel(const Layout& pLayout,
     89                const Output& pOutput,
     90                const llvm::MCSectionData& pSectionData,
     91                MemoryRegion& pRegion) const;
     92 
     93   void emitRela(const Layout& pLayout,
     94                 const Output& pOutput,
     95                 const llvm::MCSectionData& pSectionData,
     96                 MemoryRegion& pRegion) const;
     97 
     98 private:
     99   // getSectEntrySize - compute ElfXX_Shdr::sh_entsize
    100   uint64_t getELF32SectEntrySize(const LDSection& pSection) const;
    101 
    102   // getSectEntrySize - compute ElfXX_Shdr::sh_entsize
    103   uint64_t getELF64SectEntrySize(const LDSection& pSection) const;
    104 
    105   // getSectEntrySize - compute ElfXX_Shdr::sh_link
    106   uint64_t getSectLink(const LDSection& pSection, const Output& pOutput) const;
    107 
    108   // getSectEntrySize - compute ElfXX_Shdr::sh_info
    109   uint64_t getSectInfo(const LDSection& pSection, const Output& pOutput) const;
    110 
    111   uint64_t getELF32LastStartOffset(const Output& pOutput) const;
    112 
    113   uint64_t getELF64LastStartOffset(const Output& pOutput) const;
    114 
    115 protected:
    116   GNULDBackend& f_Backend;
    117 };
    118 
    119 } // namespace of mcld
    120 
    121 #endif
    122