RuntimeDyldELF.cpp revision b862f094b78e3176813903f63c0e78b6e0e7852b
1e0934bee3a4f40731169bc42b15a39ce39978175Jim Grosbach//===-- RuntimeDyldELF.cpp - Run-time dynamic linker for MC-JIT -*- C++ -*-===// 2a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// 3a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// The LLVM Compiler Infrastructure 4a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// 5a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// This file is distributed under the University of Illinois Open Source 6a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// License. See LICENSE.TXT for details. 7a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// 8a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//===----------------------------------------------------------------------===// 9a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// 10a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// Implementation of ELF support for the MC-JIT runtime dynamic linker. 11a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// 12a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//===----------------------------------------------------------------------===// 13a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 14a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#define DEBUG_TYPE "dyld" 15a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/OwningPtr.h" 16a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/StringRef.h" 17a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/STLExtras.h" 18a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/IntervalMap.h" 1976463fdeb603e1d89b05f094bfd6fe73b90d0b61Eli Bendersky#include "RuntimeDyldELF.h" 20a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/Object/ObjectFile.h" 21a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/Support/ELF.h" 22a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/Triple.h" 23689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd#include "llvm/Object/ELF.h" 24689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd#include "JITRegistrar.h" 25a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskyusing namespace llvm; 26a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskyusing namespace llvm::object; 27a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 28689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdnamespace { 29689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 30689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 31689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdclass DyldELFObject : public ELFObjectFile<target_endianness, is64Bits> { 32689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits) 33689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 34689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef Elf_Shdr_Impl<target_endianness, is64Bits> Elf_Shdr; 35689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef Elf_Sym_Impl<target_endianness, is64Bits> Elf_Sym; 36689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef Elf_Rel_Impl<target_endianness, is64Bits, false> Elf_Rel; 37689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef Elf_Rel_Impl<target_endianness, is64Bits, true> Elf_Rela; 38689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 39689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef typename ELFObjectFile<target_endianness, is64Bits>:: 40689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Elf_Ehdr Elf_Ehdr; 41689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 42689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef typename ELFDataTypeTypedefHelper< 43689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd target_endianness, is64Bits>::value_type addr_type; 44689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 45689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdprotected: 46689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // This duplicates the 'Data' member in the 'Binary' base class 47689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // but it is necessary to workaround a bug in gcc 4.2 48689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd MemoryBuffer *InputData; 49689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 50689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdpublic: 51689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject(MemoryBuffer *Object, error_code &ec); 52689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 53689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd void updateSectionAddress(const SectionRef &Sec, uint64_t Addr); 54689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr); 55689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 56689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd const MemoryBuffer& getBuffer() const { return *InputData; } 57689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 582e319870f17a090e47540e2a821eac33c495bf59Andrew Kaylor // Methods for type inquiry through isa, cast and dyn_cast 59689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd static inline bool classof(const Binary *v) { 60689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return (isa<ELFObjectFile<target_endianness, is64Bits> >(v) 61689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd && classof(cast<ELFObjectFile<target_endianness, is64Bits> >(v))); 62689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 63689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd static inline bool classof( 64689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd const ELFObjectFile<target_endianness, is64Bits> *v) { 65689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return v->isDyldType(); 66689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 67689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd static inline bool classof(const DyldELFObject *v) { 68689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return true; 69689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 70689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}; 71689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 72689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 73689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdclass ELFObjectImage : public ObjectImage { 74689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd protected: 75689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<target_endianness, is64Bits> *DyldObj; 76689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd bool Registered; 77689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 78689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd public: 79689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd ELFObjectImage(DyldELFObject<target_endianness, is64Bits> *Obj) 80689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd : ObjectImage(Obj), 81689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldObj(Obj), 82689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Registered(false) {} 83689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 84689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual ~ELFObjectImage() { 85689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd if (Registered) 86689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd deregisterWithDebugger(); 87689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 88689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 89689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // Subclasses can override these methods to update the image with loaded 90689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // addresses for sections and common symbols 91689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual void updateSectionAddress(const SectionRef &Sec, uint64_t Addr) 92689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd { 93689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldObj->updateSectionAddress(Sec, Addr); 94689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 95689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 96689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr) 97689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd { 98689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldObj->updateSymbolAddress(Sym, Addr); 99689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 100689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 101689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual void registerWithDebugger() 102689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd { 103689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd JITRegistrar::getGDBRegistrar().registerObject(DyldObj->getBuffer()); 104689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Registered = true; 105689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 106689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual void deregisterWithDebugger() 107689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd { 108689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd JITRegistrar::getGDBRegistrar().deregisterObject(DyldObj->getBuffer()); 109689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 110689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}; 111689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 112689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 113689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdDyldELFObject<target_endianness, is64Bits>::DyldELFObject(MemoryBuffer *Object, 114689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd error_code &ec) 115689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd : ELFObjectFile<target_endianness, is64Bits>(Object, ec), 116689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd InputData(Object) { 117689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd this->isDyldELFObject = true; 118689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 119689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 120689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 121689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid DyldELFObject<target_endianness, is64Bits>::updateSectionAddress( 122689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd const SectionRef &Sec, 123689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd uint64_t Addr) { 124689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DataRefImpl ShdrRef = Sec.getRawDataRefImpl(); 125689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Elf_Shdr *shdr = const_cast<Elf_Shdr*>( 126689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd reinterpret_cast<const Elf_Shdr *>(ShdrRef.p)); 127689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 128689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // This assumes the address passed in matches the target address bitness 129689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // The template-based type cast handles everything else. 130689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd shdr->sh_addr = static_cast<addr_type>(Addr); 131689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 132689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 133689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 134689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid DyldELFObject<target_endianness, is64Bits>::updateSymbolAddress( 135689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd const SymbolRef &SymRef, 136689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd uint64_t Addr) { 137689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 138689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Elf_Sym *sym = const_cast<Elf_Sym*>( 139689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd ELFObjectFile<target_endianness, is64Bits>:: 140689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd getSymbol(SymRef.getRawDataRefImpl())); 141689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 142689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // This assumes the address passed in matches the target address bitness 143689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // The template-based type cast handles everything else. 144689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd sym->st_value = static_cast<addr_type>(Addr); 145689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 146689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 147689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} // namespace 148689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 149689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 150a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskynamespace llvm { 151a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 152689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdObjectImage *RuntimeDyldELF::createObjectImage( 153689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd const MemoryBuffer *ConstInputBuffer) { 154689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd MemoryBuffer *InputBuffer = const_cast<MemoryBuffer*>(ConstInputBuffer); 155689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd std::pair<unsigned char, unsigned char> Ident = getElfArchType(InputBuffer); 156689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd error_code ec; 157689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 158689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB) { 159689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<support::little, false> *Obj = 160689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd new DyldELFObject<support::little, false>(InputBuffer, ec); 161689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return new ELFObjectImage<support::little, false>(Obj); 162689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 163689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) { 164689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<support::big, false> *Obj = 165689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd new DyldELFObject<support::big, false>(InputBuffer, ec); 166689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return new ELFObjectImage<support::big, false>(Obj); 167689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 168689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) { 169689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<support::big, true> *Obj = 170689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd new DyldELFObject<support::big, true>(InputBuffer, ec); 171689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return new ELFObjectImage<support::big, true>(Obj); 172689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 173689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) { 174689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<support::little, true> *Obj = 175689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd new DyldELFObject<support::little, true>(InputBuffer, ec); 176689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return new ELFObjectImage<support::little, true>(Obj); 177689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 178689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd else 179689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd llvm_unreachable("Unexpected ELF format"); 180689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 181689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 182689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid RuntimeDyldELF::handleObjectLoaded(ObjectImage *Obj) 183689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd{ 184689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Obj->registerWithDebugger(); 185689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // Save the loaded object. It will deregister itself when deleted 186689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd LoadedObject = Obj; 187689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 188689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 189689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdRuntimeDyldELF::~RuntimeDyldELF() { 190689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd if (LoadedObject) 191689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd delete LoadedObject; 192689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 193a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 1940e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveX86_64Relocation(uint8_t *LocalAddress, 1950e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t FinalAddress, 1960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t Value, 1970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Type, 1980e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int64_t Addend) { 1990e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev switch (Type) { 2000e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev default: 2010e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev llvm_unreachable("Relocation type not implemented yet!"); 2020e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 203a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_X86_64_64: { 2040e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t *Target = (uint64_t*)(LocalAddress); 2050e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *Target = Value + Addend; 206a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 207a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 208a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_X86_64_32: 209a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_X86_64_32S: { 2100e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value += Addend; 211d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor assert((Type == ELF::R_X86_64_32 && (Value <= UINT32_MAX)) || 212d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor (Type == ELF::R_X86_64_32S && 213d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor ((int64_t)Value <= INT32_MAX && (int64_t)Value >= INT32_MIN))); 214a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky uint32_t TruncatedAddr = (Value & 0xFFFFFFFF); 2150e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t *Target = reinterpret_cast<uint32_t*>(LocalAddress); 216a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky *Target = TruncatedAddr; 217a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 218a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 219a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_X86_64_PC32: { 2200e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t *Placeholder = reinterpret_cast<uint32_t*>(LocalAddress); 2210e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int64_t RealOffset = *Placeholder + Value + Addend - FinalAddress; 222d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN); 2230e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int32_t TruncOffset = (RealOffset & 0xFFFFFFFF); 224a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky *Placeholder = TruncOffset; 225a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 226a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 227a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 228a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 229a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 2300e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveX86Relocation(uint8_t *LocalAddress, 2310e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t FinalAddress, 2320e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Value, 2330e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Type, 2340e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int32_t Addend) { 2350e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev switch (Type) { 236a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_386_32: { 2370e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t *Target = (uint32_t*)(LocalAddress); 238c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd uint32_t Placeholder = *Target; 239c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd *Target = Placeholder + Value + Addend; 240a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 241a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 242a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_386_PC32: { 2430e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t *Placeholder = reinterpret_cast<uint32_t*>(LocalAddress); 2440e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t RealOffset = *Placeholder + Value + Addend - FinalAddress; 245a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky *Placeholder = RealOffset; 246a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 247a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 248a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky default: 249a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky // There are other relocation types, but it appears these are the 250e2e73bd044eca405076a127e87d68d91f0fcb4b9Andrew Kaylor // only ones currently used by the LLVM ELF object writer 251858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper llvm_unreachable("Relocation type not implemented yet!"); 2520e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 253a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 254a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 255a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 2560e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveARMRelocation(uint8_t *LocalAddress, 2570e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t FinalAddress, 2580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Value, 2590e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Type, 2600e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int32_t Addend) { 2610e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // TODO: Add Thumb relocations. 2620e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t* TargetPtr = (uint32_t*)LocalAddress; 2630e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value += Addend; 2640e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2650e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "resolveARMRelocation, LocalAddress: " << LocalAddress 2660e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " FinalAddress: " << format("%p",FinalAddress) 2670e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Value: " << format("%x",Value) 2680e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Type: " << format("%x",Type) 2690e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Addend: " << format("%x",Addend) 2700e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << "\n"); 2710e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2720e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev switch(Type) { 2730e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev default: 2740e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev llvm_unreachable("Not implemented relocation type!"); 2750e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2760e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Just write 32bit value to relocation address 2770e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_ABS32 : 2780e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr = Value; 2790e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 2800e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2810e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Write first 16 bit of 32 bit value to the mov instruction. 2820e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Last 4 bit should be shifted. 2830e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_MOVW_ABS_NC : 2840e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value = Value & 0xFFFF; 2850e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= Value & 0xFFF; 2860e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= ((Value >> 12) & 0xF) << 16; 2870e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 2880e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Write last 16 bit of 32 bit value to the mov instruction. 2900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Last 4 bit should be shifted. 2910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_MOVT_ABS : 2920e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value = (Value >> 16) & 0xFFFF; 2930e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= Value & 0xFFF; 2940e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= ((Value >> 12) & 0xF) << 16; 2950e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 2960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Write 24 bit relative value to the branch instruction. 2980e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_PC24 : // Fall through. 2990e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_CALL : // Fall through. 3000e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_JUMP24 : 3010e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int32_t RelValue = static_cast<int32_t>(Value - FinalAddress - 8); 3020e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev RelValue = (RelValue & 0x03FFFFFC) >> 2; 3030e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr &= 0xFF000000; 3040e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= RelValue; 3050e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 3060e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 307a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 308a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 309b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanakavoid RuntimeDyldELF::resolveMIPSRelocation(uint8_t *LocalAddress, 310b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka uint32_t FinalAddress, 311b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka uint32_t Value, 312b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka uint32_t Type, 313b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka int32_t Addend) { 314b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint32_t* TargetPtr = (uint32_t*)LocalAddress; 315b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Value += Addend; 316b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 317b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka DEBUG(dbgs() << "resolveMipselocation, LocalAddress: " << LocalAddress 318b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << " FinalAddress: " << format("%p",FinalAddress) 319b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << " Value: " << format("%x",Value) 320b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << " Type: " << format("%x",Type) 321b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << " Addend: " << format("%x",Addend) 322b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << "\n"); 323b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 324b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka switch(Type) { 325b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka default: 326b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka llvm_unreachable("Not implemented relocation type!"); 327b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 328b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::R_MIPS_32: 329b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka *TargetPtr = Value + (*TargetPtr); 330b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 331b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::R_MIPS_26: 332b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka *TargetPtr = ((*TargetPtr) & 0xfc000000) | (( Value & 0x0fffffff) >> 2); 333b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 334b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::R_MIPS_HI16: 335b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Get the higher 16-bits. Also add 1 if bit 15 is 1. 336b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Value += ((*TargetPtr) & 0x0000ffff) << 16; 337b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka *TargetPtr = ((*TargetPtr) & 0xffff0000) | 338b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka (((Value + 0x8000) >> 16) & 0xffff); 339b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 340b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::R_MIPS_LO16: 341b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Value += ((*TargetPtr) & 0x0000ffff); 342b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka *TargetPtr = ((*TargetPtr) & 0xffff0000) | (Value & 0xffff); 343b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 344b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } 345b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka} 346b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 3470e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveRelocation(uint8_t *LocalAddress, 3480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t FinalAddress, 3490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t Value, 3500e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Type, 3510e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int64_t Addend) { 352a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky switch (Arch) { 353a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case Triple::x86_64: 3540e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev resolveX86_64Relocation(LocalAddress, FinalAddress, Value, Type, Addend); 355a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 356a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case Triple::x86: 3570e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev resolveX86Relocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL), 3580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (uint32_t)(Value & 0xffffffffL), Type, 3590e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (uint32_t)(Addend & 0xffffffffL)); 360a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 3610e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case Triple::arm: // Fall through. 3620e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case Triple::thumb: 3630e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev resolveARMRelocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL), 3640e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (uint32_t)(Value & 0xffffffffL), Type, 3650e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (uint32_t)(Addend & 0xffffffffL)); 366a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 367b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case Triple::mips: // Fall through. 368b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case Triple::mipsel: 369b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka resolveMIPSRelocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL), 370b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka (uint32_t)(Value & 0xffffffffL), Type, 371b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka (uint32_t)(Addend & 0xffffffffL)); 372b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 373858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper default: llvm_unreachable("Unsupported CPU type!"); 374a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 375a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 376a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 3770e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel, 378689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd ObjectImage &Obj, 3790e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev ObjSectionToIDMap &ObjSectionToID, 380d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky const SymbolTableMap &Symbols, 3810e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev StubMap &Stubs) { 3820e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 3830e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t RelType = (uint32_t)(Rel.Type & 0xffffffffL); 3840e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev intptr_t Addend = (intptr_t)Rel.AdditionalInfo; 3850e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev const SymbolRef &Symbol = Rel.Symbol; 386c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky 387c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky // Obtain the symbol name which is referenced in the relocation 388c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky StringRef TargetName; 3890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Symbol.getName(TargetName); 3900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "\t\tRelType: " << RelType 3910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Addend: " << Addend 3920e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " TargetName: " << TargetName 3930e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << "\n"); 394c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky RelocationValueRef Value; 395c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky // First search for the symbol in the local symbol table 396d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky SymbolTableMap::const_iterator lsi = Symbols.find(TargetName.data()); 3970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev if (lsi != Symbols.end()) { 3980e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.SectionID = lsi->second.first; 3990e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.Addend = lsi->second.second; 4000e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } else { 401c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky // Search for the symbol in the global symbol table 402d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky SymbolTableMap::const_iterator gsi = 403d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky GlobalSymbolTable.find(TargetName.data()); 404d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky if (gsi != GlobalSymbolTable.end()) { 4050e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.SectionID = gsi->second.first; 4060e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.Addend = gsi->second.second; 4070e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } else { 4080e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev SymbolRef::Type SymType; 4090e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Symbol.getType(SymType); 4100e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev switch (SymType) { 4110e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case SymbolRef::ST_Debug: { 4120e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // TODO: Now ELF SymbolRef::ST_Debug = STT_SECTION, it's not obviously 4130e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // and can be changed by another developers. Maybe best way is add 4140e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // a new symbol type ST_Section to SymbolRef and use it. 415c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky section_iterator si(Obj.end_sections()); 4160e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Symbol.getSection(si); 4170e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev if (si == Obj.end_sections()) 4180e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev llvm_unreachable("Symbol section not found, bad object file format!"); 4190e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "\t\tThis is section symbol\n"); 420689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Value.SectionID = findOrEmitSection(Obj, (*si), true, ObjSectionToID); 4210e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.Addend = Addend; 4220e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 4230e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 4240e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case SymbolRef::ST_Unknown: { 4250e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.SymbolName = TargetName.data(); 4260e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.Addend = Addend; 4270e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 4280e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 4290e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev default: 4300e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev llvm_unreachable("Unresolved symbol type!"); 4310e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 4320e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 4330e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 434a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 4350e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "\t\tRel.SectionID: " << Rel.SectionID 4360e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Rel.Offset: " << Rel.Offset 4370e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << "\n"); 4380e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev if (Arch == Triple::arm && 4390e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (RelType == ELF::R_ARM_PC24 || 4400e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev RelType == ELF::R_ARM_CALL || 4410e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev RelType == ELF::R_ARM_JUMP24)) { 4420e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // This is an ARM branch relocation, need to use a stub function. 4430e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "\t\tThis is an ARM branch relocation."); 4440e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev SectionEntry &Section = Sections[Rel.SectionID]; 4450e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint8_t *Target = Section.Address + Rel.Offset; 4460e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 4470e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Look up for existing stub. 4480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev StubMap::const_iterator i = Stubs.find(Value); 4490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev if (i != Stubs.end()) { 450ab427334f54fed51ed721672a6d0fd1ca0802dd4Danil Malyshev resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address + 4510e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev i->second, RelType, 0); 4520e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << " Stub function found\n"); 4530e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } else { 4540e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Create a new stub function. 4550e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << " Create a new stub function\n"); 4560e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Stubs[Value] = Section.StubOffset; 4570e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint8_t *StubTargetAddr = createStubFunction(Section.Address + 4580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Section.StubOffset); 459c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky RelocationEntry RE(Rel.SectionID, StubTargetAddr - Section.Address, 460c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky ELF::R_ARM_ABS32, Value.Addend); 461c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky if (Value.SymbolName) 462c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky addRelocationForSymbol(RE, Value.SymbolName); 463c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky else 464c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky addRelocationForSection(RE, Value.SectionID); 465c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky 466ab427334f54fed51ed721672a6d0fd1ca0802dd4Danil Malyshev resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address + 4670e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Section.StubOffset, RelType, 0); 4680e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Section.StubOffset += getMaxStubSize(); 4690e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 470b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } else if (Arch == Triple::mipsel && RelType == ELF::R_MIPS_26) { 471b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // This is an Mips branch relocation, need to use a stub function. 472b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka DEBUG(dbgs() << "\t\tThis is a Mips branch relocation."); 473b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka SectionEntry &Section = Sections[Rel.SectionID]; 474b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint8_t *Target = Section.Address + Rel.Offset; 475b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint32_t *TargetAddress = (uint32_t *)Target; 476b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 477b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Extract the addend from the instruction. 478b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint32_t Addend = ((*TargetAddress) & 0x03ffffff) << 2; 479b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 480b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Value.Addend += Addend; 481b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 482b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Look up for existing stub. 483b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka StubMap::const_iterator i = Stubs.find(Value); 484b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka if (i != Stubs.end()) { 485b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka resolveRelocation(Target, (uint64_t)Target, 486b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka (uint64_t)Section.Address + 487b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka i->second, RelType, 0); 488b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka DEBUG(dbgs() << " Stub function found\n"); 489b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } else { 490b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Create a new stub function. 491b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka DEBUG(dbgs() << " Create a new stub function\n"); 492b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Stubs[Value] = Section.StubOffset; 493b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint8_t *StubTargetAddr = createStubFunction(Section.Address + 494b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Section.StubOffset); 495b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 496b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Creating Hi and Lo relocations for the filled stub instructions. 497b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka RelocationEntry REHi(Rel.SectionID, 498b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka StubTargetAddr - Section.Address, 499b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka ELF::R_MIPS_HI16, Value.Addend); 500b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka RelocationEntry RELo(Rel.SectionID, 501b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka StubTargetAddr - Section.Address + 4, 502b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka ELF::R_MIPS_LO16, Value.Addend); 503b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 504b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka if (Value.SymbolName) { 505b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka addRelocationForSymbol(REHi, Value.SymbolName); 506b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka addRelocationForSymbol(RELo, Value.SymbolName); 507b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } else { 508b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka addRelocationForSection(REHi, Value.SectionID); 509b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka addRelocationForSection(RELo, Value.SectionID); 510b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } 511b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 512b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka resolveRelocation(Target, (uint64_t)Target, 513b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka (uint64_t)Section.Address + 514b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Section.StubOffset, RelType, 0); 515b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Section.StubOffset += getMaxStubSize(); 516b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } 517c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky } else { 518c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky RelocationEntry RE(Rel.SectionID, Rel.Offset, RelType, Value.Addend); 519c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky if (Value.SymbolName) 520c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky addRelocationForSymbol(RE, Value.SymbolName); 521c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky else 522c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky addRelocationForSection(RE, Value.SectionID); 523c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky } 52461425c0a7f4e3608a85f7bbf254cd052a15b7446Jim Grosbach} 52561425c0a7f4e3608a85f7bbf254cd052a15b7446Jim Grosbach 526a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskybool RuntimeDyldELF::isCompatibleFormat(const MemoryBuffer *InputBuffer) const { 527a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky StringRef Magic = InputBuffer->getBuffer().slice(0, ELF::EI_NIDENT); 528a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky return (memcmp(Magic.data(), ELF::ElfMagic, strlen(ELF::ElfMagic))) == 0; 529a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 530a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} // namespace llvm 531