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