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