RuntimeDyldELF.cpp revision 3f23cef24fc9200def464bd4bce820678b5715de
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" 153f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "RuntimeDyldELF.h" 163f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "JITRegistrar.h" 173f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "ObjectImageCommon.h" 18a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/OwningPtr.h" 19a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/StringRef.h" 20a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/STLExtras.h" 21a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/IntervalMap.h" 22a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/Object/ObjectFile.h" 233f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/ObjectImage.h" 243f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/ObjectBuffer.h" 25a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/Support/ELF.h" 26a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/Triple.h" 27689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd#include "llvm/Object/ELF.h" 28a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskyusing namespace llvm; 29a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskyusing namespace llvm::object; 30a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 31689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdnamespace { 32689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 33689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 34689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdclass DyldELFObject : public ELFObjectFile<target_endianness, is64Bits> { 35689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits) 36689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 37689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef Elf_Shdr_Impl<target_endianness, is64Bits> Elf_Shdr; 38689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef Elf_Sym_Impl<target_endianness, is64Bits> Elf_Sym; 39689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef Elf_Rel_Impl<target_endianness, is64Bits, false> Elf_Rel; 40689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef Elf_Rel_Impl<target_endianness, is64Bits, true> Elf_Rela; 41689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 422c38a6615a693d0a43159825da2358126473502bMichael J. Spencer typedef Elf_Ehdr_Impl<target_endianness, is64Bits> Elf_Ehdr; 43689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 44689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd typedef typename ELFDataTypeTypedefHelper< 45689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd target_endianness, is64Bits>::value_type addr_type; 46689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 47689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdpublic: 483f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor DyldELFObject(MemoryBuffer *Wrapper, error_code &ec); 49689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 50689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd void updateSectionAddress(const SectionRef &Sec, uint64_t Addr); 51689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr); 52689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 532e319870f17a090e47540e2a821eac33c495bf59Andrew Kaylor // Methods for type inquiry through isa, cast and dyn_cast 54689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd static inline bool classof(const Binary *v) { 55689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return (isa<ELFObjectFile<target_endianness, is64Bits> >(v) 56689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd && classof(cast<ELFObjectFile<target_endianness, is64Bits> >(v))); 57689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 58689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd static inline bool classof( 59689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd const ELFObjectFile<target_endianness, is64Bits> *v) { 60689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return v->isDyldType(); 61689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 62689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd static inline bool classof(const DyldELFObject *v) { 63689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return true; 64689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 65689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}; 66689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 67689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 683f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylorclass ELFObjectImage : public ObjectImageCommon { 69689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd protected: 70689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<target_endianness, is64Bits> *DyldObj; 71689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd bool Registered; 72689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 73689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd public: 743f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor ELFObjectImage(ObjectBuffer *Input, 753f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor DyldELFObject<target_endianness, is64Bits> *Obj) 763f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor : ObjectImageCommon(Input, Obj), 77689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldObj(Obj), 78689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Registered(false) {} 79689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 80689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual ~ELFObjectImage() { 81689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd if (Registered) 82689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd deregisterWithDebugger(); 83689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 84689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 85689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // Subclasses can override these methods to update the image with loaded 86689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // addresses for sections and common symbols 87689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual void updateSectionAddress(const SectionRef &Sec, uint64_t Addr) 88689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd { 89689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldObj->updateSectionAddress(Sec, Addr); 90689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 91689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 92689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr) 93689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd { 94689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldObj->updateSymbolAddress(Sym, Addr); 95689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 96689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 97689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual void registerWithDebugger() 98689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd { 993f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor JITRegistrar::getGDBRegistrar().registerObject(*Buffer); 100689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Registered = true; 101689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 102689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd virtual void deregisterWithDebugger() 103689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd { 1043f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor JITRegistrar::getGDBRegistrar().deregisterObject(*Buffer); 105689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 106689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}; 107689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 1083f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor// The MemoryBuffer passed into this constructor is just a wrapper around the 1093f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor// actual memory. Ultimately, the Binary parent class will take ownership of 1103f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor// this MemoryBuffer object but not the underlying memory. 111689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 1123f23cef24fc9200def464bd4bce820678b5715deAndrew KaylorDyldELFObject<target_endianness, is64Bits>::DyldELFObject(MemoryBuffer *Wrapper, 113689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd error_code &ec) 1143f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor : ELFObjectFile<target_endianness, is64Bits>(Wrapper, ec) { 115689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd this->isDyldELFObject = true; 116689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 117689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 118689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 119689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid DyldELFObject<target_endianness, is64Bits>::updateSectionAddress( 120689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd const SectionRef &Sec, 121689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd uint64_t Addr) { 122689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DataRefImpl ShdrRef = Sec.getRawDataRefImpl(); 123689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Elf_Shdr *shdr = const_cast<Elf_Shdr*>( 124689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd reinterpret_cast<const Elf_Shdr *>(ShdrRef.p)); 125689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 126689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // This assumes the address passed in matches the target address bitness 127689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // The template-based type cast handles everything else. 128689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd shdr->sh_addr = static_cast<addr_type>(Addr); 129689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 130689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 131689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits> 132689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid DyldELFObject<target_endianness, is64Bits>::updateSymbolAddress( 133689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd const SymbolRef &SymRef, 134689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd uint64_t Addr) { 135689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 136689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Elf_Sym *sym = const_cast<Elf_Sym*>( 137689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd ELFObjectFile<target_endianness, is64Bits>:: 138689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd getSymbol(SymRef.getRawDataRefImpl())); 139689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 140689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // This assumes the address passed in matches the target address bitness 141689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd // The template-based type cast handles everything else. 142689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd sym->st_value = static_cast<addr_type>(Addr); 143689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 144689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 145689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} // namespace 146689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 147689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 148a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskynamespace llvm { 149a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 1503f23cef24fc9200def464bd4bce820678b5715deAndrew KaylorObjectImage *RuntimeDyldELF::createObjectImage(ObjectBuffer *Buffer) { 1513f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor if (Buffer->getBufferSize() < ELF::EI_NIDENT) 1523f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor llvm_unreachable("Unexpected ELF object size"); 1533f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor std::pair<unsigned char, unsigned char> Ident = std::make_pair( 1543f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor (uint8_t)Buffer->getBufferStart()[ELF::EI_CLASS], 1553f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor (uint8_t)Buffer->getBufferStart()[ELF::EI_DATA]); 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 = 1603f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor new DyldELFObject<support::little, false>(Buffer->getMemBuffer(), ec); 1613f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor return new ELFObjectImage<support::little, false>(Buffer, Obj); 162689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 163689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) { 164689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<support::big, false> *Obj = 1653f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor new DyldELFObject<support::big, false>(Buffer->getMemBuffer(), ec); 1663f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor return new ELFObjectImage<support::big, false>(Buffer, Obj); 167689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 168689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) { 169689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<support::big, true> *Obj = 1703f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor new DyldELFObject<support::big, true>(Buffer->getMemBuffer(), ec); 1713f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor return new ELFObjectImage<support::big, true>(Buffer, Obj); 172689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 173689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) { 174689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd DyldELFObject<support::little, true> *Obj = 1753f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor new DyldELFObject<support::little, true>(Buffer->getMemBuffer(), ec); 1763f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor return new ELFObjectImage<support::little, true>(Buffer, Obj); 177689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd } 178689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd else 179689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd llvm_unreachable("Unexpected ELF format"); 180689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 181689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 182689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdRuntimeDyldELF::~RuntimeDyldELF() { 183689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 184a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 1850e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveX86_64Relocation(uint8_t *LocalAddress, 1860e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t FinalAddress, 1870e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t Value, 1880e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Type, 1890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int64_t Addend) { 1900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev switch (Type) { 1910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev default: 1920e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev llvm_unreachable("Relocation type not implemented yet!"); 1930e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 194a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_X86_64_64: { 1950e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t *Target = (uint64_t*)(LocalAddress); 1960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *Target = Value + Addend; 197a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 198a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 199a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_X86_64_32: 200a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_X86_64_32S: { 2010e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value += Addend; 202d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor assert((Type == ELF::R_X86_64_32 && (Value <= UINT32_MAX)) || 203d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor (Type == ELF::R_X86_64_32S && 204d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor ((int64_t)Value <= INT32_MAX && (int64_t)Value >= INT32_MIN))); 205a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky uint32_t TruncatedAddr = (Value & 0xFFFFFFFF); 2060e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t *Target = reinterpret_cast<uint32_t*>(LocalAddress); 207a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky *Target = TruncatedAddr; 208a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 209a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 210a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_X86_64_PC32: { 2110e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t *Placeholder = reinterpret_cast<uint32_t*>(LocalAddress); 2120e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int64_t RealOffset = *Placeholder + Value + Addend - FinalAddress; 213d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN); 2140e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int32_t TruncOffset = (RealOffset & 0xFFFFFFFF); 215a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky *Placeholder = TruncOffset; 216a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 217a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 218a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 219a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 220a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 2210e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveX86Relocation(uint8_t *LocalAddress, 2220e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t FinalAddress, 2230e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Value, 2240e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Type, 2250e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int32_t Addend) { 2260e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev switch (Type) { 227a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_386_32: { 2280e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t *Target = (uint32_t*)(LocalAddress); 229c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd uint32_t Placeholder = *Target; 230c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd *Target = Placeholder + Value + Addend; 231a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 232a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 233a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case ELF::R_386_PC32: { 2340e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t *Placeholder = reinterpret_cast<uint32_t*>(LocalAddress); 2350e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t RealOffset = *Placeholder + Value + Addend - FinalAddress; 236a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky *Placeholder = RealOffset; 237a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 238a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 239a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky default: 240a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky // There are other relocation types, but it appears these are the 241e2e73bd044eca405076a127e87d68d91f0fcb4b9Andrew Kaylor // only ones currently used by the LLVM ELF object writer 242858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper llvm_unreachable("Relocation type not implemented yet!"); 2430e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 244a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 245a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 246a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 2470e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveARMRelocation(uint8_t *LocalAddress, 2480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t FinalAddress, 2490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Value, 2500e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Type, 2510e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int32_t Addend) { 2520e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // TODO: Add Thumb relocations. 2530e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t* TargetPtr = (uint32_t*)LocalAddress; 2540e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value += Addend; 2550e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2560e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "resolveARMRelocation, LocalAddress: " << LocalAddress 2570e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " FinalAddress: " << format("%p",FinalAddress) 2580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Value: " << format("%x",Value) 2590e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Type: " << format("%x",Type) 2600e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Addend: " << format("%x",Addend) 2610e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << "\n"); 2620e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2630e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev switch(Type) { 2640e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev default: 2650e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev llvm_unreachable("Not implemented relocation type!"); 2660e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2670e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Just write 32bit value to relocation address 2680e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_ABS32 : 2690e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr = Value; 2700e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 2710e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2720e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Write first 16 bit of 32 bit value to the mov instruction. 2730e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Last 4 bit should be shifted. 2740e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_MOVW_ABS_NC : 2750e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value = Value & 0xFFFF; 2760e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= Value & 0xFFF; 2770e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= ((Value >> 12) & 0xF) << 16; 2780e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 2790e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2800e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Write last 16 bit of 32 bit value to the mov instruction. 2810e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Last 4 bit should be shifted. 2820e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_MOVT_ABS : 2830e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value = (Value >> 16) & 0xFFFF; 2840e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= Value & 0xFFF; 2850e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= ((Value >> 12) & 0xF) << 16; 2860e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 2870e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 2880e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Write 24 bit relative value to the branch instruction. 2890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_PC24 : // Fall through. 2900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_CALL : // Fall through. 2910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case ELF::R_ARM_JUMP24 : 2920e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int32_t RelValue = static_cast<int32_t>(Value - FinalAddress - 8); 2930e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev RelValue = (RelValue & 0x03FFFFFC) >> 2; 2940e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr &= 0xFF000000; 2950e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev *TargetPtr |= RelValue; 2960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 2970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 298a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 299a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 300b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanakavoid RuntimeDyldELF::resolveMIPSRelocation(uint8_t *LocalAddress, 301b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka uint32_t FinalAddress, 302b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka uint32_t Value, 303b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka uint32_t Type, 304b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka int32_t Addend) { 305b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint32_t* TargetPtr = (uint32_t*)LocalAddress; 306b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Value += Addend; 307b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 308b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka DEBUG(dbgs() << "resolveMipselocation, LocalAddress: " << LocalAddress 309b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << " FinalAddress: " << format("%p",FinalAddress) 310b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << " Value: " << format("%x",Value) 311b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << " Type: " << format("%x",Type) 312b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << " Addend: " << format("%x",Addend) 313b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka << "\n"); 314b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 315b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka switch(Type) { 316b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka default: 317b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka llvm_unreachable("Not implemented relocation type!"); 318b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 319b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::R_MIPS_32: 320b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka *TargetPtr = Value + (*TargetPtr); 321b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 322b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::R_MIPS_26: 323b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka *TargetPtr = ((*TargetPtr) & 0xfc000000) | (( Value & 0x0fffffff) >> 2); 324b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 325b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::R_MIPS_HI16: 326b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Get the higher 16-bits. Also add 1 if bit 15 is 1. 327b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Value += ((*TargetPtr) & 0x0000ffff) << 16; 328b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka *TargetPtr = ((*TargetPtr) & 0xffff0000) | 329b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka (((Value + 0x8000) >> 16) & 0xffff); 330b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 331b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::R_MIPS_LO16: 332b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Value += ((*TargetPtr) & 0x0000ffff); 333b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka *TargetPtr = ((*TargetPtr) & 0xffff0000) | (Value & 0xffff); 334b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 335b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } 336b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka} 337b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 3380e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveRelocation(uint8_t *LocalAddress, 3390e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t FinalAddress, 3400e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint64_t Value, 3410e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t Type, 3420e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev int64_t Addend) { 343a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky switch (Arch) { 344a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case Triple::x86_64: 3450e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev resolveX86_64Relocation(LocalAddress, FinalAddress, Value, Type, Addend); 346a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 347a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky case Triple::x86: 3480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev resolveX86Relocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL), 3490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (uint32_t)(Value & 0xffffffffL), Type, 3500e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (uint32_t)(Addend & 0xffffffffL)); 351a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 3520e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case Triple::arm: // Fall through. 3530e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case Triple::thumb: 3540e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev resolveARMRelocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL), 3550e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (uint32_t)(Value & 0xffffffffL), Type, 3560e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (uint32_t)(Addend & 0xffffffffL)); 357a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky break; 358b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case Triple::mips: // Fall through. 359b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case Triple::mipsel: 360b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka resolveMIPSRelocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL), 361b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka (uint32_t)(Value & 0xffffffffL), Type, 362b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka (uint32_t)(Addend & 0xffffffffL)); 363b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka break; 364858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper default: llvm_unreachable("Unsupported CPU type!"); 365a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 366a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 367a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky 3680e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel, 369689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd ObjectImage &Obj, 3700e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev ObjSectionToIDMap &ObjSectionToID, 371d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky const SymbolTableMap &Symbols, 3720e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev StubMap &Stubs) { 3730e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 3740e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint32_t RelType = (uint32_t)(Rel.Type & 0xffffffffL); 3750e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev intptr_t Addend = (intptr_t)Rel.AdditionalInfo; 3760e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev const SymbolRef &Symbol = Rel.Symbol; 377c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky 378c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky // Obtain the symbol name which is referenced in the relocation 379c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky StringRef TargetName; 3800e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Symbol.getName(TargetName); 3810e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "\t\tRelType: " << RelType 3820e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Addend: " << Addend 3830e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " TargetName: " << TargetName 3840e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << "\n"); 385c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky RelocationValueRef Value; 386c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky // First search for the symbol in the local symbol table 387d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky SymbolTableMap::const_iterator lsi = Symbols.find(TargetName.data()); 3880e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev if (lsi != Symbols.end()) { 3890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.SectionID = lsi->second.first; 3900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.Addend = lsi->second.second; 3910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } else { 392c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky // Search for the symbol in the global symbol table 393d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky SymbolTableMap::const_iterator gsi = 394d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky GlobalSymbolTable.find(TargetName.data()); 395d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky if (gsi != GlobalSymbolTable.end()) { 3960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.SectionID = gsi->second.first; 3970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.Addend = gsi->second.second; 3980e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } else { 3990e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev SymbolRef::Type SymType; 4000e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Symbol.getType(SymType); 4010e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev switch (SymType) { 4020e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case SymbolRef::ST_Debug: { 4030e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // TODO: Now ELF SymbolRef::ST_Debug = STT_SECTION, it's not obviously 4040e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // and can be changed by another developers. Maybe best way is add 4050e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // a new symbol type ST_Section to SymbolRef and use it. 406c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky section_iterator si(Obj.end_sections()); 4070e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Symbol.getSection(si); 4080e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev if (si == Obj.end_sections()) 4090e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev llvm_unreachable("Symbol section not found, bad object file format!"); 4100e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "\t\tThis is section symbol\n"); 411689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd Value.SectionID = findOrEmitSection(Obj, (*si), true, ObjSectionToID); 4120e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.Addend = Addend; 4130e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 4140e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 4150e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev case SymbolRef::ST_Unknown: { 4160e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.SymbolName = TargetName.data(); 4170e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Value.Addend = Addend; 4180e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 4190e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 4200e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev default: 4210e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev llvm_unreachable("Unresolved symbol type!"); 4220e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev break; 4230e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 4240e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 425a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky } 4260e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "\t\tRel.SectionID: " << Rel.SectionID 4270e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << " Rel.Offset: " << Rel.Offset 4280e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev << "\n"); 4290e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev if (Arch == Triple::arm && 4300e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev (RelType == ELF::R_ARM_PC24 || 4310e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev RelType == ELF::R_ARM_CALL || 4320e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev RelType == ELF::R_ARM_JUMP24)) { 4330e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // This is an ARM branch relocation, need to use a stub function. 4340e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << "\t\tThis is an ARM branch relocation."); 4350e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev SectionEntry &Section = Sections[Rel.SectionID]; 4360e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint8_t *Target = Section.Address + Rel.Offset; 4370e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev 4380e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Look up for existing stub. 4390e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev StubMap::const_iterator i = Stubs.find(Value); 4400e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev if (i != Stubs.end()) { 441ab427334f54fed51ed721672a6d0fd1ca0802dd4Danil Malyshev resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address + 4420e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev i->second, RelType, 0); 4430e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << " Stub function found\n"); 4440e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } else { 4450e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev // Create a new stub function. 4460e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev DEBUG(dbgs() << " Create a new stub function\n"); 4470e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Stubs[Value] = Section.StubOffset; 4480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev uint8_t *StubTargetAddr = createStubFunction(Section.Address + 4490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Section.StubOffset); 450c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky RelocationEntry RE(Rel.SectionID, StubTargetAddr - Section.Address, 451c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky ELF::R_ARM_ABS32, Value.Addend); 452c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky if (Value.SymbolName) 453c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky addRelocationForSymbol(RE, Value.SymbolName); 454c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky else 455c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky addRelocationForSection(RE, Value.SectionID); 456c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky 457ab427334f54fed51ed721672a6d0fd1ca0802dd4Danil Malyshev resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address + 4580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Section.StubOffset, RelType, 0); 4590e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev Section.StubOffset += getMaxStubSize(); 4600e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev } 461b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } else if (Arch == Triple::mipsel && RelType == ELF::R_MIPS_26) { 462b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // This is an Mips branch relocation, need to use a stub function. 463b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka DEBUG(dbgs() << "\t\tThis is a Mips branch relocation."); 464b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka SectionEntry &Section = Sections[Rel.SectionID]; 465b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint8_t *Target = Section.Address + Rel.Offset; 466b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint32_t *TargetAddress = (uint32_t *)Target; 467b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 468b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Extract the addend from the instruction. 469b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint32_t Addend = ((*TargetAddress) & 0x03ffffff) << 2; 470b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 471b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Value.Addend += Addend; 472b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 473b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Look up for existing stub. 474b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka StubMap::const_iterator i = Stubs.find(Value); 475b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka if (i != Stubs.end()) { 476b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka resolveRelocation(Target, (uint64_t)Target, 477b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka (uint64_t)Section.Address + 478b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka i->second, RelType, 0); 479b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka DEBUG(dbgs() << " Stub function found\n"); 480b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } else { 481b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Create a new stub function. 482b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka DEBUG(dbgs() << " Create a new stub function\n"); 483b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Stubs[Value] = Section.StubOffset; 484b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka uint8_t *StubTargetAddr = createStubFunction(Section.Address + 485b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Section.StubOffset); 486b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 487b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka // Creating Hi and Lo relocations for the filled stub instructions. 488b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka RelocationEntry REHi(Rel.SectionID, 489b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka StubTargetAddr - Section.Address, 490b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka ELF::R_MIPS_HI16, Value.Addend); 491b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka RelocationEntry RELo(Rel.SectionID, 492b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka StubTargetAddr - Section.Address + 4, 493b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka ELF::R_MIPS_LO16, Value.Addend); 494b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 495b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka if (Value.SymbolName) { 496b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka addRelocationForSymbol(REHi, Value.SymbolName); 497b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka addRelocationForSymbol(RELo, Value.SymbolName); 498b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } else { 499b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka addRelocationForSection(REHi, Value.SectionID); 500b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka addRelocationForSection(RELo, Value.SectionID); 501b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } 502b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka 503b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka resolveRelocation(Target, (uint64_t)Target, 504b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka (uint64_t)Section.Address + 505b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Section.StubOffset, RelType, 0); 506b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Section.StubOffset += getMaxStubSize(); 507b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka } 508c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky } else { 509c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky RelocationEntry RE(Rel.SectionID, Rel.Offset, RelType, Value.Addend); 510c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky if (Value.SymbolName) 511c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky addRelocationForSymbol(RE, Value.SymbolName); 512c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky else 513c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky addRelocationForSection(RE, Value.SectionID); 514c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky } 51561425c0a7f4e3608a85f7bbf254cd052a15b7446Jim Grosbach} 51661425c0a7f4e3608a85f7bbf254cd052a15b7446Jim Grosbach 5173f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylorbool RuntimeDyldELF::isCompatibleFormat(const ObjectBuffer *Buffer) const { 5183f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor if (Buffer->getBufferSize() < strlen(ELF::ElfMagic)) 5193f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor return false; 5203f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor return (memcmp(Buffer->getBufferStart(), ELF::ElfMagic, strlen(ELF::ElfMagic))) == 0; 521a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} 522a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} // namespace llvm 523