ELF.h revision bcb1ea8ef62fba49d0e634e1943f829687323314
1f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky//===- ELF.h - ELF object file implementation -------------------*- C++ -*-===// 2f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// 3f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// The LLVM Compiler Infrastructure 4f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// 5f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// This file is distributed under the University of Illinois Open Source 6f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// License. See LICENSE.TXT for details. 7f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// 8f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky//===----------------------------------------------------------------------===// 9f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// 10f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// This file declares the ELFObjectFile template class. 11f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// 12f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky//===----------------------------------------------------------------------===// 13f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 14f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#ifndef LLVM_OBJECT_ELF_H 15f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#define LLVM_OBJECT_ELF_H 16f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 17255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/DenseMap.h" 18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/PointerIntPair.h" 19f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/ADT/SmallVector.h" 20f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/ADT/StringSwitch.h" 21f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/ADT/Triple.h" 22f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/Object/ObjectFile.h" 23f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/Support/Casting.h" 24f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/Support/ELF.h" 25f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/Support/Endian.h" 26f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/Support/ErrorHandling.h" 27f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/Support/MemoryBuffer.h" 28f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include "llvm/Support/raw_ostream.h" 29f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include <algorithm> 30f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include <limits> 31f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#include <utility> 32f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 33f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskynamespace llvm { 34f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskynamespace object { 35f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 364d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencerusing support::endianness; 374d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer 38ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<endianness target_endianness, std::size_t max_alignment, bool is64Bits> 39ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerstruct ELFType { 406623730296fbe6d639058195772566ffa10e9ad2Dmitri Gribenko static const endianness TargetEndianness = target_endianness; 416623730296fbe6d639058195772566ffa10e9ad2Dmitri Gribenko static const std::size_t MaxAlignment = max_alignment; 426623730296fbe6d639058195772566ffa10e9ad2Dmitri Gribenko static const bool Is64Bits = is64Bits; 43ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer}; 44ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer 4522f3b40d0bd18f2ad092398d18195c20ceeb1befEric Christophertemplate<typename T, int max_align> 464d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencerstruct MaximumAlignment { 474d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer enum {value = AlignOf<T>::Alignment > max_align ? max_align 484d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer : AlignOf<T>::Alignment}; 494d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer}; 504d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer 51689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd// Subclasses of ELFObjectFile may need this for template instantiation 52689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdinline std::pair<unsigned char, unsigned char> 53689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdgetElfArchType(MemoryBuffer *Object) { 54689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd if (Object->getBufferSize() < ELF::EI_NIDENT) 55689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE); 56dab867ebbae63821685e301fc126e41a4712984bEric Christopher return std::make_pair((uint8_t) Object->getBufferStart()[ELF::EI_CLASS], 57dab867ebbae63821685e301fc126e41a4712984bEric Christopher (uint8_t) Object->getBufferStart()[ELF::EI_DATA]); 58689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} 59689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd 60f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// Templates to choose Elf_Addr and Elf_Off depending on is64Bits. 614d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencertemplate<endianness target_endianness, std::size_t max_alignment> 62f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskystruct ELFDataTypeTypedefHelperCommon { 63f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 644d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer <uint16_t, target_endianness, 654d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer MaximumAlignment<uint16_t, max_alignment>::value> Elf_Half; 66f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 674d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer <uint32_t, target_endianness, 684d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer MaximumAlignment<uint32_t, max_alignment>::value> Elf_Word; 69f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 704d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer <int32_t, target_endianness, 714d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer MaximumAlignment<int32_t, max_alignment>::value> Elf_Sword; 72f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 734d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer <uint64_t, target_endianness, 744d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer MaximumAlignment<uint64_t, max_alignment>::value> Elf_Xword; 75f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 764d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer <int64_t, target_endianness, 774d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer MaximumAlignment<int64_t, max_alignment>::value> Elf_Sxword; 78f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 79f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 80ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 81f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskystruct ELFDataTypeTypedefHelper; 82f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 83f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky/// ELF 32bit types. 8443239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 8543239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct ELFDataTypeTypedefHelper<ELFType<TargetEndianness, MaxAlign, false> > 86ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer : ELFDataTypeTypedefHelperCommon<TargetEndianness, MaxAlign> { 87f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef uint32_t value_type; 88f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 89ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer <value_type, TargetEndianness, 90ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer MaximumAlignment<value_type, MaxAlign>::value> Elf_Addr; 91f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 92ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer <value_type, TargetEndianness, 93ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer MaximumAlignment<value_type, MaxAlign>::value> Elf_Off; 94f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 95f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 96f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky/// ELF 64bit types. 9743239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 9843239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct ELFDataTypeTypedefHelper<ELFType<TargetEndianness, MaxAlign, true> > 99ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer : ELFDataTypeTypedefHelperCommon<TargetEndianness, MaxAlign> { 100f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef uint64_t value_type; 101f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 102ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer <value_type, TargetEndianness, 103ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer MaximumAlignment<value_type, MaxAlign>::value> Elf_Addr; 104f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky typedef support::detail::packed_endian_specific_integral 105ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer <value_type, TargetEndianness, 106ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer MaximumAlignment<value_type, MaxAlign>::value> Elf_Off; 107f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 108f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 109f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// I really don't like doing this, but the alternative is copypasta. 11043239078adac6f32315cadbef9709f2f0f499707Rafael Espindola#define LLVM_ELF_IMPORT_TYPES(E, M, W) \ 11143239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatypedef typename ELFDataTypeTypedefHelper<ELFType<E,M,W> >::Elf_Addr Elf_Addr; \ 11243239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatypedef typename ELFDataTypeTypedefHelper<ELFType<E,M,W> >::Elf_Off Elf_Off; \ 11343239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatypedef typename ELFDataTypeTypedefHelper<ELFType<E,M,W> >::Elf_Half Elf_Half; \ 11443239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatypedef typename ELFDataTypeTypedefHelper<ELFType<E,M,W> >::Elf_Word Elf_Word; \ 11543239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatypedef typename \ 11643239078adac6f32315cadbef9709f2f0f499707Rafael Espindola ELFDataTypeTypedefHelper<ELFType<E,M,W> >::Elf_Sword Elf_Sword; \ 11743239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatypedef typename \ 11843239078adac6f32315cadbef9709f2f0f499707Rafael Espindola ELFDataTypeTypedefHelper<ELFType<E,M,W> >::Elf_Xword Elf_Xword; \ 11943239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatypedef typename \ 12043239078adac6f32315cadbef9709f2f0f499707Rafael Espindola ELFDataTypeTypedefHelper<ELFType<E,M,W> >::Elf_Sxword Elf_Sxword; 12143239078adac6f32315cadbef9709f2f0f499707Rafael Espindola 12243239078adac6f32315cadbef9709f2f0f499707Rafael Espindola#define LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) \ 12343239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(ELFT::TargetEndianness, ELFT::MaxAlignment, \ 12443239078adac6f32315cadbef9709f2f0f499707Rafael Espindola ELFT::Is64Bits) 12543239078adac6f32315cadbef9709f2f0f499707Rafael Espindola 12643239078adac6f32315cadbef9709f2f0f499707Rafael Espindola// Section header. 127ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 128f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskystruct Elf_Shdr_Base; 129f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 13043239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 13143239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Shdr_Base<ELFType<TargetEndianness, MaxAlign, false> > { 13243239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, false) 133f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_name; // Section name (index into string table) 134f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_type; // Section type (SHT_*) 135f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_flags; // Section flags (SHF_*) 136f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Addr sh_addr; // Address where section is to be loaded 137f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Off sh_offset; // File offset of section data, in bytes 138f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_size; // Size of section, in bytes 139f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_link; // Section type-specific header table index link 140f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_info; // Section type-specific extra information 141f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_addralign;// Section address alignment 142f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_entsize; // Size of records contained within the section 143f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 144f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 14543239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 14643239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Shdr_Base<ELFType<TargetEndianness, MaxAlign, true> > { 14743239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, true) 148f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_name; // Section name (index into string table) 149f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_type; // Section type (SHT_*) 150f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Xword sh_flags; // Section flags (SHF_*) 151f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Addr sh_addr; // Address where section is to be loaded 152f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Off sh_offset; // File offset of section data, in bytes 153f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Xword sh_size; // Size of section, in bytes 154f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_link; // Section type-specific header table index link 155f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word sh_info; // Section type-specific extra information 156f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Xword sh_addralign;// Section address alignment 157f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Xword sh_entsize; // Size of records contained within the section 158f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 159f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 160ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 161ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerstruct Elf_Shdr_Impl : Elf_Shdr_Base<ELFT> { 162ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer using Elf_Shdr_Base<ELFT>::sh_entsize; 163ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer using Elf_Shdr_Base<ELFT>::sh_size; 164f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 165f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky /// @brief Get the number of entities this section contains if it has any. 166f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky unsigned getEntityCount() const { 167f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (sh_entsize == 0) 168f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return 0; 169f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return sh_size / sh_entsize; 170f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 171f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 172f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 173ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 174f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskystruct Elf_Sym_Base; 175f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 17643239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 17743239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Sym_Base<ELFType<TargetEndianness, MaxAlign, false> > { 17843239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, false) 179f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word st_name; // Symbol name (index into string table) 180f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Addr st_value; // Value or address associated with the symbol 181f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word st_size; // Size of the symbol 182f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky unsigned char st_info; // Symbol's type and binding attributes 183f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky unsigned char st_other; // Must be zero; reserved 184f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Half st_shndx; // Which section (header table index) it's defined in 185f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 186f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 18743239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 18843239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Sym_Base<ELFType<TargetEndianness, MaxAlign, true> > { 18943239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, true) 190f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Word st_name; // Symbol name (index into string table) 191f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky unsigned char st_info; // Symbol's type and binding attributes 192f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky unsigned char st_other; // Must be zero; reserved 193f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Half st_shndx; // Which section (header table index) it's defined in 194f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Addr st_value; // Value or address associated with the symbol 195f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Elf_Xword st_size; // Size of the symbol 196f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 197f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 198ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 199ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerstruct Elf_Sym_Impl : Elf_Sym_Base<ELFT> { 200ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer using Elf_Sym_Base<ELFT>::st_info; 201f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 202f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // These accessors and mutators correspond to the ELF32_ST_BIND, 203f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // ELF32_ST_TYPE, and ELF32_ST_INFO macros defined in the ELF specification: 204f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky unsigned char getBinding() const { return st_info >> 4; } 205f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky unsigned char getType() const { return st_info & 0x0f; } 206f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky void setBinding(unsigned char b) { setBindingAndType(b, getType()); } 207f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky void setType(unsigned char t) { setBindingAndType(getBinding(), t); } 208f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky void setBindingAndType(unsigned char b, unsigned char t) { 209f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky st_info = (b << 4) + (t & 0x0f); 210f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 211f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 212f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2132d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// Elf_Versym: This is the structure of entries in the SHT_GNU_versym section 2142d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// (.gnu.version). This structure is identical for ELF32 and ELF64. 215ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2162d70e263c2b508bf4641273dd89a23149f6f6164David Meyerstruct Elf_Versym_Impl { 21743239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 2182d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vs_index; // Version index with flags (e.g. VERSYM_HIDDEN) 2192d70e263c2b508bf4641273dd89a23149f6f6164David Meyer}; 2202d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 221ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2222d70e263c2b508bf4641273dd89a23149f6f6164David Meyerstruct Elf_Verdaux_Impl; 2232d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 2242d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// Elf_Verdef: This is the structure of entries in the SHT_GNU_verdef section 2252d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// (.gnu.version_d). This structure is identical for ELF32 and ELF64. 226ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2272d70e263c2b508bf4641273dd89a23149f6f6164David Meyerstruct Elf_Verdef_Impl { 22843239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 229ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer typedef Elf_Verdaux_Impl<ELFT> Elf_Verdaux; 2302d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vd_version; // Version of this structure (e.g. VER_DEF_CURRENT) 2312d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vd_flags; // Bitwise flags (VER_DEF_*) 2322d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vd_ndx; // Version index, used in .gnu.version entries 2332d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vd_cnt; // Number of Verdaux entries 2342d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vd_hash; // Hash of name 2352d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vd_aux; // Offset to the first Verdaux entry (in bytes) 2362d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vd_next; // Offset to the next Verdef entry (in bytes) 2372d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 2382d70e263c2b508bf4641273dd89a23149f6f6164David Meyer /// Get the first Verdaux entry for this Verdef. 2392d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Verdaux *getAux() const { 2402d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return reinterpret_cast<const Elf_Verdaux*>((const char*)this + vd_aux); 2412d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 2422d70e263c2b508bf4641273dd89a23149f6f6164David Meyer}; 2432d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 244d9b0b025612992a0b724eeca8bdf10b1d7a5c355Benjamin Kramer/// Elf_Verdaux: This is the structure of auxiliary data in the SHT_GNU_verdef 2452d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// section (.gnu.version_d). This structure is identical for ELF32 and ELF64. 246ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2472d70e263c2b508bf4641273dd89a23149f6f6164David Meyerstruct Elf_Verdaux_Impl { 24843239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 2492d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vda_name; // Version name (offset in string table) 2502d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vda_next; // Offset to next Verdaux entry (in bytes) 2512d70e263c2b508bf4641273dd89a23149f6f6164David Meyer}; 2522d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 2532d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// Elf_Verneed: This is the structure of entries in the SHT_GNU_verneed 2542d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// section (.gnu.version_r). This structure is identical for ELF32 and ELF64. 255ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2562d70e263c2b508bf4641273dd89a23149f6f6164David Meyerstruct Elf_Verneed_Impl { 25743239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 2582d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vn_version; // Version of this structure (e.g. VER_NEED_CURRENT) 2592d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vn_cnt; // Number of associated Vernaux entries 2602d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vn_file; // Library name (string table offset) 2612d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vn_aux; // Offset to first Vernaux entry (in bytes) 2622d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vn_next; // Offset to next Verneed entry (in bytes) 2632d70e263c2b508bf4641273dd89a23149f6f6164David Meyer}; 2642d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 2652d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// Elf_Vernaux: This is the structure of auxiliary data in SHT_GNU_verneed 2662d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// section (.gnu.version_r). This structure is identical for ELF32 and ELF64. 267ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2682d70e263c2b508bf4641273dd89a23149f6f6164David Meyerstruct Elf_Vernaux_Impl { 26943239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 2702d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vna_hash; // Hash of dependency name 2712d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vna_flags; // Bitwise Flags (VER_FLAG_*) 2722d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Half vna_other; // Version index, used in .gnu.version entries 2732d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vna_name; // Dependency name 2742d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Elf_Word vna_next; // Offset to next Vernaux entry (in bytes) 2752d70e263c2b508bf4641273dd89a23149f6f6164David Meyer}; 2762d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 2772d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// Elf_Dyn_Base: This structure matches the form of entries in the dynamic 2782d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// table section (.dynamic) look like. 279ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2805c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerstruct Elf_Dyn_Base; 2815c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 28243239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 28343239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Dyn_Base<ELFType<TargetEndianness, MaxAlign, false> > { 28443239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, false) 2855c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer Elf_Sword d_tag; 2865c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer union { 2875c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer Elf_Word d_val; 2885c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer Elf_Addr d_ptr; 2895c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer } d_un; 2905c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}; 2915c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 29243239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 29343239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Dyn_Base<ELFType<TargetEndianness, MaxAlign, true> > { 29443239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, true) 2955c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer Elf_Sxword d_tag; 2965c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer union { 2975c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer Elf_Xword d_val; 2985c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer Elf_Addr d_ptr; 2995c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer } d_un; 3005c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}; 3015c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 3022d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// Elf_Dyn_Impl: This inherits from Elf_Dyn_Base, adding getters and setters. 303ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 304ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerstruct Elf_Dyn_Impl : Elf_Dyn_Base<ELFT> { 305ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer using Elf_Dyn_Base<ELFT>::d_tag; 306ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer using Elf_Dyn_Base<ELFT>::d_un; 3075c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer int64_t getTag() const { return d_tag; } 3085c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer uint64_t getVal() const { return d_un.d_val; } 3095c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer uint64_t getPtr() const { return d_un.ptr; } 3105c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}; 3115c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 3125c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// Elf_Rel: Elf Relocation 313ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT, bool isRela> 314f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskystruct Elf_Rel_Base; 315f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 31643239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 31743239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Rel_Base<ELFType<TargetEndianness, MaxAlign, false>, false> { 31843239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, false) 319dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Addr r_offset; // Location (file byte offset, or program virtual addr) 320dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Word r_info; // Symbol table index and type of relocation to apply 321d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola 322d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint32_t getRInfo(bool isMips64EL) const { 323d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola assert(!isMips64EL); 324d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return r_info; 325d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 326d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola void setRInfo(uint32_t R) { 327d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola r_info = R; 328d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 329f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 330f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 33143239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 33243239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Rel_Base<ELFType<TargetEndianness, MaxAlign, true>, false> { 33343239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, true) 334dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Addr r_offset; // Location (file byte offset, or program virtual addr) 335dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Xword r_info; // Symbol table index and type of relocation to apply 336d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola 337d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint64_t getRInfo(bool isMips64EL) const { 338d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint64_t t = r_info; 339d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola if (!isMips64EL) 340d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return t; 341dab867ebbae63821685e301fc126e41a4712984bEric Christopher // Mips64 little endian has a "special" encoding of r_info. Instead of one 342dab867ebbae63821685e301fc126e41a4712984bEric Christopher // 64 bit little endian number, it is a little endian 32 bit number followed 343d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola // by a 32 bit big endian number. 344d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return (t << 32) | ((t >> 8) & 0xff000000) | ((t >> 24) & 0x00ff0000) | 345d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola ((t >> 40) & 0x0000ff00) | ((t >> 56) & 0x000000ff); 346d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 347d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola void setRInfo(uint64_t R) { 348d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola // FIXME: Add mips64el support. 349d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola r_info = R; 350d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 351f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 352f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 35343239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 35443239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Rel_Base<ELFType<TargetEndianness, MaxAlign, false>, true> { 35543239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, false) 356dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Addr r_offset; // Location (file byte offset, or program virtual addr) 357dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Word r_info; // Symbol table index and type of relocation to apply 358dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Sword r_addend; // Compute value for relocatable field by adding this 359d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola 360d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint32_t getRInfo(bool isMips64EL) const { 361d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola assert(!isMips64EL); 362d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return r_info; 363d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 364d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola void setRInfo(uint32_t R) { 365d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola r_info = R; 366d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 367f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 368f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 36943239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 37043239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Rel_Base<ELFType<TargetEndianness, MaxAlign, true>, true> { 37143239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, true) 372dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Addr r_offset; // Location (file byte offset, or program virtual addr) 373dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Xword r_info; // Symbol table index and type of relocation to apply 374dab867ebbae63821685e301fc126e41a4712984bEric Christopher Elf_Sxword r_addend; // Compute value for relocatable field by adding this. 375d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola 376d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint64_t getRInfo(bool isMips64EL) const { 377dab867ebbae63821685e301fc126e41a4712984bEric Christopher // Mips64 little endian has a "special" encoding of r_info. Instead of one 378dab867ebbae63821685e301fc126e41a4712984bEric Christopher // 64 bit little endian number, it is a little endian 32 bit number followed 379d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola // by a 32 bit big endian number. 380d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint64_t t = r_info; 381d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola if (!isMips64EL) 382d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return t; 383d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return (t << 32) | ((t >> 8) & 0xff000000) | ((t >> 24) & 0x00ff0000) | 384d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola ((t >> 40) & 0x0000ff00) | ((t >> 56) & 0x000000ff); 385d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 386d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola void setRInfo(uint64_t R) { 387d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola // FIXME: Add mips64el support. 388d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola r_info = R; 389d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 390f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 391f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 392ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT, bool isRela> 393f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskystruct Elf_Rel_Impl; 394f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 39543239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign, bool isRela> 39643239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Rel_Impl<ELFType<TargetEndianness, MaxAlign, true>, isRela> 39743239078adac6f32315cadbef9709f2f0f499707Rafael Espindola : Elf_Rel_Base<ELFType<TargetEndianness, MaxAlign, true>, isRela> { 39843239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, true) 399f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 400f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // These accessors and mutators correspond to the ELF64_R_SYM, ELF64_R_TYPE, 401f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // and ELF64_R_INFO macros defined in the ELF specification: 402d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint32_t getSymbol(bool isMips64EL) const { 403d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return (uint32_t) (this->getRInfo(isMips64EL) >> 32); 404d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 405d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint32_t getType(bool isMips64EL) const { 406d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return (uint32_t) (this->getRInfo(isMips64EL) & 0xffffffffL); 407f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 4080b740236b71f0f3811421885c04cc43130f88befTim Northover void setSymbol(uint32_t s) { setSymbolAndType(s, getType()); } 4090b740236b71f0f3811421885c04cc43130f88befTim Northover void setType(uint32_t t) { setSymbolAndType(getSymbol(), t); } 4100b740236b71f0f3811421885c04cc43130f88befTim Northover void setSymbolAndType(uint32_t s, uint32_t t) { 411d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola this->setRInfo(((uint64_t)s << 32) + (t&0xffffffffL)); 412f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 413f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 414f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 41543239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign, bool isRela> 41643239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Rel_Impl<ELFType<TargetEndianness, MaxAlign, false>, isRela> 41743239078adac6f32315cadbef9709f2f0f499707Rafael Espindola : Elf_Rel_Base<ELFType<TargetEndianness, MaxAlign, false>, isRela> { 41843239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, false) 419f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 420f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, 421f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // and ELF32_R_INFO macros defined in the ELF specification: 422d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola uint32_t getSymbol(bool isMips64EL) const { 423d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return this->getRInfo(isMips64EL) >> 8; 424d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 425d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola unsigned char getType(bool isMips64EL) const { 426d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return (unsigned char) (this->getRInfo(isMips64EL) & 0x0ff); 427d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 428f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky void setSymbol(uint32_t s) { setSymbolAndType(s, getType()); } 429f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 430f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky void setSymbolAndType(uint32_t s, unsigned char t) { 431d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola this->setRInfo((s << 8) + t); 432f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 433f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 434f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 435ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 4362c38a6615a693d0a43159825da2358126473502bMichael J. Spencerstruct Elf_Ehdr_Impl { 43743239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 4382c38a6615a693d0a43159825da2358126473502bMichael J. Spencer unsigned char e_ident[ELF::EI_NIDENT]; // ELF Identification bytes 4392c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Half e_type; // Type of file (see ET_*) 4402c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Half e_machine; // Required architecture for this file (see EM_*) 4412c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Word e_version; // Must be equal to 1 4422c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Addr e_entry; // Address to jump to in order to start program 4432c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Off e_phoff; // Program header table's file offset, in bytes 4442c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Off e_shoff; // Section header table's file offset, in bytes 4452c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Word e_flags; // Processor-specific flags 4462c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Half e_ehsize; // Size of ELF header, in bytes 4472c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Half e_phentsize;// Size of an entry in the program header table 4482c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Half e_phnum; // Number of entries in the program header table 4492c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Half e_shentsize;// Size of an entry in the section header table 4502c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Half e_shnum; // Number of entries in the section header table 4512c38a6615a693d0a43159825da2358126473502bMichael J. Spencer Elf_Half e_shstrndx; // Section header table index of section name 4522c38a6615a693d0a43159825da2358126473502bMichael J. Spencer // string table 4532c38a6615a693d0a43159825da2358126473502bMichael J. Spencer bool checkMagic() const { 4542c38a6615a693d0a43159825da2358126473502bMichael J. Spencer return (memcmp(e_ident, ELF::ElfMagic, strlen(ELF::ElfMagic))) == 0; 4552c38a6615a693d0a43159825da2358126473502bMichael J. Spencer } 4562c38a6615a693d0a43159825da2358126473502bMichael J. Spencer unsigned char getFileClass() const { return e_ident[ELF::EI_CLASS]; } 4572c38a6615a693d0a43159825da2358126473502bMichael J. Spencer unsigned char getDataEncoding() const { return e_ident[ELF::EI_DATA]; } 4582c38a6615a693d0a43159825da2358126473502bMichael J. Spencer}; 459f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 460ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 4613e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencerstruct Elf_Phdr_Impl; 462a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni 46343239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 46443239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Phdr_Impl<ELFType<TargetEndianness, MaxAlign, false> > { 46543239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, false) 466a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Word p_type; // Type of segment 467a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Off p_offset; // FileOffset where segment is located, in bytes 4684d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer Elf_Addr p_vaddr; // Virtual Address of beginning of segment 469a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Addr p_paddr; // Physical address of beginning of segment (OS-specific) 470a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Word p_filesz; // Num. of bytes in file image of segment (may be zero) 471a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Word p_memsz; // Num. of bytes in mem image of segment (may be zero) 472a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Word p_flags; // Segment flags 473a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Word p_align; // Segment alignment constraint 474a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni}; 475a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni 47643239078adac6f32315cadbef9709f2f0f499707Rafael Espindolatemplate<endianness TargetEndianness, std::size_t MaxAlign> 47743239078adac6f32315cadbef9709f2f0f499707Rafael Espindolastruct Elf_Phdr_Impl<ELFType<TargetEndianness, MaxAlign, true> > { 47843239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, true) 479a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Word p_type; // Type of segment 480a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Word p_flags; // Segment flags 481a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Off p_offset; // FileOffset where segment is located, in bytes 4824d9c5397b4a3be747bdb73f1d24c3fdbaaf438feMichael J. Spencer Elf_Addr p_vaddr; // Virtual Address of beginning of segment 483a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni Elf_Addr p_paddr; // Physical address of beginning of segment (OS-specific) 48495abfbe8e9567e08188ada7d29f589f08e539bd6Michael J. Spencer Elf_Xword p_filesz; // Num. of bytes in file image of segment (may be zero) 48595abfbe8e9567e08188ada7d29f589f08e539bd6Michael J. Spencer Elf_Xword p_memsz; // Num. of bytes in mem image of segment (may be zero) 48695abfbe8e9567e08188ada7d29f589f08e539bd6Michael J. Spencer Elf_Xword p_align; // Segment alignment constraint 487a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni}; 488a06fd990543c82c4cc735354914ae4be64eb83d6Hemant Kulkarni 489ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 490f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskyclass ELFObjectFile : public ObjectFile { 49143239078adac6f32315cadbef9709f2f0f499707Rafael Espindola LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 492ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer 4939b7ca410621f6988b2d4203b90058dd4252848a8Sid Manningpublic: 494fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer /// \brief Iterate over constant sized entities. 495fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer template<class EntT> 496fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer class ELFEntityIterator { 4979b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning public: 498d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer typedef ptrdiff_t difference_type; 499fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer typedef EntT value_type; 500d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer typedef std::random_access_iterator_tag iterator_category; 5019b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning typedef value_type &reference; 5029b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning typedef value_type *pointer; 5039b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 5049b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning /// \brief Default construct iterator. 505fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer ELFEntityIterator() : EntitySize(0), Current(0) {} 506fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer ELFEntityIterator(uint64_t EntSize, const char *Start) 507fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer : EntitySize(EntSize) 5089b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning , Current(Start) {} 5099b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 5109b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning reference operator *() { 5119b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning assert(Current && "Attempted to dereference an invalid iterator!"); 512fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer return *reinterpret_cast<pointer>(Current); 5139b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning } 5149b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 5159b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning pointer operator ->() { 5169b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning assert(Current && "Attempted to dereference an invalid iterator!"); 517fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer return reinterpret_cast<pointer>(Current); 5189b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning } 5199b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 520fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer bool operator ==(const ELFEntityIterator &Other) { 521fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer return Current == Other.Current; 5229b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning } 5239b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 524fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer bool operator !=(const ELFEntityIterator &Other) { 5259b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning return !(*this == Other); 5269b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning } 5279b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 528fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer ELFEntityIterator &operator ++() { 5299b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning assert(Current && "Attempted to increment an invalid iterator!"); 530fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer Current += EntitySize; 5319b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning return *this; 5329b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning } 5339b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 534fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer ELFEntityIterator operator ++(int) { 535fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer ELFEntityIterator Tmp = *this; 5369b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning ++*this; 5379b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning return Tmp; 5389b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning } 5399b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 540d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer ELFEntityIterator &operator =(const ELFEntityIterator &Other) { 541d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer EntitySize = Other.EntitySize; 542d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer Current = Other.Current; 543d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer return *this; 544d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer } 545d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer 546d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer difference_type operator -(const ELFEntityIterator &Other) const { 547d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer assert(EntitySize == Other.EntitySize && 548d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer "Subtracting iterators of different EntitiySize!"); 549d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer return (Current - Other.Current) / EntitySize; 550d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer } 551d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer 552def0c1f756562601829364e3fca4bd1f0407316eMichael J. Spencer const char *get() const { return Current; } 553def0c1f756562601829364e3fca4bd1f0407316eMichael J. Spencer 5549b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning private: 555d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer uint64_t EntitySize; 5569b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning const char *Current; 5579b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning }; 5589b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 559945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Ehdr_Impl<ELFT> Elf_Ehdr; 560945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Shdr_Impl<ELFT> Elf_Shdr; 561945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Sym_Impl<ELFT> Elf_Sym; 562945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Dyn_Impl<ELFT> Elf_Dyn; 563945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Phdr_Impl<ELFT> Elf_Phdr; 564945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Rel_Impl<ELFT, false> Elf_Rel; 565945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Rel_Impl<ELFT, true> Elf_Rela; 566945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Verdef_Impl<ELFT> Elf_Verdef; 567945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Verdaux_Impl<ELFT> Elf_Verdaux; 568945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Verneed_Impl<ELFT> Elf_Verneed; 569945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Vernaux_Impl<ELFT> Elf_Vernaux; 570945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer typedef Elf_Versym_Impl<ELFT> Elf_Versym; 5712e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer typedef ELFEntityIterator<const Elf_Dyn> Elf_Dyn_iterator; 5722e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer typedef ELFEntityIterator<const Elf_Sym> Elf_Sym_iterator; 5732e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer typedef ELFEntityIterator<const Elf_Rela> Elf_Rela_Iter; 5742e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer typedef ELFEntityIterator<const Elf_Rel> Elf_Rel_Iter; 575945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer 576945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencerprotected: 577945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer // This flag is used for classof, to distinguish ELFObjectFile from 578945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer // its subclass. If more subclasses will be created, this flag will 579945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer // have to become an enum. 580945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer bool isDyldELFObject; 581945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer 582945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencerprivate: 583945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Ehdr *Header; 584945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Shdr *SectionHeaderTable; 585945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Shdr *dot_shstrtab_sec; // Section header string table. 586945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Shdr *dot_strtab_sec; // Symbol header string table. 587945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Shdr *dot_dynstr_sec; // Dynamic symbol string table. 588945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer 589bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola int SymbolTableIndex; 590bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola int DynamicSymbolTableIndex; 591945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer DenseMap<const Elf_Sym*, ELF::Elf64_Word> ExtendedSymbolTable; 592945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer 593945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Shdr *dot_dynamic_sec; // .dynamic 594945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Shdr *dot_gnu_version_sec; // .gnu.version 595945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Shdr *dot_gnu_version_r_sec; // .gnu.version_r 596945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer const Elf_Shdr *dot_gnu_version_d_sec; // .gnu.version_d 597945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer 598945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer // Pointer to SONAME entry in dynamic string table 599945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer // This is set the first time getLoadName is called. 600945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer mutable const char *dt_soname; 601945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer 602945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencerprivate: 603956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola uint64_t getROffset(DataRefImpl Rel) const; 604956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola 6052d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Records for each version index the corresponding Verdef or Vernaux entry. 6062d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // This is filled the first time LoadVersionMap() is called. 6072d70e263c2b508bf4641273dd89a23149f6f6164David Meyer class VersionMapEntry : public PointerIntPair<const void*, 1> { 6082d70e263c2b508bf4641273dd89a23149f6f6164David Meyer public: 6092d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // If the integer is 0, this is an Elf_Verdef*. 6102d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // If the integer is 1, this is an Elf_Vernaux*. 6112d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMapEntry() : PointerIntPair<const void*, 1>(NULL, 0) { } 6122d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMapEntry(const Elf_Verdef *verdef) 6132d70e263c2b508bf4641273dd89a23149f6f6164David Meyer : PointerIntPair<const void*, 1>(verdef, 0) { } 6142d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMapEntry(const Elf_Vernaux *vernaux) 6152d70e263c2b508bf4641273dd89a23149f6f6164David Meyer : PointerIntPair<const void*, 1>(vernaux, 1) { } 6162d70e263c2b508bf4641273dd89a23149f6f6164David Meyer bool isNull() const { return getPointer() == NULL; } 6172d70e263c2b508bf4641273dd89a23149f6f6164David Meyer bool isVerdef() const { return !isNull() && getInt() == 0; } 6182d70e263c2b508bf4641273dd89a23149f6f6164David Meyer bool isVernaux() const { return !isNull() && getInt() == 1; } 6192d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Verdef *getVerdef() const { 6202d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return isVerdef() ? (const Elf_Verdef*)getPointer() : NULL; 6212d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 6222d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Vernaux *getVernaux() const { 6232d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return isVernaux() ? (const Elf_Vernaux*)getPointer() : NULL; 6242d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 6252d70e263c2b508bf4641273dd89a23149f6f6164David Meyer }; 6262d70e263c2b508bf4641273dd89a23149f6f6164David Meyer mutable SmallVector<VersionMapEntry, 16> VersionMap; 6272d70e263c2b508bf4641273dd89a23149f6f6164David Meyer void LoadVersionDefs(const Elf_Shdr *sec) const; 6282d70e263c2b508bf4641273dd89a23149f6f6164David Meyer void LoadVersionNeeds(const Elf_Shdr *ec) const; 6292d70e263c2b508bf4641273dd89a23149f6f6164David Meyer void LoadVersionMap() const; 6302d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 631f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky /// @brief Get the relocation section that contains \a Rel. 632f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *getRelSection(DataRefImpl Rel) const { 6337486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola return getSection(Rel.d.a); 634f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 635f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 636d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencerpublic: 637f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky bool isRelocationHasAddend(DataRefImpl Rel) const; 638f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky template<typename T> 639bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola const T *getEntry(uint32_t Section, uint32_t Entry) const; 640f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky template<typename T> 641f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const T *getEntry(const Elf_Shdr *Section, uint32_t Entry) const; 642f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *getSection(DataRefImpl index) const; 643f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *getSection(uint32_t index) const; 644f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Rel *getRel(DataRefImpl Rel) const; 645f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Rela *getRela(DataRefImpl Rela) const; 646f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const char *getString(uint32_t section, uint32_t offset) const; 647f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const char *getString(const Elf_Shdr *section, uint32_t offset) const; 6482d70e263c2b508bf4641273dd89a23149f6f6164David Meyer error_code getSymbolVersion(const Elf_Shdr *section, 6492d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Sym *Symb, 6502d70e263c2b508bf4641273dd89a23149f6f6164David Meyer StringRef &Version, 6512d70e263c2b508bf4641273dd89a23149f6f6164David Meyer bool &IsDefault) const; 652dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer void VerifyStrTab(const Elf_Shdr *sh) const; 653f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 654f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskyprotected: 655dab867ebbae63821685e301fc126e41a4712984bEric Christopher const Elf_Sym *getSymbol(DataRefImpl Symb) const; // FIXME: Should be private? 656f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky void validateSymbol(DataRefImpl Symb) const; 657346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck StringRef getRelocationTypeName(uint32_t Type) const; 658f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 6595c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerpublic: 6609dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta error_code getSymbolName(const Elf_Shdr *section, 6619dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta const Elf_Sym *Symb, 6629dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta StringRef &Res) const; 6639dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta error_code getSectionName(const Elf_Shdr *section, 6649dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta StringRef &Res) const; 6655c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer const Elf_Dyn *getDyn(DataRefImpl DynData) const; 6662d70e263c2b508bf4641273dd89a23149f6f6164David Meyer error_code getSymbolVersion(SymbolRef Symb, StringRef &Version, 6672d70e263c2b508bf4641273dd89a23149f6f6164David Meyer bool &IsDefault) const; 668f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran uint64_t getSymbolIndex(const Elf_Sym *sym) const; 669167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola error_code getRelocationAddend(DataRefImpl Rel, int64_t &Res) const; 670f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskyprotected: 671f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; 672f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; 673f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const; 674f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; 67559a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola virtual error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const; 676f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 677f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const; 678c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const; 679dab867ebbae63821685e301fc126e41a4712984bEric Christopher virtual error_code getSymbolType(DataRefImpl Symb, 680dab867ebbae63821685e301fc126e41a4712984bEric Christopher SymbolRef::Type &Res) const; 681f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSymbolSection(DataRefImpl Symb, 682f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky section_iterator &Res) const; 683a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const; 684f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 6855c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer virtual error_code getLibraryNext(DataRefImpl Data, LibraryRef &Result) const; 6865c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer virtual error_code getLibraryPath(DataRefImpl Data, StringRef &Res) const; 6875c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 688f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const; 689f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const; 690f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const; 691f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const; 692f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const; 693f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const; 694f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const; 695f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const; 696f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const; 697c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd virtual error_code isSectionRequiredForExecution(DataRefImpl Sec, 698c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd bool &Res) const; 699c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const; 700c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const; 7013a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const; 702f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 703f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky bool &Result) const; 704f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const; 705f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const; 7067486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola virtual section_iterator getRelocatedSection(DataRefImpl Sec) const; 707f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 708f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getRelocationNext(DataRefImpl Rel, 709f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky RelocationRef &Res) const; 710f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getRelocationAddress(DataRefImpl Rel, 711f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky uint64_t &Res) const; 712f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getRelocationOffset(DataRefImpl Rel, 713f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky uint64_t &Res) const; 7146c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola virtual symbol_iterator getRelocationSymbol(DataRefImpl Rel) const; 715f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getRelocationType(DataRefImpl Rel, 716f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky uint64_t &Res) const; 717f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getRelocationTypeName(DataRefImpl Rel, 718f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky SmallVectorImpl<char> &Result) const; 719f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual error_code getRelocationValueString(DataRefImpl Rel, 720f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky SmallVectorImpl<char> &Result) const; 721f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 722f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskypublic: 723f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ELFObjectFile(MemoryBuffer *Object, error_code &ec); 724d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola 725d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola bool isMips64EL() const { 726d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola return Header->e_machine == ELF::EM_MIPS && 727d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola Header->getFileClass() == ELF::ELFCLASS64 && 728d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola Header->getDataEncoding() == ELF::ELFDATA2LSB; 729d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola } 730d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola 731f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual symbol_iterator begin_symbols() const; 732f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual symbol_iterator end_symbols() const; 7335c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 734dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer virtual symbol_iterator begin_dynamic_symbols() const; 735dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer virtual symbol_iterator end_dynamic_symbols() const; 7365c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 737f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual section_iterator begin_sections() const; 738f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual section_iterator end_sections() const; 739f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 7405c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer virtual library_iterator begin_libraries_needed() const; 7415c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer virtual library_iterator end_libraries_needed() const; 7425c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 743d1824f2f46adbf4d64acc647aaff9956bef88d54Michael J. Spencer const Elf_Shdr *getDynamicSymbolTableSectionHeader() const { 744bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola return getSection(DynamicSymbolTableIndex); 745d1824f2f46adbf4d64acc647aaff9956bef88d54Michael J. Spencer } 746d1824f2f46adbf4d64acc647aaff9956bef88d54Michael J. Spencer 747d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer const Elf_Shdr *getDynamicStringTableSectionHeader() const { 748d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer return dot_dynstr_sec; 749d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer } 750d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer 7512e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator begin_dynamic_table() const; 752d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer /// \param NULLEnd use one past the first DT_NULL entry as the end instead of 753d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer /// the section size. 754d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer Elf_Dyn_iterator end_dynamic_table(bool NULLEnd = false) const; 7555c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 7562e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Sym_iterator begin_elf_dynamic_symbols() const { 757bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola const Elf_Shdr *DynSymtab = getDynamicSymbolTableSectionHeader(); 7582e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer if (DynSymtab) 7592e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer return Elf_Sym_iterator(DynSymtab->sh_entsize, 7602e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer (const char *)base() + DynSymtab->sh_offset); 7612e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer return Elf_Sym_iterator(0, 0); 7622e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer } 7632e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer 7642e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Sym_iterator end_elf_dynamic_symbols() const { 765bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola const Elf_Shdr *DynSymtab = getDynamicSymbolTableSectionHeader(); 7662e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer if (DynSymtab) 7672e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer return Elf_Sym_iterator(DynSymtab->sh_entsize, (const char *)base() + 7682e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer DynSymtab->sh_offset + DynSymtab->sh_size); 7692e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer return Elf_Sym_iterator(0, 0); 7702e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer } 7719b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 772fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer Elf_Rela_Iter beginELFRela(const Elf_Shdr *sec) const { 773fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer return Elf_Rela_Iter(sec->sh_entsize, 774fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer (const char *)(base() + sec->sh_offset)); 775419e5b9d4f8bd0e0724b7b2c2d8df0f534bc8d8dRichard Smith } 7769b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 777fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer Elf_Rela_Iter endELFRela(const Elf_Shdr *sec) const { 778fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer return Elf_Rela_Iter(sec->sh_entsize, (const char *) 7799b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning (base() + sec->sh_offset + sec->sh_size)); 780419e5b9d4f8bd0e0724b7b2c2d8df0f534bc8d8dRichard Smith } 7819b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 782fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer Elf_Rel_Iter beginELFRel(const Elf_Shdr *sec) const { 783fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer return Elf_Rel_Iter(sec->sh_entsize, 784fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer (const char *)(base() + sec->sh_offset)); 785419e5b9d4f8bd0e0724b7b2c2d8df0f534bc8d8dRichard Smith } 7869b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 787fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer Elf_Rel_Iter endELFRel(const Elf_Shdr *sec) const { 788fe23da794930e01701ee1ee4fdb2b91db59c2be5Michael J. Spencer return Elf_Rel_Iter(sec->sh_entsize, (const char *) 7899b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning (base() + sec->sh_offset + sec->sh_size)); 790419e5b9d4f8bd0e0724b7b2c2d8df0f534bc8d8dRichard Smith } 7919b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 7923e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer /// \brief Iterate over program header table. 7933e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer typedef ELFEntityIterator<const Elf_Phdr> Elf_Phdr_Iter; 7943e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer 7953e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer Elf_Phdr_Iter begin_program_headers() const { 7963e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer return Elf_Phdr_Iter(Header->e_phentsize, 7973e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer (const char*)base() + Header->e_phoff); 7983e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer } 7993e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer 8003e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer Elf_Phdr_Iter end_program_headers() const { 8013e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer return Elf_Phdr_Iter(Header->e_phentsize, 8023e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer (const char*)base() + 8033e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer Header->e_phoff + 8043e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer (Header->e_phnum * Header->e_phentsize)); 8053e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer } 8063e5d8ade393d347a1483bf39d48ffebe9541b2b0Michael J. Spencer 807f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual uint8_t getBytesInAddress() const; 808f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual StringRef getFileFormatName() const; 8092d70e263c2b508bf4641273dd89a23149f6f6164David Meyer virtual StringRef getObjectType() const { return "ELF"; } 810f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky virtual unsigned getArch() const; 81197f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer virtual StringRef getLoadName() const; 8129dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta virtual error_code getSectionContents(const Elf_Shdr *sec, 8139dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta StringRef &Res) const; 814f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 815f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky uint64_t getNumSections() const; 816f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky uint64_t getStringTableIndex() const; 817f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ELF::Elf64_Word getSymbolTableIndex(const Elf_Sym *symb) const; 81876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher const Elf_Ehdr *getElfHeader() const; 819f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *getSection(const Elf_Sym *symb) const; 8209dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta const Elf_Shdr *getElfSection(section_iterator &It) const; 8219dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta const Elf_Sym *getElfSymbol(symbol_iterator &It) const; 8229b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning const Elf_Sym *getElfSymbol(uint32_t index) const; 823f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 824f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // Methods for type inquiry through isa, cast, and dyn_cast 825f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky bool isDyldType() const { return isDyldELFObject; } 826f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky static inline bool classof(const Binary *v) { 8276623730296fbe6d639058195772566ffa10e9ad2Dmitri Gribenko return v->getType() == getELFType(ELFT::TargetEndianness == support::little, 828ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer ELFT::Is64Bits); 829f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 830f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky}; 831f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 832bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola// Use an alignment of 2 for the typedefs since that is the worst case for 833bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola// ELF files in archives. 834bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolatypedef ELFObjectFile<ELFType<support::little, 2, false> > ELF32LEObjectFile; 835bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolatypedef ELFObjectFile<ELFType<support::little, 2, true> > ELF64LEObjectFile; 836bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolatypedef ELFObjectFile<ELFType<support::big, 2, false> > ELF32BEObjectFile; 837bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolatypedef ELFObjectFile<ELFType<support::big, 2, true> > ELF64BEObjectFile; 838bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola 8392d70e263c2b508bf4641273dd89a23149f6f6164David Meyer// Iterate through the version definitions, and place each Elf_Verdef 8402d70e263c2b508bf4641273dd89a23149f6f6164David Meyer// in the VersionMap according to its index. 841ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 842ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencervoid ELFObjectFile<ELFT>::LoadVersionDefs(const Elf_Shdr *sec) const { 8432d70e263c2b508bf4641273dd89a23149f6f6164David Meyer unsigned vd_size = sec->sh_size; // Size of section in bytes 8442d70e263c2b508bf4641273dd89a23149f6f6164David Meyer unsigned vd_count = sec->sh_info; // Number of Verdef entries 8452d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const char *sec_start = (const char*)base() + sec->sh_offset; 8462d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const char *sec_end = sec_start + vd_size; 8472d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // The first Verdef entry is at the start of the section. 8482d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const char *p = sec_start; 8492d70e263c2b508bf4641273dd89a23149f6f6164David Meyer for (unsigned i = 0; i < vd_count; i++) { 8502d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (p + sizeof(Elf_Verdef) > sec_end) 8512d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("Section ended unexpectedly while scanning " 8522d70e263c2b508bf4641273dd89a23149f6f6164David Meyer "version definitions."); 8532d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Verdef *vd = reinterpret_cast<const Elf_Verdef *>(p); 8542d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (vd->vd_version != ELF::VER_DEF_CURRENT) 8552d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("Unexpected verdef version"); 8562d70e263c2b508bf4641273dd89a23149f6f6164David Meyer size_t index = vd->vd_ndx & ELF::VERSYM_VERSION; 8572d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (index >= VersionMap.size()) 8582d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMap.resize(index+1); 8592d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMap[index] = VersionMapEntry(vd); 8602d70e263c2b508bf4641273dd89a23149f6f6164David Meyer p += vd->vd_next; 8612d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 8622d70e263c2b508bf4641273dd89a23149f6f6164David Meyer} 8632d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 8642d70e263c2b508bf4641273dd89a23149f6f6164David Meyer// Iterate through the versions needed section, and place each Elf_Vernaux 8652d70e263c2b508bf4641273dd89a23149f6f6164David Meyer// in the VersionMap according to its index. 866ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 867ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencervoid ELFObjectFile<ELFT>::LoadVersionNeeds(const Elf_Shdr *sec) const { 8682d70e263c2b508bf4641273dd89a23149f6f6164David Meyer unsigned vn_size = sec->sh_size; // Size of section in bytes 8692d70e263c2b508bf4641273dd89a23149f6f6164David Meyer unsigned vn_count = sec->sh_info; // Number of Verneed entries 8702d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const char *sec_start = (const char*)base() + sec->sh_offset; 8712d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const char *sec_end = sec_start + vn_size; 8722d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // The first Verneed entry is at the start of the section. 8732d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const char *p = sec_start; 8742d70e263c2b508bf4641273dd89a23149f6f6164David Meyer for (unsigned i = 0; i < vn_count; i++) { 8752d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (p + sizeof(Elf_Verneed) > sec_end) 8762d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("Section ended unexpectedly while scanning " 8772d70e263c2b508bf4641273dd89a23149f6f6164David Meyer "version needed records."); 8782d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Verneed *vn = reinterpret_cast<const Elf_Verneed *>(p); 8792d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (vn->vn_version != ELF::VER_NEED_CURRENT) 8802d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("Unexpected verneed version"); 8812d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Iterate through the Vernaux entries 8822d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const char *paux = p + vn->vn_aux; 8832d70e263c2b508bf4641273dd89a23149f6f6164David Meyer for (unsigned j = 0; j < vn->vn_cnt; j++) { 8842d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (paux + sizeof(Elf_Vernaux) > sec_end) 8852d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("Section ended unexpected while scanning auxiliary " 8862d70e263c2b508bf4641273dd89a23149f6f6164David Meyer "version needed records."); 8872d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Vernaux *vna = reinterpret_cast<const Elf_Vernaux *>(paux); 8882d70e263c2b508bf4641273dd89a23149f6f6164David Meyer size_t index = vna->vna_other & ELF::VERSYM_VERSION; 8892d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (index >= VersionMap.size()) 8902d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMap.resize(index+1); 8912d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMap[index] = VersionMapEntry(vna); 8922d70e263c2b508bf4641273dd89a23149f6f6164David Meyer paux += vna->vna_next; 8932d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 8942d70e263c2b508bf4641273dd89a23149f6f6164David Meyer p += vn->vn_next; 8952d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 8962d70e263c2b508bf4641273dd89a23149f6f6164David Meyer} 8972d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 898ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 899ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencervoid ELFObjectFile<ELFT>::LoadVersionMap() const { 9002d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // If there is no dynamic symtab or version table, there is nothing to do. 901bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (getDynamicStringTableSectionHeader() == NULL || 902bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola dot_gnu_version_sec == NULL) 9032d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return; 9042d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 9052d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Has the VersionMap already been loaded? 9062d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (VersionMap.size() > 0) 9072d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return; 9082d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 9092d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // The first two version indexes are reserved. 9102d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Index 0 is LOCAL, index 1 is GLOBAL. 9112d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMap.push_back(VersionMapEntry()); 9122d70e263c2b508bf4641273dd89a23149f6f6164David Meyer VersionMap.push_back(VersionMapEntry()); 9132d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 9142d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (dot_gnu_version_d_sec) 9152d70e263c2b508bf4641273dd89a23149f6f6164David Meyer LoadVersionDefs(dot_gnu_version_d_sec); 9162d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 9172d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (dot_gnu_version_r_sec) 9182d70e263c2b508bf4641273dd89a23149f6f6164David Meyer LoadVersionNeeds(dot_gnu_version_r_sec); 9192d70e263c2b508bf4641273dd89a23149f6f6164David Meyer} 9202d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 921ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 922ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencervoid ELFObjectFile<ELFT>::validateSymbol(DataRefImpl Symb) const { 92306121de923cb7e8e2ea3cf527f281d9e7825e518Dmitry Vyukov#ifndef NDEBUG 924f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 925bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola const Elf_Shdr *SymbolTableSection = getSection(Symb.d.b); 926f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: We really need to do proper error handling in the case of an invalid 927f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // input file. Because we don't use exceptions, I think we'll just pass 928f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // an error object around. 929f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (!( symb 930f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky && SymbolTableSection 931f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky && symb >= (const Elf_Sym*)(base() 932f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky + SymbolTableSection->sh_offset) 933f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky && symb < (const Elf_Sym*)(base() 934f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky + SymbolTableSection->sh_offset 935f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky + SymbolTableSection->sh_size))) 936f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 937f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Symb must point to a valid symbol!"); 93806121de923cb7e8e2ea3cf527f281d9e7825e518Dmitry Vyukov#endif 939f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 940f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 941ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 942ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolNext(DataRefImpl Symb, 943ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer SymbolRef &Result) const { 944f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 945f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ++Symb.d.a; 946f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = SymbolRef(Symb, this); 947f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 948f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 949f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 950ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 951ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolName(DataRefImpl Symb, 952ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Result) const { 953f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 954f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 955bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola return getSymbolName(getSection(Symb.d.b), symb, Result); 956f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 957f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 958ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 959ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolVersion(SymbolRef SymRef, 960ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Version, 961ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &IsDefault) const { 9622d70e263c2b508bf4641273dd89a23149f6f6164David Meyer DataRefImpl Symb = SymRef.getRawDataRefImpl(); 9632d70e263c2b508bf4641273dd89a23149f6f6164David Meyer validateSymbol(Symb); 9642d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Sym *symb = getSymbol(Symb); 965bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola return getSymbolVersion(getSection(Symb.d.b), symb, Version, IsDefault); 9662d70e263c2b508bf4641273dd89a23149f6f6164David Meyer} 9672d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 968ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 969ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELF::Elf64_Word ELFObjectFile<ELFT> 970ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer ::getSymbolTableIndex(const Elf_Sym *symb) const { 971f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (symb->st_shndx == ELF::SHN_XINDEX) 972f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return ExtendedSymbolTable.lookup(symb); 973f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return symb->st_shndx; 974f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 975f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 976ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 977ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Shdr * 978ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getSection(const Elf_Sym *symb) const { 979f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (symb->st_shndx == ELF::SHN_XINDEX) 980f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return getSection(ExtendedSymbolTable.lookup(symb)); 981f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (symb->st_shndx >= ELF::SHN_LORESERVE) 982f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return 0; 983f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return getSection(symb->st_shndx); 984f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 985f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 986ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 98776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherconst typename ELFObjectFile<ELFT>::Elf_Ehdr * 98876e70f340c09ba759ad96d8dfe416b64f24bc287Eric ChristopherELFObjectFile<ELFT>::getElfHeader() const { 98976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return Header; 99076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 99176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 99276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 993ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Shdr * 994ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getElfSection(section_iterator &It) const { 9959dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta llvm::object::DataRefImpl ShdrRef = It->getRawDataRefImpl(); 9969669f749764997ab7033d5c4b0546fe739dd71d8Michael J. Spencer return reinterpret_cast<const Elf_Shdr *>(ShdrRef.p); 9979dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta} 9989dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta 999ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1000ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Sym * 1001ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getElfSymbol(symbol_iterator &It) const { 10029dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta return getSymbol(It->getRawDataRefImpl()); 10039dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta} 10049dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta 1005ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1006ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Sym * 1007ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getElfSymbol(uint32_t index) const { 10089b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning DataRefImpl SymbolData; 10099b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning SymbolData.d.a = index; 1010bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = SymbolTableIndex; 10119b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning return getSymbol(SymbolData); 10129b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning} 10139b7ca410621f6988b2d4203b90058dd4252848a8Sid Manning 1014ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1015ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolFileOffset(DataRefImpl Symb, 1016ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 1017f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 1018f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 1019f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *Section; 1020f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (getSymbolTableIndex(symb)) { 1021f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_COMMON: 1022f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // Unintialized symbols have no offset in the object file 1023f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_UNDEF: 1024f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = UnknownAddressOrSize; 1025f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1026f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_ABS: 1027f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = symb->st_value; 1028f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1029f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: Section = getSection(symb); 1030f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1031f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1032f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (symb->getType()) { 1033f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_SECTION: 10346fff325fb600fdaa269858c638d50dbe374d1937Andrew Kaylor Result = Section ? Section->sh_offset : UnknownAddressOrSize; 1035f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1036f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_FUNC: 1037f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_OBJECT: 1038f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_NOTYPE: 1039f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = symb->st_value + 1040f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky (Section ? Section->sh_offset : 0); 1041f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1042f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 1043f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = UnknownAddressOrSize; 1044f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1045f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1046f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1047f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1048ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1049ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb, 1050ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 1051f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 1052f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 1053f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *Section; 1054f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (getSymbolTableIndex(symb)) { 1055f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_COMMON: 1056f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_UNDEF: 1057f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = UnknownAddressOrSize; 1058f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1059f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_ABS: 1060f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = symb->st_value; 1061f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1062f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: Section = getSection(symb); 1063f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1064f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1065f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (symb->getType()) { 1066f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_SECTION: 1067f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = Section ? Section->sh_addr : UnknownAddressOrSize; 1068f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1069f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_FUNC: 1070f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_OBJECT: 1071f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_NOTYPE: 107201fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov bool IsRelocatable; 107301fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov switch(Header->e_type) { 107401fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov case ELF::ET_EXEC: 107501fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov case ELF::ET_DYN: 107601fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov IsRelocatable = false; 107701fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov break; 107801fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov default: 107901fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov IsRelocatable = true; 108001fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov } 108101fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov Result = symb->st_value; 1082eac49f668a5461af4c408b13f328c9e370457200Eric Christopher 1083eac49f668a5461af4c408b13f328c9e370457200Eric Christopher // Clear the ARM/Thumb indicator flag. 1084eac49f668a5461af4c408b13f328c9e370457200Eric Christopher if (Header->e_machine == ELF::EM_ARM) 1085eac49f668a5461af4c408b13f328c9e370457200Eric Christopher Result &= ~1; 1086eac49f668a5461af4c408b13f328c9e370457200Eric Christopher 108701fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov if (IsRelocatable && Section != 0) 108801fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov Result += Section->sh_addr; 1089f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1090f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 1091f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = UnknownAddressOrSize; 1092f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1093f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1094f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1095f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1096ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 109759a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindolaerror_code ELFObjectFile<ELFT>::getSymbolAlignment(DataRefImpl Symb, 109859a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola uint32_t &Res) const { 109959a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola uint32_t flags; 110059a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola getSymbolFlags(Symb, flags); 110159a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola if (flags & SymbolRef::SF_Common) { 110259a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola uint64_t Value; 110359a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola getSymbolValue(Symb, Value); 110459a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola Res = Value; 110559a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola } else { 110659a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola Res = 0; 110759a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola } 110859a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola return object_error::success; 110959a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola} 111059a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola 111159a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindolatemplate<class ELFT> 1112ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolSize(DataRefImpl Symb, 1113ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 1114f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 1115f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 1116f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (symb->st_size == 0) 1117f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = UnknownAddressOrSize; 1118f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = symb->st_size; 1119f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1120f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1121f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1122ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1123ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolNMTypeChar(DataRefImpl Symb, 1124ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer char &Result) const { 1125f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 1126f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 1127f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *Section = getSection(symb); 1128f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1129f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky char ret = '?'; 1130f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1131f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (Section) { 1132f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (Section->sh_type) { 1133f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_PROGBITS: 1134f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_DYNAMIC: 1135f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (Section->sh_flags) { 1136f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case (ELF::SHF_ALLOC | ELF::SHF_EXECINSTR): 1137f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret = 't'; break; 1138f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case (ELF::SHF_ALLOC | ELF::SHF_WRITE): 1139f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret = 'd'; break; 1140f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHF_ALLOC: 1141f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case (ELF::SHF_ALLOC | ELF::SHF_MERGE): 1142f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case (ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::SHF_STRINGS): 1143f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret = 'r'; break; 1144f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1145f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1146f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_NOBITS: ret = 'b'; 1147f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1148f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1149f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1150f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (getSymbolTableIndex(symb)) { 1151f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_UNDEF: 1152f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (ret == '?') 1153f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret = 'U'; 1154f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1155f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_ABS: ret = 'a'; break; 1156f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHN_COMMON: ret = 'c'; break; 1157f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1158f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1159f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (symb->getBinding()) { 1160f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STB_GLOBAL: ret = ::toupper(ret); break; 1161f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STB_WEAK: 1162f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (getSymbolTableIndex(symb) == ELF::SHN_UNDEF) 1163f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret = 'w'; 1164f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky else 1165f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (symb->getType() == ELF::STT_OBJECT) 1166f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret = 'V'; 1167f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky else 1168f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret = 'W'; 1169f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1170f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1171f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (ret == '?' && symb->getType() == ELF::STT_SECTION) { 1172f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky StringRef name; 1173f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (error_code ec = getSymbolName(Symb, name)) 1174f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return ec; 1175f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = StringSwitch<char>(name) 1176f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky .StartsWith(".debug", 'N') 1177f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky .StartsWith(".note", 'n') 1178f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky .Default('?'); 1179f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1180f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1181f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1182f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = ret; 1183f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1184f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1185f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1186ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1187ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolType(DataRefImpl Symb, 1188ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer SymbolRef::Type &Result) const { 1189f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 1190f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 1191f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1192f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (symb->getType()) { 11932c67727046234ad9702ab5acb72700b5ac99a676David Meyer case ELF::STT_NOTYPE: 11942c67727046234ad9702ab5acb72700b5ac99a676David Meyer Result = SymbolRef::ST_Unknown; 11952c67727046234ad9702ab5acb72700b5ac99a676David Meyer break; 1196f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_SECTION: 1197f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = SymbolRef::ST_Debug; 1198f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1199f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_FILE: 1200f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = SymbolRef::ST_File; 1201f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1202f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_FUNC: 1203f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = SymbolRef::ST_Function; 1204f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1205f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::STT_OBJECT: 12062c67727046234ad9702ab5acb72700b5ac99a676David Meyer case ELF::STT_COMMON: 12072c67727046234ad9702ab5acb72700b5ac99a676David Meyer case ELF::STT_TLS: 1208f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = SymbolRef::ST_Data; 1209f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1210f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 1211f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = SymbolRef::ST_Other; 1212f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1213f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1214f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1215f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1216f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1217ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1218ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolFlags(DataRefImpl Symb, 1219ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint32_t &Result) const { 1220f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 1221f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 1222f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1223c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer Result = SymbolRef::SF_None; 1224f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1225c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer if (symb->getBinding() != ELF::STB_LOCAL) 1226c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer Result |= SymbolRef::SF_Global; 1227f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1228c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer if (symb->getBinding() == ELF::STB_WEAK) 1229c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer Result |= SymbolRef::SF_Weak; 1230c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer 1231c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer if (symb->st_shndx == ELF::SHN_ABS) 1232c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer Result |= SymbolRef::SF_Absolute; 1233c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer 1234c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer if (symb->getType() == ELF::STT_FILE || 1235c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer symb->getType() == ELF::STT_SECTION) 1236c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer Result |= SymbolRef::SF_FormatSpecific; 1237f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 12382c67727046234ad9702ab5acb72700b5ac99a676David Meyer if (getSymbolTableIndex(symb) == ELF::SHN_UNDEF) 12392c67727046234ad9702ab5acb72700b5ac99a676David Meyer Result |= SymbolRef::SF_Undefined; 12402c67727046234ad9702ab5acb72700b5ac99a676David Meyer 12412c67727046234ad9702ab5acb72700b5ac99a676David Meyer if (symb->getType() == ELF::STT_COMMON || 12422c67727046234ad9702ab5acb72700b5ac99a676David Meyer getSymbolTableIndex(symb) == ELF::SHN_COMMON) 12432c67727046234ad9702ab5acb72700b5ac99a676David Meyer Result |= SymbolRef::SF_Common; 12442c67727046234ad9702ab5acb72700b5ac99a676David Meyer 12452c67727046234ad9702ab5acb72700b5ac99a676David Meyer if (symb->getType() == ELF::STT_TLS) 12462c67727046234ad9702ab5acb72700b5ac99a676David Meyer Result |= SymbolRef::SF_ThreadLocal; 12472c67727046234ad9702ab5acb72700b5ac99a676David Meyer 1248f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1249f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1250f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1251ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1252ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolSection(DataRefImpl Symb, 1253ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer section_iterator &Res) const { 1254f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky validateSymbol(Symb); 1255f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getSymbol(Symb); 1256f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = getSection(symb); 1257f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (!sec) 1258f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Res = end_sections(); 1259f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky else { 1260f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky DataRefImpl Sec; 1261f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Sec.p = reinterpret_cast<intptr_t>(sec); 1262f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Res = section_iterator(SectionRef(Sec, this)); 1263f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1264f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1265f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1266f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1267ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1268ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolValue(DataRefImpl Symb, 1269ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Val) const { 1270a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover validateSymbol(Symb); 1271a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover const Elf_Sym *symb = getSymbol(Symb); 1272a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover Val = symb->st_value; 1273a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover return object_error::success; 1274a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover} 1275a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover 1276ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1277ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSectionNext(DataRefImpl Sec, 1278ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer SectionRef &Result) const { 1279f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const uint8_t *sec = reinterpret_cast<const uint8_t *>(Sec.p); 1280f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky sec += Header->e_shentsize; 1281f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Sec.p = reinterpret_cast<intptr_t>(sec); 1282f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = SectionRef(Sec, this); 1283f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1284f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1285f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1286ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1287ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSectionName(DataRefImpl Sec, 1288ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Result) const { 1289f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1290f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = StringRef(getString(dot_shstrtab_sec, sec->sh_name)); 1291f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1292f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1293f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1294ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1295ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSectionAddress(DataRefImpl Sec, 1296ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 1297f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1298f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = sec->sh_addr; 1299f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1300f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1301f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1302ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1303ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSectionSize(DataRefImpl Sec, 1304ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 1305f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1306f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = sec->sh_size; 1307f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1308f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1309f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1310ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1311ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSectionContents(DataRefImpl Sec, 1312ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Result) const { 1313f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 131477c27f439443c2a7f56fc707fc9ceb0d10f085aeMichael J. Spencer const char *start = (const char*)base() + sec->sh_offset; 131577c27f439443c2a7f56fc707fc9ceb0d10f085aeMichael J. Spencer Result = StringRef(start, sec->sh_size); 131677c27f439443c2a7f56fc707fc9ceb0d10f085aeMichael J. Spencer return object_error::success; 1317f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1318f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1319ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1320ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSectionContents(const Elf_Shdr *Sec, 1321ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Result) const { 132277c27f439443c2a7f56fc707fc9ceb0d10f085aeMichael J. Spencer const char *start = (const char*)base() + Sec->sh_offset; 132377c27f439443c2a7f56fc707fc9ceb0d10f085aeMichael J. Spencer Result = StringRef(start, Sec->sh_size); 13249dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta return object_error::success; 13259dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta} 13269dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta 1327ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1328ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSectionAlignment(DataRefImpl Sec, 1329ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 1330f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1331f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = sec->sh_addralign; 1332f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1333f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1334f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1335ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1336ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::isSectionText(DataRefImpl Sec, 1337ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &Result) const { 1338f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1339f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (sec->sh_flags & ELF::SHF_EXECINSTR) 1340f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = true; 1341f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky else 1342f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = false; 1343f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1344f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1345f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1346ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1347ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::isSectionData(DataRefImpl Sec, 1348ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &Result) const { 1349f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1350f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (sec->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE) 1351f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky && sec->sh_type == ELF::SHT_PROGBITS) 1352f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = true; 1353f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky else 1354f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = false; 1355f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1356f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1357f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1358ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1359ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::isSectionBSS(DataRefImpl Sec, 1360ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &Result) const { 1361f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1362f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (sec->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE) 1363f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky && sec->sh_type == ELF::SHT_NOBITS) 1364c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd Result = true; 1365c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd else 1366c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd Result = false; 1367c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd return object_error::success; 1368c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd} 1369c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd 1370ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1371ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::isSectionRequiredForExecution( 1372ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer DataRefImpl Sec, bool &Result) const { 1373c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1374c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd if (sec->sh_flags & ELF::SHF_ALLOC) 1375c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd Result = true; 1376c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd else 1377c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd Result = false; 1378c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd return object_error::success; 1379c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd} 1380c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd 1381ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1382ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::isSectionVirtual(DataRefImpl Sec, 1383ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &Result) const { 1384c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1385c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd if (sec->sh_type == ELF::SHT_NOBITS) 1386c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd Result = true; 1387c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd else 1388c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd Result = false; 1389c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd return object_error::success; 1390c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd} 1391c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd 1392ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1393ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::isSectionZeroInit(DataRefImpl Sec, 1394ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &Result) const { 1395c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 1396c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd // For ELF, all zero-init sections are virtual (that is, they occupy no space 1397c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd // in the object image) and vice versa. 13985b712efd9a4d29119ce136d46a23454bdc103f68Rafael Espindola Result = sec->sh_type == ELF::SHT_NOBITS; 1399f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1400f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1401f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1402ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1403ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::isSectionReadOnlyData(DataRefImpl Sec, 1404ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &Result) const { 14053a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 14063a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor if (sec->sh_flags & ELF::SHF_WRITE || sec->sh_flags & ELF::SHF_EXECINSTR) 14073a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor Result = false; 14083a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor else 14093a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor Result = true; 14103a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor return object_error::success; 14113a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor} 14123a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor 1413ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1414ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::sectionContainsSymbol(DataRefImpl Sec, 1415ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer DataRefImpl Symb, 1416ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &Result) const { 141719d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher validateSymbol(Symb); 141819d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher 141919d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p); 142019d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher const Elf_Sym *symb = getSymbol(Symb); 142119d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher 142219d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher unsigned shndx = symb->st_shndx; 142319d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher bool Reserved = shndx >= ELF::SHN_LORESERVE 142419d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher && shndx <= ELF::SHN_HIRESERVE; 142519d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher 142619d7322170d6d07880055fe1152d6fe17125fb7eEric Christopher Result = !Reserved && (sec == getSection(symb->st_shndx)); 1427f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1428f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1429f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1430ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1431ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerrelocation_iterator 1432ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getSectionRelBegin(DataRefImpl Sec) const { 1433f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky DataRefImpl RelData; 14347486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola uintptr_t SHT = reinterpret_cast<uintptr_t>(SectionHeaderTable); 14357486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola RelData.d.a = (Sec.p - SHT) / Header->e_shentsize; 14367486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola RelData.d.b = 0; 1437f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return relocation_iterator(RelocationRef(RelData, this)); 1438f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1439f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1440ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1441ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerrelocation_iterator 1442ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getSectionRelEnd(DataRefImpl Sec) const { 1443f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky DataRefImpl RelData; 14447486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola uintptr_t SHT = reinterpret_cast<uintptr_t>(SectionHeaderTable); 14457486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *S = reinterpret_cast<const Elf_Shdr *>(Sec.p); 14467486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola RelData.d.a = (Sec.p - SHT) / Header->e_shentsize; 14477486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola if (S->sh_type != ELF::SHT_RELA && S->sh_type != ELF::SHT_REL) 14487486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola RelData.d.b = 0; 14497486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola else 14507486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola RelData.d.b = S->sh_size / S->sh_entsize; 14517486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola 1452f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return relocation_iterator(RelocationRef(RelData, this)); 1453f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1454f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 14557486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindolatemplate <class ELFT> 14567486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindolasection_iterator 14577486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael EspindolaELFObjectFile<ELFT>::getRelocatedSection(DataRefImpl Sec) const { 14587486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola if (Header->e_type != ELF::ET_REL) 14597486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola return end_sections(); 14607486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola 14617486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *S = reinterpret_cast<const Elf_Shdr *>(Sec.p); 14627486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola unsigned sh_type = S->sh_type; 14637486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola if (sh_type != ELF::SHT_RELA && sh_type != ELF::SHT_REL) 14647486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola return end_sections(); 14657486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola 1466aebc1b369c8e8b61187da85857dd49ce4e4cda5fDaniel Jasper assert(S->sh_info != 0); 14677486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *R = getSection(S->sh_info); 14687486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola DataRefImpl D; 14697486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola D.p = reinterpret_cast<uintptr_t>(R); 14707486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola return section_iterator(SectionRef(D, this)); 14717486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola} 14727486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola 1473f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky// Relocations 1474ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1475ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getRelocationNext(DataRefImpl Rel, 1476ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer RelocationRef &Result) const { 14777486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola ++Rel.d.b; 1478f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = RelocationRef(Rel, this); 1479f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1480f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1481f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 14826c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindolatemplate <class ELFT> 14836c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindolasymbol_iterator 14846c1202c459ffa6d693ad92fa84e43902bc780bcaRafael EspindolaELFObjectFile<ELFT>::getRelocationSymbol(DataRefImpl Rel) const { 1485f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky uint32_t symbolIdx; 14867486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *sec = getRelSection(Rel); 1487f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (sec->sh_type) { 1488f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default : 1489f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Invalid section type in Rel!"); 1490f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_REL : { 1491d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola symbolIdx = getRel(Rel)->getSymbol(isMips64EL()); 1492f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1493f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1494f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_RELA : { 1495d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola symbolIdx = getRela(Rel)->getSymbol(isMips64EL()); 1496f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1497f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1498f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 14996c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola if (!symbolIdx) 15006c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola return end_symbols(); 15016c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola 1502f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky DataRefImpl SymbolData; 1503f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky SymbolData.d.a = symbolIdx; 1504bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = sec->sh_link; 15056c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola return symbol_iterator(SymbolRef(SymbolData, this)); 1506f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1507f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1508ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1509ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getRelocationAddress(DataRefImpl Rel, 1510ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 1511956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola assert((Header->e_type == ELF::ET_EXEC || Header->e_type == ELF::ET_DYN) && 1512956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola "Only executable and shared objects files have addresses"); 1513956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola Result = getROffset(Rel); 1514f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1515f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1516f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1517ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1518ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getRelocationOffset(DataRefImpl Rel, 1519ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 1520956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola assert(Header->e_type == ELF::ET_REL && 1521956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola "Only relocatable object files have relocation offsets"); 1522956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola Result = getROffset(Rel); 1523956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola return object_error::success; 1524956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola} 1525956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola 1526956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindolatemplate<class ELFT> 1527956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindolauint64_t ELFObjectFile<ELFT>::getROffset(DataRefImpl Rel) const { 15287486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *sec = getRelSection(Rel); 1529f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (sec->sh_type) { 1530956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola default: 1531956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola report_fatal_error("Invalid section type in Rel!"); 1532956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola case ELF::SHT_REL: 1533956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola return getRel(Rel)->r_offset; 1534956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola case ELF::SHT_RELA: 1535956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola return getRela(Rel)->r_offset; 1536f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1537f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1538f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1539ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1540ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getRelocationType(DataRefImpl Rel, 1541ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer uint64_t &Result) const { 15427486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *sec = getRelSection(Rel); 1543f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (sec->sh_type) { 1544f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default : 1545f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Invalid section type in Rel!"); 1546f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_REL : { 1547d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola Result = getRel(Rel)->getType(isMips64EL()); 1548f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1549f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1550f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_RELA : { 1551d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola Result = getRela(Rel)->getType(isMips64EL()); 1552f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1553f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1554f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1555f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 1556f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 1557f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1558f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#define LLVM_ELF_SWITCH_RELOC_TYPE_NAME(enum) \ 1559346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck case ELF::enum: Res = #enum; break; 1560f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 1561ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 1562346801a5c6e1542bd69d951f95efd9e582e9d348Nico RieckStringRef ELFObjectFile<ELFT>::getRelocationTypeName(uint32_t Type) const { 1563346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck StringRef Res = "Unknown"; 1564f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (Header->e_machine) { 1565f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_X86_64: 1566346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck switch (Type) { 1567f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_NONE); 1568f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_64); 1569f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PC32); 1570f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOT32); 1571f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PLT32); 1572f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_COPY); 1573f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GLOB_DAT); 1574f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_JUMP_SLOT); 1575f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_RELATIVE); 1576f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPCREL); 1577f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_32); 1578f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_32S); 1579f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_16); 1580f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PC16); 1581f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_8); 1582f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PC8); 1583f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_DTPMOD64); 1584f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_DTPOFF64); 1585f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TPOFF64); 1586f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TLSGD); 1587f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TLSLD); 1588f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_DTPOFF32); 1589f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTTPOFF); 1590f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TPOFF32); 1591f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PC64); 1592f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTOFF64); 1593f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPC32); 1594a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOT64); 1595a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPCREL64); 1596a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPC64); 1597a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPLT64); 1598a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_PLTOFF64); 1599f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_SIZE32); 1600f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_SIZE64); 1601f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_GOTPC32_TLSDESC); 1602f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TLSDESC_CALL); 1603f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_TLSDESC); 1604a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_X86_64_IRELATIVE); 1605346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck default: break; 1606f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1607f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1608f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_386: 1609346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck switch (Type) { 1610f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_NONE); 1611f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_32); 1612f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_PC32); 1613f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_GOT32); 1614f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_PLT32); 1615f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_COPY); 1616f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_GLOB_DAT); 1617f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_JUMP_SLOT); 1618f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_RELATIVE); 1619f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_GOTOFF); 1620f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_GOTPC); 1621f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_32PLT); 1622f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_TPOFF); 1623f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_IE); 1624f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GOTIE); 1625f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LE); 1626f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD); 1627f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM); 1628f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_16); 1629f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_PC16); 1630f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_8); 1631f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_PC8); 1632f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD_32); 1633f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD_PUSH); 1634f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD_CALL); 1635f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GD_POP); 1636f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM_32); 1637f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM_PUSH); 1638f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM_CALL); 1639f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDM_POP); 1640f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LDO_32); 1641f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_IE_32); 1642f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_LE_32); 1643f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_DTPMOD32); 1644f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_DTPOFF32); 1645f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_TPOFF32); 1646f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_GOTDESC); 1647f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_DESC_CALL); 1648f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_TLS_DESC); 1649f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_386_IRELATIVE); 1650346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck default: break; 1651f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 1652f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 1653732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter case ELF::EM_MIPS: 1654346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck switch (Type) { 1655732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_NONE); 1656732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_16); 1657732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_32); 1658732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_REL32); 1659732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_26); 1660732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_HI16); 1661732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_LO16); 1662732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GPREL16); 1663732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_LITERAL); 1664732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GOT16); 1665732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_PC16); 1666732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_CALL16); 1667732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GPREL32); 1668732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_SHIFT5); 1669732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_SHIFT6); 1670732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_64); 1671732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GOT_DISP); 1672732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GOT_PAGE); 1673732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GOT_OFST); 1674732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GOT_HI16); 1675732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GOT_LO16); 1676732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_SUB); 1677732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_INSERT_A); 1678732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_INSERT_B); 1679732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_DELETE); 1680732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_HIGHER); 1681732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_HIGHEST); 1682732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_CALL_HI16); 1683732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_CALL_LO16); 1684732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_SCN_DISP); 1685732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_REL16); 1686732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_ADD_IMMEDIATE); 1687732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_PJUMP); 1688732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_RELGOT); 1689732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_JALR); 1690732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_DTPMOD32); 1691732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_DTPREL32); 1692732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_DTPMOD64); 1693732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_DTPREL64); 1694732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_GD); 1695732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_LDM); 1696732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_DTPREL_HI16); 1697732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_DTPREL_LO16); 1698732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_GOTTPREL); 1699732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_TPREL32); 1700732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_TPREL64); 1701732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_TPREL_HI16); 1702732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_TLS_TPREL_LO16); 1703732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GLOB_DAT); 1704732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_COPY); 1705732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_JUMP_SLOT); 1706a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_NUM); 1707346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck default: break; 1708732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter } 1709732f4bc7c4baa7546b0942f69562d4fb3f474999Jack Carter break; 171072062f5744557e270a38192554c3126ea5f97434Tim Northover case ELF::EM_AARCH64: 1711346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck switch (Type) { 171272062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_NONE); 171372062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_ABS64); 171472062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_ABS32); 171572062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_ABS16); 171672062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_PREL64); 171772062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_PREL32); 171872062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_PREL16); 171972062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_UABS_G0); 172072062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_UABS_G0_NC); 172172062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_UABS_G1); 172272062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_UABS_G1_NC); 172372062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_UABS_G2); 172472062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_UABS_G2_NC); 172572062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_UABS_G3); 172672062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_SABS_G0); 172772062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_SABS_G1); 172872062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_MOVW_SABS_G2); 172972062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_LD_PREL_LO19); 173072062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_ADR_PREL_LO21); 173172062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_ADR_PREL_PG_HI21); 173272062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_ADD_ABS_LO12_NC); 173372062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_LDST8_ABS_LO12_NC); 173472062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TSTBR14); 173572062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_CONDBR19); 173672062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_JUMP26); 173772062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_CALL26); 173872062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_LDST16_ABS_LO12_NC); 173972062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_LDST32_ABS_LO12_NC); 174072062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_LDST64_ABS_LO12_NC); 174172062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_LDST128_ABS_LO12_NC); 174272062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_ADR_GOT_PAGE); 174372062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_LD64_GOT_LO12_NC); 174472062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_MOVW_DTPREL_G2); 174572062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_MOVW_DTPREL_G1); 174672062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC); 174772062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_MOVW_DTPREL_G0); 174872062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC); 174972062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_ADD_DTPREL_HI12); 175072062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_ADD_DTPREL_LO12); 175172062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC); 175272062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_LDST8_DTPREL_LO12); 175372062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC); 175472062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_LDST16_DTPREL_LO12); 175572062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC); 175672062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_LDST32_DTPREL_LO12); 175772062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC); 175872062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_LDST64_DTPREL_LO12); 175972062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC); 176072062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSIE_MOVW_GOTTPREL_G1); 176172062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC); 176272062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21); 176372062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC); 176472062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSIE_LD_GOTTPREL_PREL19); 176572062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_MOVW_TPREL_G2); 176672062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_MOVW_TPREL_G1); 176772062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_MOVW_TPREL_G1_NC); 176872062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_MOVW_TPREL_G0); 176972062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_MOVW_TPREL_G0_NC); 177072062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_ADD_TPREL_HI12); 177172062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_ADD_TPREL_LO12); 177272062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_ADD_TPREL_LO12_NC); 177372062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_LDST8_TPREL_LO12); 177472062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC); 177572062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_LDST16_TPREL_LO12); 177672062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC); 177772062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_LDST32_TPREL_LO12); 177872062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC); 177972062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_LDST64_TPREL_LO12); 178072062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC); 178172062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSDESC_ADR_PAGE); 178272062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSDESC_LD64_LO12_NC); 178372062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSDESC_ADD_LO12_NC); 178472062f5744557e270a38192554c3126ea5f97434Tim Northover LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_AARCH64_TLSDESC_CALL); 1785346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck default: break; 178672062f5744557e270a38192554c3126ea5f97434Tim Northover } 178772062f5744557e270a38192554c3126ea5f97434Tim Northover break; 17884b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien case ELF::EM_ARM: 1789346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck switch (Type) { 17904b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_NONE); 17914b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PC24); 17924b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ABS32); 17934b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_REL32); 17944b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDR_PC_G0); 17954b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ABS16); 17964b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ABS12); 17974b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_ABS5); 17984b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ABS8); 17994b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_SBREL32); 18004b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_CALL); 18014b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_PC8); 18024b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_BREL_ADJ); 18034b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_DESC); 18044b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_SWI8); 18054b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_XPC25); 18064b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_XPC22); 18074b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_DTPMOD32); 18084b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_DTPOFF32); 18094b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_TPOFF32); 18104b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_COPY); 18114b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GLOB_DAT); 18124b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_JUMP_SLOT); 18134b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_RELATIVE); 18144b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GOTOFF32); 18154b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_BASE_PREL); 18164b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GOT_BREL); 18174b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PLT32); 18184b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_CALL); 18194b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_JUMP24); 18204b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_JUMP24); 18214b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_BASE_ABS); 18224b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_PCREL_7_0); 18234b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_PCREL_15_8); 18244b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_PCREL_23_15); 18254b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDR_SBREL_11_0_NC); 18264b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_SBREL_19_12_NC); 18274b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_SBREL_27_20_CK); 18284b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TARGET1); 18294b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_SBREL31); 18304b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_V4BX); 18314b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TARGET2); 18324b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PREL31); 18334b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_MOVW_ABS_NC); 18344b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_MOVT_ABS); 18354b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_MOVW_PREL_NC); 18364b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_MOVT_PREL); 18374b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_MOVW_ABS_NC); 18384b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_MOVT_ABS); 18394b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_MOVW_PREL_NC); 18404b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_MOVT_PREL); 18414b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_JUMP19); 18424b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_JUMP6); 18434b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_ALU_PREL_11_0); 18444b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_PC12); 18454b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ABS32_NOI); 18464b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_REL32_NOI); 18474b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_PC_G0_NC); 18484b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_PC_G0); 18494b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_PC_G1_NC); 18504b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_PC_G1); 18514b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_PC_G2); 18524b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDR_PC_G1); 18534b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDR_PC_G2); 18544b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDRS_PC_G0); 18554b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDRS_PC_G1); 18564b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDRS_PC_G2); 18574b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDC_PC_G0); 18584b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDC_PC_G1); 18594b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDC_PC_G2); 18604b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_SB_G0_NC); 18614b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_SB_G0); 18624b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_SB_G1_NC); 18634b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_SB_G1); 18644b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ALU_SB_G2); 18654b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDR_SB_G0); 18664b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDR_SB_G1); 18674b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDR_SB_G2); 18684b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDRS_SB_G0); 18694b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDRS_SB_G1); 18704b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDRS_SB_G2); 18714b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDC_SB_G0); 18724b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDC_SB_G1); 18734b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_LDC_SB_G2); 18744b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_MOVW_BREL_NC); 18754b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_MOVT_BREL); 18764b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_MOVW_BREL); 18774b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_MOVW_BREL_NC); 18784b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_MOVT_BREL); 18794b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_MOVW_BREL); 18804b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_GOTDESC); 18814b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_CALL); 18824b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_DESCSEQ); 18834b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_TLS_CALL); 18844b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PLT32_ABS); 18854b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GOT_ABS); 18864b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GOT_PREL); 18874b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GOT_BREL12); 18884b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GOTOFF12); 18894b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GOTRELAX); 18904b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GNU_VTENTRY); 18914b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_GNU_VTINHERIT); 18924b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_JUMP11); 18934b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_JUMP8); 18944b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_GD32); 18954b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_LDM32); 18964b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_LDO32); 18974b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_IE32); 18984b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_LE32); 18994b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_LDO12); 19004b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_LE12); 19014b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_TLS_IE12GP); 19024b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_0); 19034b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_1); 19044b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_2); 19054b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_3); 19064b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_4); 19074b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_5); 19084b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_6); 19094b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_7); 19104b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_8); 19114b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_9); 19124b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_10); 19134b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_11); 19144b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_12); 19154b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_13); 19164b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_14); 19174b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_PRIVATE_15); 19184b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_ME_TOO); 19194b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_TLS_DESCSEQ16); 19204b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_ARM_THM_TLS_DESCSEQ32); 1921346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck default: break; 19224b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien } 19234b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien break; 192450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow case ELF::EM_HEXAGON: 1925346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck switch (Type) { 192650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_NONE); 192750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B22_PCREL); 192850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B15_PCREL); 192950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B7_PCREL); 193050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_LO16); 193150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_HI16); 193250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_32); 193350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_16); 193450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_8); 193550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GPREL16_0); 193650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GPREL16_1); 193750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GPREL16_2); 193850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GPREL16_3); 193950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_HL16); 194050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B13_PCREL); 194150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B9_PCREL); 194250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B32_PCREL_X); 194350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_32_6_X); 194450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B22_PCREL_X); 194550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B15_PCREL_X); 194650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B13_PCREL_X); 194750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B9_PCREL_X); 194850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B7_PCREL_X); 194950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_16_X); 195050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_12_X); 195150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_11_X); 195250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_10_X); 195350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_9_X); 195450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_8_X); 195550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_7_X); 195650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_6_X); 195750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_32_PCREL); 195850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_COPY); 195950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GLOB_DAT); 196050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_JMP_SLOT); 196150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_RELATIVE); 196250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_PLT_B22_PCREL); 196350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_LO16); 196450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_HI16); 196550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_32); 196650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_LO16); 196750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_HI16); 196850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_32); 196950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_16); 197050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPMOD_32); 197150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_LO16); 197250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_HI16); 197350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_32); 197450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_16); 197550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_PLT_B22_PCREL); 197650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_LO16); 197750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_HI16); 197850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_32); 197950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_16); 198050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_LO16); 198150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_HI16); 198250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_32); 198350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_LO16); 198450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_HI16); 198550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_32); 198650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_16); 198750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_LO16); 198850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_HI16); 198950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_32); 199050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_16); 199150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_6_PCREL_X); 199250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_32_6_X); 199350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_16_X); 199450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_11_X); 199550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_32_6_X); 199650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_16_X); 199750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_11_X); 199850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_32_6_X); 199950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_16_X); 200050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_11_X); 200150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_32_6_X); 200250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_16_X); 200350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_11_X); 200450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_32_6_X); 200550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_16_X); 200650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_32_6_X); 200750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_16_X); 200850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_11_X); 200950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_32_6_X); 201050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_16_X); 201150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_11_X); 2012346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck default: break; 201350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow } 201450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow break; 2015a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck case ELF::EM_PPC: 2016a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck switch (Type) { 2017a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_NONE); 2018a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR32); 2019a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR24); 2020a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR16); 2021a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR16_LO); 2022a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR16_HI); 2023a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR16_HA); 2024a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR14); 2025a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR14_BRTAKEN); 2026a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_ADDR14_BRNTAKEN); 2027a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_REL24); 2028a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_REL14); 2029a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_REL14_BRTAKEN); 2030a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_REL14_BRNTAKEN); 2031a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_REL32); 2032a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_TPREL16_LO); 2033a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC_TPREL16_HA); 2034a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck default: break; 2035a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck } 2036a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck break; 2037a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck case ELF::EM_PPC64: 2038a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck switch (Type) { 2039a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_NONE); 2040a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR32); 2041c37077af7bfdc22da2d267eee7905927dd5fdd17Ulrich Weigand LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR24); 2042c37077af7bfdc22da2d267eee7905927dd5fdd17Ulrich Weigand LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR16); 2043a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR16_LO); 2044a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR16_HI); 2045c37077af7bfdc22da2d267eee7905927dd5fdd17Ulrich Weigand LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR16_HA); 2046a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR14); 2047c37077af7bfdc22da2d267eee7905927dd5fdd17Ulrich Weigand LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR14_BRTAKEN); 2048c37077af7bfdc22da2d267eee7905927dd5fdd17Ulrich Weigand LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR14_BRNTAKEN); 2049a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_REL24); 2050c37077af7bfdc22da2d267eee7905927dd5fdd17Ulrich Weigand LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_REL14); 2051c37077af7bfdc22da2d267eee7905927dd5fdd17Ulrich Weigand LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_REL14_BRTAKEN); 2052c37077af7bfdc22da2d267eee7905927dd5fdd17Ulrich Weigand LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_REL14_BRNTAKEN); 2053a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_REL32); 2054a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR64); 2055a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR16_HIGHER); 2056a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR16_HIGHEST); 2057a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_REL64); 2058a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TOC16); 2059a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TOC16_LO); 2060a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TOC16_HA); 2061a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TOC); 2062a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR16_DS); 2063a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_ADDR16_LO_DS); 2064a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TOC16_DS); 2065a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TOC16_LO_DS); 2066a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TLS); 2067a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TPREL16_LO); 2068a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TPREL16_HA); 2069a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_DTPREL16_LO); 2070a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_DTPREL16_HA); 2071a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_GOT_TLSGD16_LO); 2072a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_GOT_TLSGD16_HA); 2073a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_GOT_TLSLD16_LO); 2074a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_GOT_TLSLD16_HA); 2075a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_GOT_TPREL16_LO_DS); 2076a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_GOT_TPREL16_HA); 2077a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TLSGD); 2078a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_PPC64_TLSLD); 2079a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck default: break; 2080a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck } 2081a6cd815994a30888d579e7731a98e668f07a5965Nico Rieck break; 2082820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford case ELF::EM_S390: 2083820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford switch (Type) { 2084820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_NONE); 2085820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_8); 2086820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_12); 2087820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_16); 2088820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_32); 2089820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PC32); 2090820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOT12); 2091820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOT32); 2092820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PLT32); 2093820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_COPY); 2094820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GLOB_DAT); 2095820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_JMP_SLOT); 2096820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_RELATIVE); 2097820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTOFF); 2098820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTPC); 2099820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOT16); 2100820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PC16); 2101820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PC16DBL); 2102820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PLT16DBL); 2103820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PC32DBL); 2104820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PLT32DBL); 2105820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTPCDBL); 2106820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_64); 2107820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PC64); 2108820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOT64); 2109820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PLT64); 2110820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTENT); 2111820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTOFF16); 2112820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTOFF64); 2113820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTPLT12); 2114820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTPLT16); 2115820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTPLT32); 2116820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTPLT64); 2117820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTPLTENT); 2118820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PLTOFF16); 2119820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PLTOFF32); 2120820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_PLTOFF64); 2121820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_LOAD); 2122820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_GDCALL); 2123820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_LDCALL); 2124820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_GD32); 2125820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_GD64); 2126820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_GOTIE12); 2127820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_GOTIE32); 2128820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_GOTIE64); 2129820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_LDM32); 2130820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_LDM64); 2131820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_IE32); 2132820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_IE64); 2133820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_IEENT); 2134820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_LE32); 2135820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_LE64); 2136820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_LDO32); 2137820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_LDO64); 2138820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_DTPMOD); 2139820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_DTPOFF); 2140820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_TPOFF); 2141820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_20); 2142820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOT20); 2143820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_GOTPLT20); 2144820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_TLS_GOTIE20); 2145820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_390_IRELATIVE); 2146820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford default: break; 2147820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford } 2148820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford break; 2149346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck default: break; 2150f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2151346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck return Res; 2152f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2153f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2154f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#undef LLVM_ELF_SWITCH_RELOC_TYPE_NAME 2155f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2156ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2157346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieckerror_code ELFObjectFile<ELFT>::getRelocationTypeName( 2158346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck DataRefImpl Rel, SmallVectorImpl<char> &Result) const { 21597486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *sec = getRelSection(Rel); 2160346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck uint32_t type; 2161346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck switch (sec->sh_type) { 2162346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck default : 2163346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck return object_error::parse_failed; 2164346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck case ELF::SHT_REL : { 2165346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck type = getRel(Rel)->getType(isMips64EL()); 2166346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck break; 2167346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck } 2168346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck case ELF::SHT_RELA : { 2169346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck type = getRela(Rel)->getType(isMips64EL()); 2170346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck break; 2171346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck } 2172346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck } 2173346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck 2174346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck if (!isMips64EL()) { 2175346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck StringRef Name = getRelocationTypeName(type); 2176346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck Result.append(Name.begin(), Name.end()); 2177346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck } else { 2178346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck uint8_t Type1 = (type >> 0) & 0xFF; 2179346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck uint8_t Type2 = (type >> 8) & 0xFF; 2180346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck uint8_t Type3 = (type >> 16) & 0xFF; 2181346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck 2182346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck // Concat all three relocation type names. 2183346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck StringRef Name = getRelocationTypeName(Type1); 2184346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck Result.append(Name.begin(), Name.end()); 2185346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck 2186346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck Name = getRelocationTypeName(Type2); 2187346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck Result.append(1, '/'); 2188346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck Result.append(Name.begin(), Name.end()); 2189346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck 2190346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck Name = getRelocationTypeName(Type3); 2191346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck Result.append(1, '/'); 2192346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck Result.append(Name.begin(), Name.end()); 2193346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck } 2194346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck 2195346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck return object_error::success; 2196346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck} 2197346801a5c6e1542bd69d951f95efd9e582e9d348Nico Rieck 2198346801a5c6e1542bd69d951f95efd9e582e9d348Nico Riecktemplate<class ELFT> 2199167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindolaerror_code ELFObjectFile<ELFT>::getRelocationAddend( 2200ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer DataRefImpl Rel, int64_t &Result) const { 22017486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *sec = getRelSection(Rel); 2202f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (sec->sh_type) { 2203f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default : 2204f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Invalid section type in Rel!"); 2205f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_REL : { 2206f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = 0; 2207f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 2208f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2209f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::SHT_RELA : { 2210f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = getRela(Rel)->r_addend; 2211f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 2212f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2213f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2214f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2215f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2216ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2217ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getRelocationValueString( 2218ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer DataRefImpl Rel, SmallVectorImpl<char> &Result) const { 22197486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola const Elf_Shdr *sec = getRelSection(Rel); 2220f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky uint8_t type; 2221f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky StringRef res; 2222f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky int64_t addend = 0; 2223f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky uint16_t symbol_index = 0; 2224f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (sec->sh_type) { 2225033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky default: 2226f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::parse_failed; 2227033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::SHT_REL: { 2228d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola type = getRel(Rel)->getType(isMips64EL()); 2229d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola symbol_index = getRel(Rel)->getSymbol(isMips64EL()); 2230f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // TODO: Read implicit addend from section data. 2231f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 2232f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2233033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::SHT_RELA: { 2234d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola type = getRela(Rel)->getType(isMips64EL()); 2235d787a41b118a3724d1df87dc3d38cc3fddb3a145Rafael Espindola symbol_index = getRela(Rel)->getSymbol(isMips64EL()); 2236f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky addend = getRela(Rel)->r_addend; 2237f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 2238f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2239f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2240f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Sym *symb = getEntry<Elf_Sym>(sec->sh_link, symbol_index); 2241f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky StringRef symname; 2242dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer if (error_code ec = getSymbolName(getSection(sec->sh_link), symb, symname)) 2243f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return ec; 2244f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (Header->e_machine) { 2245f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_X86_64: 2246f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch (type) { 2247033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::R_X86_64_PC8: 2248033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::R_X86_64_PC16: 2249f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::R_X86_64_PC32: { 2250f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky std::string fmtbuf; 2251f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky raw_string_ostream fmt(fmtbuf); 2252f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky fmt << symname << (addend < 0 ? "" : "+") << addend << "-P"; 2253f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky fmt.flush(); 2254f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result.append(fmtbuf.begin(), fmtbuf.end()); 2255f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2256033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky break; 2257033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::R_X86_64_8: 2258033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::R_X86_64_16: 2259033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::R_X86_64_32: 2260033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::R_X86_64_32S: 2261033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky case ELF::R_X86_64_64: { 2262033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky std::string fmtbuf; 2263033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky raw_string_ostream fmt(fmtbuf); 2264033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky fmt << symname << (addend < 0 ? "" : "+") << addend; 2265033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky fmt.flush(); 2266033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky Result.append(fmtbuf.begin(), fmtbuf.end()); 2267033d182589aa46719a47f38fc7021e41aa5b6d43Nick Lewycky } 2268f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 2269f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 2270f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky res = "Unknown"; 2271f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2272f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky break; 227372062f5744557e270a38192554c3126ea5f97434Tim Northover case ELF::EM_AARCH64: 22744b6fbf25600a94dc41ba96b174045e50b85862cfLogan Chien case ELF::EM_ARM: 227550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow case ELF::EM_HEXAGON: 227650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow res = symname; 227750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow break; 2278f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 2279f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky res = "Unknown"; 2280f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2281f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (Result.empty()) 2282f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result.append(res.begin(), res.end()); 2283f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 2284f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2285f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2286dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer// Verify that the last byte in the string table in a null. 2287ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2288ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencervoid ELFObjectFile<ELFT>::VerifyStrTab(const Elf_Shdr *sh) const { 2289dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer const char *strtab = (const char*)base() + sh->sh_offset; 2290dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer if (strtab[sh->sh_size - 1] != 0) 2291dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer // FIXME: Proper error handling. 2292dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer report_fatal_error("String table must end with a null terminator!"); 2293dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer} 2294dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer 2295ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2296ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::ELFObjectFile(MemoryBuffer *Object, error_code &ec) 229734461e554ac359cee140434a01facefd25f720f1Michael J. Spencer : ObjectFile(getELFType( 229834461e554ac359cee140434a01facefd25f720f1Michael J. Spencer static_cast<endianness>(ELFT::TargetEndianness) == support::little, 229934461e554ac359cee140434a01facefd25f720f1Michael J. Spencer ELFT::Is64Bits), 23002c6f997290f589b80da903e33718175666557dd7Rafael Espindola Object) 2301f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky , isDyldELFObject(false) 2302f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky , SectionHeaderTable(0) 2303f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky , dot_shstrtab_sec(0) 2304dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer , dot_strtab_sec(0) 23055c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer , dot_dynstr_sec(0) 230697f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer , dot_dynamic_sec(0) 23072d70e263c2b508bf4641273dd89a23149f6f6164David Meyer , dot_gnu_version_sec(0) 23082d70e263c2b508bf4641273dd89a23149f6f6164David Meyer , dot_gnu_version_r_sec(0) 23092d70e263c2b508bf4641273dd89a23149f6f6164David Meyer , dot_gnu_version_d_sec(0) 23102d70e263c2b508bf4641273dd89a23149f6f6164David Meyer , dt_soname(0) 23112d70e263c2b508bf4641273dd89a23149f6f6164David Meyer { 2312f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2313f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const uint64_t FileSize = Data->getBufferSize(); 2314f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2315f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (sizeof(Elf_Ehdr) > FileSize) 2316f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2317f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("File too short!"); 2318f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2319f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Header = reinterpret_cast<const Elf_Ehdr *>(base()); 2320f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2321f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (Header->e_shoff == 0) 2322f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return; 2323f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2324f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const uint64_t SectionTableOffset = Header->e_shoff; 2325f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2326f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (SectionTableOffset + sizeof(Elf_Shdr) > FileSize) 2327f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2328f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Section header table goes past end of file!"); 2329f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2330f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // The getNumSections() call below depends on SectionHeaderTable being set. 2331f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky SectionHeaderTable = 2332f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky reinterpret_cast<const Elf_Shdr *>(base() + SectionTableOffset); 2333f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const uint64_t SectionTableSize = getNumSections() * Header->e_shentsize; 2334f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2335f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (SectionTableOffset + SectionTableSize > FileSize) 2336f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2337f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Section table goes past end of file!"); 2338f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2339f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // To find the symbol tables we walk the section table to find SHT_SYMTAB. 2340f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr* SymbolTableSectionHeaderIndex = 0; 2341f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr* sh = SectionHeaderTable; 2342dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer 2343bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolTableIndex = -1; 2344bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola DynamicSymbolTableIndex = -1; 2345dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer 2346f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky for (uint64_t i = 0, e = getNumSections(); i != e; ++i) { 23472d70e263c2b508bf4641273dd89a23149f6f6164David Meyer switch (sh->sh_type) { 23482d70e263c2b508bf4641273dd89a23149f6f6164David Meyer case ELF::SHT_SYMTAB_SHNDX: { 2349f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (SymbolTableSectionHeaderIndex) 2350f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2351f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("More than one .symtab_shndx!"); 2352f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky SymbolTableSectionHeaderIndex = sh; 23532d70e263c2b508bf4641273dd89a23149f6f6164David Meyer break; 2354f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 23552d70e263c2b508bf4641273dd89a23149f6f6164David Meyer case ELF::SHT_SYMTAB: { 2356bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (SymbolTableIndex != -1) 2357bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola report_fatal_error("More than one SHT_SYMTAB!"); 2358bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolTableIndex = i; 23592d70e263c2b508bf4641273dd89a23149f6f6164David Meyer break; 2360f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 23612d70e263c2b508bf4641273dd89a23149f6f6164David Meyer case ELF::SHT_DYNSYM: { 2362bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (DynamicSymbolTableIndex != -1) 2363dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer // FIXME: Proper error handling. 2364bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola report_fatal_error("More than one SHT_DYNSYM!"); 2365bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola DynamicSymbolTableIndex = i; 23662d70e263c2b508bf4641273dd89a23149f6f6164David Meyer break; 2367dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer } 23682d70e263c2b508bf4641273dd89a23149f6f6164David Meyer case ELF::SHT_REL: 23697486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola case ELF::SHT_RELA: 23702d70e263c2b508bf4641273dd89a23149f6f6164David Meyer break; 23712d70e263c2b508bf4641273dd89a23149f6f6164David Meyer case ELF::SHT_DYNAMIC: { 23725c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer if (dot_dynamic_sec != NULL) 23735c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer // FIXME: Proper error handling. 23745c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer report_fatal_error("More than one .dynamic!"); 23755c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer dot_dynamic_sec = sh; 23762d70e263c2b508bf4641273dd89a23149f6f6164David Meyer break; 23772d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 23782d70e263c2b508bf4641273dd89a23149f6f6164David Meyer case ELF::SHT_GNU_versym: { 23792d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (dot_gnu_version_sec != NULL) 23802d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // FIXME: Proper error handling. 23812d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("More than one .gnu.version section!"); 23822d70e263c2b508bf4641273dd89a23149f6f6164David Meyer dot_gnu_version_sec = sh; 23832d70e263c2b508bf4641273dd89a23149f6f6164David Meyer break; 23842d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 23852d70e263c2b508bf4641273dd89a23149f6f6164David Meyer case ELF::SHT_GNU_verdef: { 23862d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (dot_gnu_version_d_sec != NULL) 23872d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // FIXME: Proper error handling. 23882d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("More than one .gnu.version_d section!"); 23892d70e263c2b508bf4641273dd89a23149f6f6164David Meyer dot_gnu_version_d_sec = sh; 23902d70e263c2b508bf4641273dd89a23149f6f6164David Meyer break; 23912d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 23922d70e263c2b508bf4641273dd89a23149f6f6164David Meyer case ELF::SHT_GNU_verneed: { 23932d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (dot_gnu_version_r_sec != NULL) 23942d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // FIXME: Proper error handling. 23952d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("More than one .gnu.version_r section!"); 23962d70e263c2b508bf4641273dd89a23149f6f6164David Meyer dot_gnu_version_r_sec = sh; 23972d70e263c2b508bf4641273dd89a23149f6f6164David Meyer break; 23982d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 23995c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer } 2400f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ++sh; 2401f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2402f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2403f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // Get string table sections. 2404f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky dot_shstrtab_sec = getSection(getStringTableIndex()); 2405f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (dot_shstrtab_sec) { 2406f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // Verify that the last byte in the string table in a null. 2407dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer VerifyStrTab(dot_shstrtab_sec); 2408f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2409f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2410f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // Merge this into the above loop. 2411f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky for (const char *i = reinterpret_cast<const char *>(SectionHeaderTable), 2412f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky *e = i + getNumSections() * Header->e_shentsize; 2413f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky i != e; i += Header->e_shentsize) { 2414f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sh = reinterpret_cast<const Elf_Shdr*>(i); 2415f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (sh->sh_type == ELF::SHT_STRTAB) { 2416f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky StringRef SectionName(getString(dot_shstrtab_sec, sh->sh_name)); 2417f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (SectionName == ".strtab") { 2418f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (dot_strtab_sec != 0) 2419f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2420f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Already found section named .strtab!"); 2421f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky dot_strtab_sec = sh; 2422dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer VerifyStrTab(dot_strtab_sec); 2423dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer } else if (SectionName == ".dynstr") { 2424dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer if (dot_dynstr_sec != 0) 2425dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer // FIXME: Proper error handling. 2426dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer report_fatal_error("Already found section named .dynstr!"); 2427dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer dot_dynstr_sec = sh; 2428dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer VerifyStrTab(dot_dynstr_sec); 2429f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2430f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2431f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2432f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2433f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // Build symbol name side-mapping if there is one. 2434f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (SymbolTableSectionHeaderIndex) { 2435f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Word *ShndxTable = reinterpret_cast<const Elf_Word*>(base() + 2436f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky SymbolTableSectionHeaderIndex->sh_offset); 2437f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky error_code ec; 2438f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky for (symbol_iterator si = begin_symbols(), 2439f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky se = end_symbols(); si != se; si.increment(ec)) { 2440f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (ec) 2441f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Fewer extended symbol table entries than symbols!"); 2442f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (*ShndxTable != ELF::SHN_UNDEF) 2443f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ExtendedSymbolTable[getSymbol(si->getRawDataRefImpl())] = *ShndxTable; 2444f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ++ShndxTable; 2445f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2446f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2447f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2448f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2449f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran// Get the symbol table index in the symtab section given a symbol 2450ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2451ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spenceruint64_t ELFObjectFile<ELFT>::getSymbolIndex(const Elf_Sym *Sym) const { 2452bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola const Elf_Shdr *SymTab = getSection(SymbolTableIndex); 2453f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran uintptr_t SymLoc = uintptr_t(Sym); 2454f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran uintptr_t SymTabLoc = uintptr_t(base() + SymTab->sh_offset); 2455f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran assert(SymLoc > SymTabLoc && "Symbol not in symbol table!"); 2456f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran uint64_t SymOffset = SymLoc - SymTabLoc; 2457f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran assert(SymOffset % SymTab->sh_entsize == 0 && 2458f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran "Symbol not multiple of symbol size!"); 2459f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran return SymOffset / SymTab->sh_entsize; 2460f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran} 2461f7414823871c7707a6af61c19e5f9ce3a4fa861cShankar Easwaran 2462ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2463ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencersymbol_iterator ELFObjectFile<ELFT>::begin_symbols() const { 2464f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky DataRefImpl SymbolData; 2465bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (SymbolTableIndex == -1) { 2466bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.a = 0; 2467bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = 0; 2468f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } else { 2469f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky SymbolData.d.a = 1; // The 0th symbol in ELF is fake. 2470bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = SymbolTableIndex; 2471f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2472f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return symbol_iterator(SymbolRef(SymbolData, this)); 2473f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2474f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2475ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2476ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencersymbol_iterator ELFObjectFile<ELFT>::end_symbols() const { 2477f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky DataRefImpl SymbolData; 2478bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (SymbolTableIndex == -1) { 2479bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.a = 0; 2480bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = 0; 2481bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola } else { 2482bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola const Elf_Shdr *SymbolTableSection = getSection(SymbolTableIndex); 2483bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.a = SymbolTableSection->getEntityCount(); 2484bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = SymbolTableIndex; 2485bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola } 2486f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return symbol_iterator(SymbolRef(SymbolData, this)); 2487f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2488f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2489ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2490ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencersymbol_iterator ELFObjectFile<ELFT>::begin_dynamic_symbols() const { 2491dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer DataRefImpl SymbolData; 2492bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (DynamicSymbolTableIndex == -1) { 2493bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.a = 0; 2494bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = 0; 2495dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer } else { 2496dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer SymbolData.d.a = 1; // The 0th symbol in ELF is fake. 2497bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = DynamicSymbolTableIndex; 2498dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer } 2499dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer return symbol_iterator(SymbolRef(SymbolData, this)); 2500dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer} 2501dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer 2502ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2503ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencersymbol_iterator ELFObjectFile<ELFT>::end_dynamic_symbols() const { 2504dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer DataRefImpl SymbolData; 2505bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (DynamicSymbolTableIndex == -1) { 2506bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.a = 0; 2507bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = 0; 2508bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola } else { 2509bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola const Elf_Shdr *SymbolTableSection = getSection(DynamicSymbolTableIndex); 2510bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.a = SymbolTableSection->getEntityCount(); 2511bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola SymbolData.d.b = DynamicSymbolTableIndex; 2512bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola } 2513dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer return symbol_iterator(SymbolRef(SymbolData, this)); 2514dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer} 2515dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer 2516ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2517ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencersection_iterator ELFObjectFile<ELFT>::begin_sections() const { 2518f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky DataRefImpl ret; 2519f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret.p = reinterpret_cast<intptr_t>(base() + Header->e_shoff); 2520f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return section_iterator(SectionRef(ret, this)); 2521f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2522f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2523ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2524ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencersection_iterator ELFObjectFile<ELFT>::end_sections() const { 2525f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky DataRefImpl ret; 2526f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky ret.p = reinterpret_cast<intptr_t>(base() 2527f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky + Header->e_shoff 2528f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky + (Header->e_shentsize*getNumSections())); 2529f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return section_iterator(SectionRef(ret, this)); 2530f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2531f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2532ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 25332e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencertypename ELFObjectFile<ELFT>::Elf_Dyn_iterator 2534ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::begin_dynamic_table() const { 2535945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer if (dot_dynamic_sec) 25362e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer return Elf_Dyn_iterator(dot_dynamic_sec->sh_entsize, 25372e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer (const char *)base() + dot_dynamic_sec->sh_offset); 25382e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer return Elf_Dyn_iterator(0, 0); 25395c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 25405c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 2541ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 25422e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencertypename ELFObjectFile<ELFT>::Elf_Dyn_iterator 2543d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. SpencerELFObjectFile<ELFT>::end_dynamic_table(bool NULLEnd) const { 2544d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer if (dot_dynamic_sec) { 2545d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer Elf_Dyn_iterator Ret(dot_dynamic_sec->sh_entsize, 2546d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer (const char *)base() + dot_dynamic_sec->sh_offset + 2547d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer dot_dynamic_sec->sh_size); 2548d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer 2549d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer if (NULLEnd) { 2550d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer Elf_Dyn_iterator Start = begin_dynamic_table(); 2551a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer while (Start != Ret && Start->getTag() != ELF::DT_NULL) 2552a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer ++Start; 2553a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer 2554d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer // Include the DT_NULL. 2555d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer if (Start != Ret) 2556d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer ++Start; 2557d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer Ret = Start; 2558d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer } 2559d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer return Ret; 2560d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer } 25612e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer return Elf_Dyn_iterator(0, 0); 25625c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 25635c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 2564ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2565945bc5bde022c790722ca1d05304bb0c986890dbMichael J. SpencerStringRef ELFObjectFile<ELFT>::getLoadName() const { 256697f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer if (!dt_soname) { 256797f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer // Find the DT_SONAME entry 25682e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator it = begin_dynamic_table(); 25692e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator ie = end_dynamic_table(); 2570a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer while (it != ie && it->getTag() != ELF::DT_SONAME) 2571a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer ++it; 2572a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer 257397f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer if (it != ie) { 257497f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer if (dot_dynstr_sec == NULL) 257597f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer report_fatal_error("Dynamic string table is missing"); 257697f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer dt_soname = getString(dot_dynstr_sec, it->getVal()); 257797f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer } else { 257897f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer dt_soname = ""; 257997f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer } 258097f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer } 258197f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer return dt_soname; 258297f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer} 258397f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer 2584ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2585ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerlibrary_iterator ELFObjectFile<ELFT>::begin_libraries_needed() const { 25865c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer // Find the first DT_NEEDED entry 25872e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator i = begin_dynamic_table(); 25882e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator e = end_dynamic_table(); 2589a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer while (i != e && i->getTag() != ELF::DT_NEEDED) 2590a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer ++i; 2591945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer 2592945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer DataRefImpl DRI; 2593def0c1f756562601829364e3fca4bd1f0407316eMichael J. Spencer DRI.p = reinterpret_cast<uintptr_t>(i.get()); 2594945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer return library_iterator(LibraryRef(DRI, this)); 25955c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 25965c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 2597ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2598ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getLibraryNext(DataRefImpl Data, 2599ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer LibraryRef &Result) const { 26005c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer // Use the same DataRefImpl format as DynRef. 26012e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator i = Elf_Dyn_iterator(dot_dynamic_sec->sh_entsize, 26022e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer reinterpret_cast<const char *>(Data.p)); 26032e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator e = end_dynamic_table(); 26045c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 2605a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer // Skip the current dynamic table entry and find the next DT_NEEDED entry. 2606a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer do 2607a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer ++i; 2608a9f83517fccbf5f0daf82afdddff81a0e0aea389Benjamin Kramer while (i != e && i->getTag() != ELF::DT_NEEDED); 2609945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer 2610945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer DataRefImpl DRI; 2611def0c1f756562601829364e3fca4bd1f0407316eMichael J. Spencer DRI.p = reinterpret_cast<uintptr_t>(i.get()); 2612945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer Result = LibraryRef(DRI, this); 26135c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer return object_error::success; 26145c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 26155c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 2616ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2617ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getLibraryPath(DataRefImpl Data, 2618ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Res) const { 26192e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator i = Elf_Dyn_iterator(dot_dynamic_sec->sh_entsize, 26202e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer reinterpret_cast<const char *>(Data.p)); 26215c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer if (i == end_dynamic_table()) 26225c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer report_fatal_error("getLibraryPath() called on iterator end"); 26235c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 26245c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer if (i->getTag() != ELF::DT_NEEDED) 26255c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer report_fatal_error("Invalid library_iterator"); 26265c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 26275c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer // This uses .dynstr to lookup the name of the DT_NEEDED entry. 26285c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer // THis works as long as DT_STRTAB == .dynstr. This is true most of 26295c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer // the time, but the specification allows exceptions. 26305c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer // TODO: This should really use DT_STRTAB instead. Doing this requires 26315c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer // reading the program headers. 26325c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer if (dot_dynstr_sec == NULL) 26335c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer report_fatal_error("Dynamic string table is missing"); 26345c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer Res = getString(dot_dynstr_sec, i->getVal()); 26355c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer return object_error::success; 26365c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 26375c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 2638ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2639ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerlibrary_iterator ELFObjectFile<ELFT>::end_libraries_needed() const { 26402e0742f76c6081b24eb64b3967c3d7903007dcbdMichael J. Spencer Elf_Dyn_iterator e = end_dynamic_table(); 2641945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer DataRefImpl DRI; 2642def0c1f756562601829364e3fca4bd1f0407316eMichael J. Spencer DRI.p = reinterpret_cast<uintptr_t>(e.get()); 2643945bc5bde022c790722ca1d05304bb0c986890dbMichael J. Spencer return library_iterator(LibraryRef(DRI, this)); 26445c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 26455c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 2646ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2647ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spenceruint8_t ELFObjectFile<ELFT>::getBytesInAddress() const { 2648ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer return ELFT::Is64Bits ? 8 : 4; 2649f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2650f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2651ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2652ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerStringRef ELFObjectFile<ELFT>::getFileFormatName() const { 2653f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch(Header->e_ident[ELF::EI_CLASS]) { 2654f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::ELFCLASS32: 2655f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch(Header->e_machine) { 2656f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_386: 2657f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return "ELF32-i386"; 2658f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_X86_64: 2659f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return "ELF32-x86-64"; 2660f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_ARM: 2661f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return "ELF32-arm"; 266250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow case ELF::EM_HEXAGON: 266350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow return "ELF32-hexagon"; 26643802947dec01dcf95d1b4b6545e88e549744e2b1NAKAMURA Takumi case ELF::EM_MIPS: 26653802947dec01dcf95d1b4b6545e88e549744e2b1NAKAMURA Takumi return "ELF32-mips"; 2666769b70ec4f22129317631eab8c87bb5b0e45a4a5Benjamin Kramer case ELF::EM_PPC: 2667769b70ec4f22129317631eab8c87bb5b0e45a4a5Benjamin Kramer return "ELF32-ppc"; 2668f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 2669f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return "ELF32-unknown"; 2670f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2671f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::ELFCLASS64: 2672f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch(Header->e_machine) { 2673f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_386: 2674f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return "ELF64-i386"; 2675f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_X86_64: 2676f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return "ELF64-x86-64"; 267772062f5744557e270a38192554c3126ea5f97434Tim Northover case ELF::EM_AARCH64: 267872062f5744557e270a38192554c3126ea5f97434Tim Northover return "ELF64-aarch64"; 2679a5e01b1314b48c364c092288c2aef95c29a79583Adhemerval Zanella case ELF::EM_PPC64: 2680a5e01b1314b48c364c092288c2aef95c29a79583Adhemerval Zanella return "ELF64-ppc64"; 2681820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford case ELF::EM_S390: 2682820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford return "ELF64-s390"; 2683f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 2684f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return "ELF64-unknown"; 2685f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2686f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 2687f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2688f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Invalid ELFCLASS!"); 2689f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2690f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2691f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2692ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2693ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerunsigned ELFObjectFile<ELFT>::getArch() const { 2694f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky switch(Header->e_machine) { 2695f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_386: 2696f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return Triple::x86; 2697f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_X86_64: 2698f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return Triple::x86_64; 269972062f5744557e270a38192554c3126ea5f97434Tim Northover case ELF::EM_AARCH64: 270072062f5744557e270a38192554c3126ea5f97434Tim Northover return Triple::aarch64; 2701f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky case ELF::EM_ARM: 2702f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return Triple::arm; 270350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow case ELF::EM_HEXAGON: 270450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow return Triple::hexagon; 2705b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka case ELF::EM_MIPS: 27066623730296fbe6d639058195772566ffa10e9ad2Dmitri Gribenko return (ELFT::TargetEndianness == support::little) ? 2707b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka Triple::mipsel : Triple::mips; 2708a5e01b1314b48c364c092288c2aef95c29a79583Adhemerval Zanella case ELF::EM_PPC64: 2709a5e01b1314b48c364c092288c2aef95c29a79583Adhemerval Zanella return Triple::ppc64; 2710820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford case ELF::EM_S390: 2711820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford return Triple::systemz; 2712f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky default: 2713f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return Triple::UnknownArch; 2714f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2715f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2716f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2717ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2718ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spenceruint64_t ELFObjectFile<ELFT>::getNumSections() const { 2719f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky assert(Header && "Header not initialized!"); 2720f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (Header->e_shnum == ELF::SHN_UNDEF) { 2721f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky assert(SectionHeaderTable && "SectionHeaderTable not initialized!"); 2722f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return SectionHeaderTable->sh_size; 2723f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2724f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return Header->e_shnum; 2725f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2726f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2727ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2728f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskyuint64_t 2729ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getStringTableIndex() const { 2730f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (Header->e_shnum == ELF::SHN_UNDEF) { 2731f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (Header->e_shstrndx == ELF::SHN_HIRESERVE) 2732f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return SectionHeaderTable->sh_link; 2733f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (Header->e_shstrndx >= getNumSections()) 2734f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return 0; 2735f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2736f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return Header->e_shstrndx; 2737f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2738f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2739ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2740f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskytemplate<typename T> 2741f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskyinline const T * 2742bcb1ea8ef62fba49d0e634e1943f829687323314Rafael EspindolaELFObjectFile<ELFT>::getEntry(uint32_t Section, uint32_t Entry) const { 2743f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return getEntry<T>(getSection(Section), Entry); 2744f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2745f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2746ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2747f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskytemplate<typename T> 2748f4eff4baeb44f9dee988e9293d029dcaa359420dEli Benderskyinline const T * 2749ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getEntry(const Elf_Shdr * Section, uint32_t Entry) const { 2750f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return reinterpret_cast<const T *>( 2751f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky base() 2752f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky + Section->sh_offset 2753f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky + (Entry * Section->sh_entsize)); 2754f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2755f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2756ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2757ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Sym * 2758ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getSymbol(DataRefImpl Symb) const { 2759bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola return getEntry<Elf_Sym>(Symb.d.b, Symb.d.a); 2760f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2761f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2762ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2763ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Rel * 2764ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getRel(DataRefImpl Rel) const { 27657486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola return getEntry<Elf_Rel>(Rel.d.a, Rel.d.b); 2766f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2767f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2768ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2769ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Rela * 2770ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getRela(DataRefImpl Rela) const { 27717486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola return getEntry<Elf_Rela>(Rela.d.a, Rela.d.b); 2772f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2773f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2774ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2775ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Shdr * 2776ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getSection(DataRefImpl Symb) const { 2777f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *sec = getSection(Symb.d.b); 2778f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (sec->sh_type != ELF::SHT_SYMTAB || sec->sh_type != ELF::SHT_DYNSYM) 2779f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2780f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Invalid symbol table section!"); 2781f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return sec; 2782f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2783f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2784ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2785ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst typename ELFObjectFile<ELFT>::Elf_Shdr * 2786ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. SpencerELFObjectFile<ELFT>::getSection(uint32_t index) const { 2787f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (index == 0) 2788f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return 0; 2789f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (!SectionHeaderTable || index >= getNumSections()) 2790f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2791f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Invalid section index!"); 2792f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2793f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return reinterpret_cast<const Elf_Shdr *>( 2794f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky reinterpret_cast<const char *>(SectionHeaderTable) 2795f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky + (index * Header->e_shentsize)); 2796f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2797f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2798ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2799ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst char *ELFObjectFile<ELFT>::getString(uint32_t section, 2800ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer ELF::Elf32_Word offset) const { 2801f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return getString(getSection(section), offset); 2802f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2803f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2804ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2805ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencerconst char *ELFObjectFile<ELFT>::getString(const Elf_Shdr *section, 2806ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer ELF::Elf32_Word offset) const { 2807f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky assert(section && section->sh_type == ELF::SHT_STRTAB && "Invalid section!"); 2808f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (offset >= section->sh_size) 2809f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky // FIXME: Proper error handling. 2810f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky report_fatal_error("Symbol name offset outside of string table!"); 2811f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return (const char *)base() + section->sh_offset + offset; 2812f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2813f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2814ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2815ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolName(const Elf_Shdr *section, 2816ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer const Elf_Sym *symb, 2817ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Result) const { 2818f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (symb->st_name == 0) { 2819f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky const Elf_Shdr *section = getSection(symb); 2820f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky if (!section) 2821f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = ""; 2822f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky else 2823f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky Result = getString(dot_shstrtab_sec, section->sh_name); 2824f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 2825f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky } 2826f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2827bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (DynamicSymbolTableIndex != -1 && 2828bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola section == getSection(DynamicSymbolTableIndex)) { 2829dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer // Symbol is in .dynsym, use .dynstr string table 2830dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer Result = getString(dot_dynstr_sec, symb->st_name); 2831dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer } else { 2832dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer // Use the default symbol table name section. 2833dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer Result = getString(dot_strtab_sec, symb->st_name); 2834dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer } 2835f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky return object_error::success; 2836f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2837f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2838ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2839ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSectionName(const Elf_Shdr *section, 2840ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Result) const { 28419dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta Result = StringRef(getString(dot_shstrtab_sec, section->sh_name)); 28429dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta return object_error::success; 28439dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta} 28449dc5b3e6c423733d5d7d553521b48ea30518f37cAnshuman Dasgupta 2845ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencertemplate<class ELFT> 2846ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencererror_code ELFObjectFile<ELFT>::getSymbolVersion(const Elf_Shdr *section, 2847ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer const Elf_Sym *symb, 2848ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer StringRef &Version, 2849ac97f5ce486d1ca2967607028eacddd860aaddd0Michael J. Spencer bool &IsDefault) const { 28502d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Handle non-dynamic symbols. 2851bcb1ea8ef62fba49d0e634e1943f829687323314Rafael Espindola if (section != getSection(DynamicSymbolTableIndex)) { 28522d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Non-dynamic symbols can have versions in their names 28532d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // A name of the form 'foo@V1' indicates version 'V1', non-default. 28542d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // A name of the form 'foo@@V2' indicates version 'V2', default version. 28552d70e263c2b508bf4641273dd89a23149f6f6164David Meyer StringRef Name; 28562d70e263c2b508bf4641273dd89a23149f6f6164David Meyer error_code ec = getSymbolName(section, symb, Name); 28572d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (ec != object_error::success) 28582d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return ec; 28592d70e263c2b508bf4641273dd89a23149f6f6164David Meyer size_t atpos = Name.find('@'); 28602d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (atpos == StringRef::npos) { 28612d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Version = ""; 28622d70e263c2b508bf4641273dd89a23149f6f6164David Meyer IsDefault = false; 28632d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return object_error::success; 28642d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 28652d70e263c2b508bf4641273dd89a23149f6f6164David Meyer ++atpos; 28662d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (atpos < Name.size() && Name[atpos] == '@') { 28672d70e263c2b508bf4641273dd89a23149f6f6164David Meyer IsDefault = true; 28682d70e263c2b508bf4641273dd89a23149f6f6164David Meyer ++atpos; 28692d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } else { 28702d70e263c2b508bf4641273dd89a23149f6f6164David Meyer IsDefault = false; 28712d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 28722d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Version = Name.substr(atpos); 28732d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return object_error::success; 28742d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 28752d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 28762d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // This is a dynamic symbol. Look in the GNU symbol version table. 28772d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (dot_gnu_version_sec == NULL) { 28782d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // No version table. 28792d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Version = ""; 28802d70e263c2b508bf4641273dd89a23149f6f6164David Meyer IsDefault = false; 28812d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return object_error::success; 28822d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 28832d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 28842d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Determine the position in the symbol table of this entry. 28852d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const char *sec_start = (const char*)base() + section->sh_offset; 28862d70e263c2b508bf4641273dd89a23149f6f6164David Meyer size_t entry_index = ((const char*)symb - sec_start)/section->sh_entsize; 28872d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 28882d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Get the corresponding version index entry 28892d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const Elf_Versym *vs = getEntry<Elf_Versym>(dot_gnu_version_sec, entry_index); 28902d70e263c2b508bf4641273dd89a23149f6f6164David Meyer size_t version_index = vs->vs_index & ELF::VERSYM_VERSION; 28912d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 28922d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Special markers for unversioned symbols. 28932d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (version_index == ELF::VER_NDX_LOCAL || 28942d70e263c2b508bf4641273dd89a23149f6f6164David Meyer version_index == ELF::VER_NDX_GLOBAL) { 28952d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Version = ""; 28962d70e263c2b508bf4641273dd89a23149f6f6164David Meyer IsDefault = false; 28972d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return object_error::success; 28982d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 28992d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 29002d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Lookup this symbol in the version table 29012d70e263c2b508bf4641273dd89a23149f6f6164David Meyer LoadVersionMap(); 29022d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (version_index >= VersionMap.size() || VersionMap[version_index].isNull()) 29032d70e263c2b508bf4641273dd89a23149f6f6164David Meyer report_fatal_error("Symbol has version index without corresponding " 29042d70e263c2b508bf4641273dd89a23149f6f6164David Meyer "define or reference entry"); 29052d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const VersionMapEntry &entry = VersionMap[version_index]; 29062d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 29072d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Get the version name string 29082d70e263c2b508bf4641273dd89a23149f6f6164David Meyer size_t name_offset; 29092d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (entry.isVerdef()) { 29102d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // The first Verdaux entry holds the name. 29112d70e263c2b508bf4641273dd89a23149f6f6164David Meyer name_offset = entry.getVerdef()->getAux()->vda_name; 29122d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } else { 29132d70e263c2b508bf4641273dd89a23149f6f6164David Meyer name_offset = entry.getVernaux()->vna_name; 29142d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 29152d70e263c2b508bf4641273dd89a23149f6f6164David Meyer Version = getString(dot_dynstr_sec, name_offset); 29162d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 29172d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Set IsDefault 29182d70e263c2b508bf4641273dd89a23149f6f6164David Meyer if (entry.isVerdef()) { 29192d70e263c2b508bf4641273dd89a23149f6f6164David Meyer IsDefault = !(vs->vs_index & ELF::VERSYM_HIDDEN); 29202d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } else { 29212d70e263c2b508bf4641273dd89a23149f6f6164David Meyer IsDefault = false; 29222d70e263c2b508bf4641273dd89a23149f6f6164David Meyer } 29232d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 29242d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return object_error::success; 29252d70e263c2b508bf4641273dd89a23149f6f6164David Meyer} 29262d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 2927167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola/// FIXME: Maybe we should have a base ElfObjectFile that is not a template 2928167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola/// and make these member functions? 2929167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindolastatic inline error_code getELFRelocationAddend(const RelocationRef R, 2930167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola int64_t &Addend) { 2931167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola const ObjectFile *Obj = R.getObjectFile(); 2932167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola DataRefImpl DRI = R.getRawDataRefImpl(); 2933167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola // Little-endian 32-bit 2934bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) 2935167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola return ELFObj->getRelocationAddend(DRI, Addend); 2936167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola 2937167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola // Big-endian 32-bit 2938bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) 2939167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola return ELFObj->getRelocationAddend(DRI, Addend); 2940167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola 2941167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola // Little-endian 64-bit 2942bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj)) 2943167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola return ELFObj->getRelocationAddend(DRI, Addend); 2944167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola 2945167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola // Big-endian 64-bit 2946bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) 2947167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola return ELFObj->getRelocationAddend(DRI, Addend); 2948167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola 2949167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola llvm_unreachable("Object passed to getELFRelocationAddend() is not ELF"); 2950167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola} 2951167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola 29522d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// This is a generic interface for retrieving GNU symbol version 29532d70e263c2b508bf4641273dd89a23149f6f6164David Meyer/// information from an ELFObjectFile. 29542d70e263c2b508bf4641273dd89a23149f6f6164David Meyerstatic inline error_code GetELFSymbolVersion(const ObjectFile *Obj, 29552d70e263c2b508bf4641273dd89a23149f6f6164David Meyer const SymbolRef &Sym, 29562d70e263c2b508bf4641273dd89a23149f6f6164David Meyer StringRef &Version, 29572d70e263c2b508bf4641273dd89a23149f6f6164David Meyer bool &IsDefault) { 29582d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Little-endian 32-bit 2959bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) 29602d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return ELFObj->getSymbolVersion(Sym, Version, IsDefault); 29612d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 29622d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Big-endian 32-bit 2963bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) 29642d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return ELFObj->getSymbolVersion(Sym, Version, IsDefault); 29652d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 29662d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Little-endian 64-bit 2967bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj)) 29682d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return ELFObj->getSymbolVersion(Sym, Version, IsDefault); 29692d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 29702d70e263c2b508bf4641273dd89a23149f6f6164David Meyer // Big-endian 64-bit 2971bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) 29722d70e263c2b508bf4641273dd89a23149f6f6164David Meyer return ELFObj->getSymbolVersion(Sym, Version, IsDefault); 29732d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 29742d70e263c2b508bf4641273dd89a23149f6f6164David Meyer llvm_unreachable("Object passed to GetELFSymbolVersion() is not ELF"); 29752d70e263c2b508bf4641273dd89a23149f6f6164David Meyer} 29762d70e263c2b508bf4641273dd89a23149f6f6164David Meyer 297711987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran/// This function returns the hash value for a symbol in the .dynsym section 297811987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran/// Name of the API remains consistent as specified in the libelf 29798b2824a1b21fe7bd3908774feb5f79c98cc7d9a2Shankar Easwaran/// REF : http://www.sco.com/developers/gabi/latest/ch5.dynamic.html#hash 298011987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaranstatic inline unsigned elf_hash(StringRef &symbolName) { 298111987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran unsigned h = 0, g; 2982dceaf4ac8dcb2167b57853d354760fe9a8cb8273Shankar Easwaran for (unsigned i = 0, j = symbolName.size(); i < j; i++) { 298311987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran h = (h << 4) + symbolName[i]; 298411987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran g = h & 0xf0000000L; 298511987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran if (g != 0) 298611987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran h ^= g >> 24; 298711987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran h &= ~g; 298811987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran } 298911987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran return h; 299011987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran} 299111987c4719749d6d053cc848e3ebb28579393f51Shankar Easwaran 2992f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2993f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky} 2994f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky 2995f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky#endif 2996