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