ELFReaderIf.h revision 533eae20118036f425f27bf0536ef0ccbb090b65
1//===- ELFReaderIf.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_ELFREADERIF_H
10#define MCLD_LD_ELFREADERIF_H
11
12#include <llvm/ADT/StringRef.h>
13#include <llvm/Support/ELF.h>
14#include <llvm/Support/Host.h>
15
16#include <mcld/Module.h>
17#include <mcld/LinkerConfig.h>
18#include <mcld/LD/LDContext.h>
19#include <mcld/Target/GNULDBackend.h>
20#include <mcld/Support/MsgHandling.h>
21
22namespace mcld {
23
24class Module;
25class IRBuilder;
26class FragmentRef;
27class SectionData;
28class LDSection;
29
30/** \class ELFReaderIF
31 *  \brief ELFReaderIF provides common interface for all kind of ELF readers.
32 */
33class ELFReaderIF
34{
35public:
36  ELFReaderIF(GNULDBackend& pBackend)
37    : m_Backend(pBackend)
38  { }
39
40  virtual ~ELFReaderIF() { }
41
42  /// ELFHeaderSize - return the size of the ELFHeader
43  virtual size_t getELFHeaderSize() const = 0;
44
45  /// isELF - is this a ELF file
46  virtual bool isELF(const void* pELFHeader) const = 0;
47
48  /// isMyEndian - is this ELF file in the same endian to me?
49  virtual bool isMyEndian(const void* pELFHeader) const = 0;
50
51  /// isMyMachine - is this ELF file generated for the same machine.
52  virtual bool isMyMachine(const void* pELFHeader) const = 0;
53
54  /// fileType - the file type of this file
55  virtual Input::Type fileType(const void* pELFHeader) const = 0;
56
57  /// target - the target backend
58  const GNULDBackend& target() const { return m_Backend; }
59  GNULDBackend&       target()       { return m_Backend; }
60
61
62  /// readSectionHeaders - read ELF section header table and create LDSections
63  virtual bool readSectionHeaders(Input& pInput,
64                                  const void* pELFHeader) const = 0;
65
66  /// readRegularSection - read a regular section and create fragments.
67  virtual bool readRegularSection(Input& pInput, SectionData& pSD) const = 0;
68
69  /// readSymbols - read ELF symbols and create LDSymbol
70  virtual bool readSymbols(Input& pInput,
71                           IRBuilder& pBuilder,
72                           llvm::StringRef pRegion,
73                           const char* StrTab) const = 0;
74
75  /// readSignature - read a symbol from the given Input and index in symtab
76  /// This is used to get the signature of a group section.
77  virtual ResolveInfo* readSignature(Input& pInput,
78                                     LDSection& pSymTab,
79                                     uint32_t pSymIdx) const = 0;
80
81  /// readRela - read ELF rela and create Relocation
82  virtual bool readRela(Input& pInput,
83                        LDSection& pSection,
84                        llvm::StringRef pRegion) const = 0;
85
86  /// readRel - read ELF rel and create Relocation
87  virtual bool readRel(Input& pInput,
88                       LDSection& pSection,
89                       llvm::StringRef pRegion) const = 0;
90
91  /// readDynamic - read ELF .dynamic in input dynobj
92  virtual bool readDynamic(Input& pInput) const = 0;
93
94protected:
95  /// LinkInfo - some section needs sh_link and sh_info, remember them.
96  struct LinkInfo {
97    LDSection* section;
98    uint32_t sh_link;
99    uint32_t sh_info;
100  };
101
102  typedef std::vector<LinkInfo> LinkInfoList;
103
104protected:
105  ResolveInfo::Type getSymType(uint8_t pInfo, uint16_t pShndx) const;
106
107  ResolveInfo::Desc getSymDesc(uint16_t pShndx, const Input& pInput) const;
108
109  ResolveInfo::Binding getSymBinding(uint8_t pBinding,
110                                     uint16_t pShndx,
111                                     uint8_t pVisibility) const;
112
113  uint64_t getSymValue(uint64_t pValue,
114                       uint16_t pShndx,
115                       const Input& pInput) const;
116
117  FragmentRef* getSymFragmentRef(Input& pInput,
118                                 uint16_t pShndx,
119                                 uint32_t pOffset) const;
120
121  ResolveInfo::Visibility getSymVisibility(uint8_t pVis) const;
122
123protected:
124  GNULDBackend& m_Backend;
125};
126
127} // namespace of mcld
128
129#endif
130
131