ELFReaderIf.h revision 6f75755c9204b1d8817ae5a65a2f7e5af0ec3f70
16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- ELFReader.h --------------------------------------------------------===//
26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//                     The MCLinker Project
46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source
66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details.
76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifndef MCLD_ELF_READER_INTERFACE_H
106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define MCLD_ELF_READER_INTERFACE_H
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifdef ENABLE_UNITTEST
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <gtest.h>
136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/ADT/StringRef.h>
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/ELF.h>
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/Host.h>
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Module.h>
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LinkerConfig.h>
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/LDContext.h>
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/GNULDBackend.h>
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/MsgHandling.h>
246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass Module;
286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass IRBuilder;
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass FragmentRef;
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass SectionData;
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass LDSection;
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class ELFReaderIF
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief ELFReaderIF provides common interface for all kind of ELF readers.
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFReaderIF
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ELFReaderIF(GNULDBackend& pBackend)
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    : m_Backend(pBackend)
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { }
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual ~ELFReaderIF() { }
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// ELFHeaderSize - return the size of the ELFHeader
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual size_t getELFHeaderSize() const = 0;
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// isELF - is this a ELF file
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool isELF(void* pELFHeader) const = 0;
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// isMyEndian - is this ELF file in the same endian to me?
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool isMyEndian(void* pELFHeader) const = 0;
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// isMyMachine - is this ELF file generated for the same machine.
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool isMyMachine(void* pELFHeader) const = 0;
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// fileType - the file type of this file
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual Input::Type fileType(void* pELFHeader) const = 0;
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// target - the target backend
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const GNULDBackend& target() const { return m_Backend; }
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  GNULDBackend&       target()       { return m_Backend; }
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readSectionHeaders - read ELF section header table and create LDSections
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readSectionHeaders(Input& pInput, void* pELFHeader) const = 0;
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readRegularSection - read a regular section and create fragments.
696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readRegularSection(Input& pInput, SectionData& pSD) const = 0;
706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readSymbols - read ELF symbols and create LDSymbol
726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readSymbols(Input& pInput,
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                           IRBuilder& pBuilder,
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                           const MemoryRegion& pRegion,
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                           const char* StrTab) const = 0;
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readSignature - read a symbol from the given Input and index in symtab
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// This is used to get the signature of a group section.
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual ResolveInfo* readSignature(Input& pInput,
806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                     LDSection& pSymTab,
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                     uint32_t pSymIdx) const = 0;
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readRela - read ELF rela and create Relocation
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readRela(Input& pInput,
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                        LDSection& pSection,
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                        const MemoryRegion& pRegion) const = 0;
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readRel - read ELF rel and create Relocation
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readRel(Input& pInput,
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                       LDSection& pSection,
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                       const MemoryRegion& pRegion) const = 0;
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readDynamic - read ELF .dynamic in input dynobj
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readDynamic(Input& pInput) const = 0;
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// LinkInfo - some section needs sh_link and sh_info, remember them.
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  struct LinkInfo {
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    LDSection* section;
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    uint32_t sh_link;
1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    uint32_t sh_info;
1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  };
1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef std::vector<LinkInfo> LinkInfoList;
1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Type getSymType(uint8_t pInfo, uint16_t pShndx) const;
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Desc getSymDesc(uint16_t pShndx, const Input& pInput) const;
1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Binding getSymBinding(uint8_t pBinding,
1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                     uint16_t pShndx,
1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                     uint8_t pVisibility) const;
1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t getSymValue(uint64_t pValue,
1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                       uint16_t pShndx,
1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                       const Input& pInput) const;
1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  FragmentRef* getSymFragmentRef(Input& pInput,
1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                 uint16_t pShndx,
1216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                 uint32_t pOffset) const;
1226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Visibility getSymVisibility(uint8_t pVis) const;
1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  GNULDBackend& m_Backend;
1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
1286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
133