10b57cec5SDimitry Andric //===- ELF.cpp - ELF object file implementation ---------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "llvm/Object/ELF.h" 10*06c3fb27SDimitry Andric #include "llvm/ADT/StringExtras.h" 110b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELF.h" 12fe6060f1SDimitry Andric #include "llvm/Support/DataExtractor.h" 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric using namespace llvm; 150b57cec5SDimitry Andric using namespace object; 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #define STRINGIFY_ENUM_CASE(ns, name) \ 180b57cec5SDimitry Andric case ns::name: \ 190b57cec5SDimitry Andric return #name; 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric #define ELF_RELOC(name, value) STRINGIFY_ENUM_CASE(ELF, name) 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine, 240b57cec5SDimitry Andric uint32_t Type) { 250b57cec5SDimitry Andric switch (Machine) { 26fe6060f1SDimitry Andric case ELF::EM_68K: 27fe6060f1SDimitry Andric switch (Type) { 28fe6060f1SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/M68k.def" 29fe6060f1SDimitry Andric default: 30fe6060f1SDimitry Andric break; 31fe6060f1SDimitry Andric } 32fe6060f1SDimitry Andric break; 330b57cec5SDimitry Andric case ELF::EM_X86_64: 340b57cec5SDimitry Andric switch (Type) { 350b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/x86_64.def" 360b57cec5SDimitry Andric default: 370b57cec5SDimitry Andric break; 380b57cec5SDimitry Andric } 390b57cec5SDimitry Andric break; 400b57cec5SDimitry Andric case ELF::EM_386: 410b57cec5SDimitry Andric case ELF::EM_IAMCU: 420b57cec5SDimitry Andric switch (Type) { 430b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/i386.def" 440b57cec5SDimitry Andric default: 450b57cec5SDimitry Andric break; 460b57cec5SDimitry Andric } 470b57cec5SDimitry Andric break; 480b57cec5SDimitry Andric case ELF::EM_MIPS: 490b57cec5SDimitry Andric switch (Type) { 500b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Mips.def" 510b57cec5SDimitry Andric default: 520b57cec5SDimitry Andric break; 530b57cec5SDimitry Andric } 540b57cec5SDimitry Andric break; 550b57cec5SDimitry Andric case ELF::EM_AARCH64: 560b57cec5SDimitry Andric switch (Type) { 570b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/AArch64.def" 580b57cec5SDimitry Andric default: 590b57cec5SDimitry Andric break; 600b57cec5SDimitry Andric } 610b57cec5SDimitry Andric break; 620b57cec5SDimitry Andric case ELF::EM_ARM: 630b57cec5SDimitry Andric switch (Type) { 640b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/ARM.def" 650b57cec5SDimitry Andric default: 660b57cec5SDimitry Andric break; 670b57cec5SDimitry Andric } 680b57cec5SDimitry Andric break; 690b57cec5SDimitry Andric case ELF::EM_ARC_COMPACT: 700b57cec5SDimitry Andric case ELF::EM_ARC_COMPACT2: 710b57cec5SDimitry Andric switch (Type) { 720b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/ARC.def" 730b57cec5SDimitry Andric default: 740b57cec5SDimitry Andric break; 750b57cec5SDimitry Andric } 760b57cec5SDimitry Andric break; 770b57cec5SDimitry Andric case ELF::EM_AVR: 780b57cec5SDimitry Andric switch (Type) { 790b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/AVR.def" 800b57cec5SDimitry Andric default: 810b57cec5SDimitry Andric break; 820b57cec5SDimitry Andric } 830b57cec5SDimitry Andric break; 840b57cec5SDimitry Andric case ELF::EM_HEXAGON: 850b57cec5SDimitry Andric switch (Type) { 860b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Hexagon.def" 870b57cec5SDimitry Andric default: 880b57cec5SDimitry Andric break; 890b57cec5SDimitry Andric } 900b57cec5SDimitry Andric break; 910b57cec5SDimitry Andric case ELF::EM_LANAI: 920b57cec5SDimitry Andric switch (Type) { 930b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Lanai.def" 940b57cec5SDimitry Andric default: 950b57cec5SDimitry Andric break; 960b57cec5SDimitry Andric } 970b57cec5SDimitry Andric break; 980b57cec5SDimitry Andric case ELF::EM_PPC: 990b57cec5SDimitry Andric switch (Type) { 1000b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/PowerPC.def" 1010b57cec5SDimitry Andric default: 1020b57cec5SDimitry Andric break; 1030b57cec5SDimitry Andric } 1040b57cec5SDimitry Andric break; 1050b57cec5SDimitry Andric case ELF::EM_PPC64: 1060b57cec5SDimitry Andric switch (Type) { 1070b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def" 1080b57cec5SDimitry Andric default: 1090b57cec5SDimitry Andric break; 1100b57cec5SDimitry Andric } 1110b57cec5SDimitry Andric break; 1120b57cec5SDimitry Andric case ELF::EM_RISCV: 1130b57cec5SDimitry Andric switch (Type) { 1140b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/RISCV.def" 1150b57cec5SDimitry Andric default: 1160b57cec5SDimitry Andric break; 1170b57cec5SDimitry Andric } 1180b57cec5SDimitry Andric break; 1190b57cec5SDimitry Andric case ELF::EM_S390: 1200b57cec5SDimitry Andric switch (Type) { 1210b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/SystemZ.def" 1220b57cec5SDimitry Andric default: 1230b57cec5SDimitry Andric break; 1240b57cec5SDimitry Andric } 1250b57cec5SDimitry Andric break; 1260b57cec5SDimitry Andric case ELF::EM_SPARC: 1270b57cec5SDimitry Andric case ELF::EM_SPARC32PLUS: 1280b57cec5SDimitry Andric case ELF::EM_SPARCV9: 1290b57cec5SDimitry Andric switch (Type) { 1300b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Sparc.def" 1310b57cec5SDimitry Andric default: 1320b57cec5SDimitry Andric break; 1330b57cec5SDimitry Andric } 1340b57cec5SDimitry Andric break; 1350b57cec5SDimitry Andric case ELF::EM_AMDGPU: 1360b57cec5SDimitry Andric switch (Type) { 1370b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def" 1380b57cec5SDimitry Andric default: 1390b57cec5SDimitry Andric break; 1400b57cec5SDimitry Andric } 1410b57cec5SDimitry Andric break; 1420b57cec5SDimitry Andric case ELF::EM_BPF: 1430b57cec5SDimitry Andric switch (Type) { 1440b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/BPF.def" 1450b57cec5SDimitry Andric default: 1460b57cec5SDimitry Andric break; 1470b57cec5SDimitry Andric } 1480b57cec5SDimitry Andric break; 1490b57cec5SDimitry Andric case ELF::EM_MSP430: 1500b57cec5SDimitry Andric switch (Type) { 1510b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/MSP430.def" 1520b57cec5SDimitry Andric default: 1530b57cec5SDimitry Andric break; 1540b57cec5SDimitry Andric } 1550b57cec5SDimitry Andric break; 1565ffd83dbSDimitry Andric case ELF::EM_VE: 1575ffd83dbSDimitry Andric switch (Type) { 1585ffd83dbSDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/VE.def" 1595ffd83dbSDimitry Andric default: 1605ffd83dbSDimitry Andric break; 1615ffd83dbSDimitry Andric } 1625ffd83dbSDimitry Andric break; 163e8d8bef9SDimitry Andric case ELF::EM_CSKY: 164e8d8bef9SDimitry Andric switch (Type) { 165e8d8bef9SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/CSKY.def" 166e8d8bef9SDimitry Andric default: 167e8d8bef9SDimitry Andric break; 168e8d8bef9SDimitry Andric } 169e8d8bef9SDimitry Andric break; 17081ad6265SDimitry Andric case ELF::EM_LOONGARCH: 17181ad6265SDimitry Andric switch (Type) { 17281ad6265SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/LoongArch.def" 17381ad6265SDimitry Andric default: 17481ad6265SDimitry Andric break; 17581ad6265SDimitry Andric } 17681ad6265SDimitry Andric break; 177bdd1243dSDimitry Andric case ELF::EM_XTENSA: 178bdd1243dSDimitry Andric switch (Type) { 179bdd1243dSDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Xtensa.def" 180bdd1243dSDimitry Andric default: 181bdd1243dSDimitry Andric break; 182bdd1243dSDimitry Andric } 183bdd1243dSDimitry Andric break; 1840b57cec5SDimitry Andric default: 1850b57cec5SDimitry Andric break; 1860b57cec5SDimitry Andric } 1870b57cec5SDimitry Andric return "Unknown"; 1880b57cec5SDimitry Andric } 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric #undef ELF_RELOC 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric uint32_t llvm::object::getELFRelativeRelocationType(uint32_t Machine) { 1930b57cec5SDimitry Andric switch (Machine) { 1940b57cec5SDimitry Andric case ELF::EM_X86_64: 1950b57cec5SDimitry Andric return ELF::R_X86_64_RELATIVE; 1960b57cec5SDimitry Andric case ELF::EM_386: 1970b57cec5SDimitry Andric case ELF::EM_IAMCU: 1980b57cec5SDimitry Andric return ELF::R_386_RELATIVE; 1990b57cec5SDimitry Andric case ELF::EM_MIPS: 2000b57cec5SDimitry Andric break; 2010b57cec5SDimitry Andric case ELF::EM_AARCH64: 2020b57cec5SDimitry Andric return ELF::R_AARCH64_RELATIVE; 2030b57cec5SDimitry Andric case ELF::EM_ARM: 2040b57cec5SDimitry Andric return ELF::R_ARM_RELATIVE; 2050b57cec5SDimitry Andric case ELF::EM_ARC_COMPACT: 2060b57cec5SDimitry Andric case ELF::EM_ARC_COMPACT2: 2070b57cec5SDimitry Andric return ELF::R_ARC_RELATIVE; 2080b57cec5SDimitry Andric case ELF::EM_AVR: 2090b57cec5SDimitry Andric break; 2100b57cec5SDimitry Andric case ELF::EM_HEXAGON: 2110b57cec5SDimitry Andric return ELF::R_HEX_RELATIVE; 2120b57cec5SDimitry Andric case ELF::EM_LANAI: 2130b57cec5SDimitry Andric break; 2140b57cec5SDimitry Andric case ELF::EM_PPC: 2150b57cec5SDimitry Andric break; 2160b57cec5SDimitry Andric case ELF::EM_PPC64: 2170b57cec5SDimitry Andric return ELF::R_PPC64_RELATIVE; 2180b57cec5SDimitry Andric case ELF::EM_RISCV: 2190b57cec5SDimitry Andric return ELF::R_RISCV_RELATIVE; 2200b57cec5SDimitry Andric case ELF::EM_S390: 2210b57cec5SDimitry Andric return ELF::R_390_RELATIVE; 2220b57cec5SDimitry Andric case ELF::EM_SPARC: 2230b57cec5SDimitry Andric case ELF::EM_SPARC32PLUS: 2240b57cec5SDimitry Andric case ELF::EM_SPARCV9: 2250b57cec5SDimitry Andric return ELF::R_SPARC_RELATIVE; 226e8d8bef9SDimitry Andric case ELF::EM_CSKY: 227e8d8bef9SDimitry Andric return ELF::R_CKCORE_RELATIVE; 2280eae32dcSDimitry Andric case ELF::EM_VE: 2290eae32dcSDimitry Andric return ELF::R_VE_RELATIVE; 2300b57cec5SDimitry Andric case ELF::EM_AMDGPU: 2310b57cec5SDimitry Andric break; 2320b57cec5SDimitry Andric case ELF::EM_BPF: 2330b57cec5SDimitry Andric break; 234bdd1243dSDimitry Andric case ELF::EM_LOONGARCH: 235bdd1243dSDimitry Andric return ELF::R_LARCH_RELATIVE; 2360b57cec5SDimitry Andric default: 2370b57cec5SDimitry Andric break; 2380b57cec5SDimitry Andric } 2390b57cec5SDimitry Andric return 0; 2400b57cec5SDimitry Andric } 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) { 2430b57cec5SDimitry Andric switch (Machine) { 2440b57cec5SDimitry Andric case ELF::EM_ARM: 2450b57cec5SDimitry Andric switch (Type) { 2460b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_ARM_EXIDX); 2470b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP); 2480b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES); 2490b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY); 2500b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION); 2510b57cec5SDimitry Andric } 2520b57cec5SDimitry Andric break; 2530b57cec5SDimitry Andric case ELF::EM_HEXAGON: 2540b57cec5SDimitry Andric switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_HEX_ORDERED); } 2550b57cec5SDimitry Andric break; 2560b57cec5SDimitry Andric case ELF::EM_X86_64: 2570b57cec5SDimitry Andric switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_X86_64_UNWIND); } 2580b57cec5SDimitry Andric break; 2590b57cec5SDimitry Andric case ELF::EM_MIPS: 2600b57cec5SDimitry Andric case ELF::EM_MIPS_RS3_LE: 2610b57cec5SDimitry Andric switch (Type) { 2620b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_REGINFO); 2630b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_OPTIONS); 2640b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_DWARF); 2650b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS); 2660b57cec5SDimitry Andric } 2670b57cec5SDimitry Andric break; 268349cc55cSDimitry Andric case ELF::EM_MSP430: 269349cc55cSDimitry Andric switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_MSP430_ATTRIBUTES); } 270349cc55cSDimitry Andric break; 2715ffd83dbSDimitry Andric case ELF::EM_RISCV: 2725ffd83dbSDimitry Andric switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_RISCV_ATTRIBUTES); } 2735ffd83dbSDimitry Andric break; 274*06c3fb27SDimitry Andric case ELF::EM_AARCH64: 275*06c3fb27SDimitry Andric switch (Type) { 276*06c3fb27SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_AARCH64_MEMTAG_GLOBALS_DYNAMIC); 277*06c3fb27SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_AARCH64_MEMTAG_GLOBALS_STATIC); 278*06c3fb27SDimitry Andric } 2790b57cec5SDimitry Andric default: 2800b57cec5SDimitry Andric break; 2810b57cec5SDimitry Andric } 2820b57cec5SDimitry Andric 2830b57cec5SDimitry Andric switch (Type) { 2840b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_NULL); 2850b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_PROGBITS); 2860b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB); 2870b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_STRTAB); 2880b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_RELA); 2890b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_HASH); 2900b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_DYNAMIC); 2910b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_NOTE); 2920b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_NOBITS); 2930b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_REL); 2940b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_SHLIB); 2950b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_DYNSYM); 2960b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_INIT_ARRAY); 2970b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_FINI_ARRAY); 2980b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_PREINIT_ARRAY); 2990b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_GROUP); 3000b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX); 3010b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_RELR); 3020b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_ANDROID_REL); 3030b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_ANDROID_RELA); 3040b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_ANDROID_RELR); 3050b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_ODRTAB); 3060b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_LINKER_OPTIONS); 3070b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_CALL_GRAPH_PROFILE); 3080b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_ADDRSIG); 3090b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_DEPENDENT_LIBRARIES); 3100b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_SYMPART); 3118bcb0991SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_PART_EHDR); 3128bcb0991SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_PART_PHDR); 31381ad6265SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_BB_ADDR_MAP_V0); 314e8d8bef9SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_BB_ADDR_MAP); 315753f127fSDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_OFFLOADING); 316*06c3fb27SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_LTO); 3170b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES); 3180b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH); 3190b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verdef); 3200b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verneed); 3210b57cec5SDimitry Andric STRINGIFY_ENUM_CASE(ELF, SHT_GNU_versym); 3220b57cec5SDimitry Andric default: 3230b57cec5SDimitry Andric return "Unknown"; 3240b57cec5SDimitry Andric } 3250b57cec5SDimitry Andric } 3260b57cec5SDimitry Andric 3270b57cec5SDimitry Andric template <class ELFT> 328e8d8bef9SDimitry Andric std::vector<typename ELFT::Rel> 3290b57cec5SDimitry Andric ELFFile<ELFT>::decode_relrs(Elf_Relr_Range relrs) const { 3300b57cec5SDimitry Andric // This function decodes the contents of an SHT_RELR packed relocation 3310b57cec5SDimitry Andric // section. 3320b57cec5SDimitry Andric // 3330b57cec5SDimitry Andric // Proposal for adding SHT_RELR sections to generic-abi is here: 3340b57cec5SDimitry Andric // https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg 3350b57cec5SDimitry Andric // 3360b57cec5SDimitry Andric // The encoded sequence of Elf64_Relr entries in a SHT_RELR section looks 3370b57cec5SDimitry Andric // like [ AAAAAAAA BBBBBBB1 BBBBBBB1 ... AAAAAAAA BBBBBB1 ... ] 3380b57cec5SDimitry Andric // 3390b57cec5SDimitry Andric // i.e. start with an address, followed by any number of bitmaps. The address 3400b57cec5SDimitry Andric // entry encodes 1 relocation. The subsequent bitmap entries encode up to 63 3410b57cec5SDimitry Andric // relocations each, at subsequent offsets following the last address entry. 3420b57cec5SDimitry Andric // 3430b57cec5SDimitry Andric // The bitmap entries must have 1 in the least significant bit. The assumption 3440b57cec5SDimitry Andric // here is that an address cannot have 1 in lsb. Odd addresses are not 3450b57cec5SDimitry Andric // supported. 3460b57cec5SDimitry Andric // 3470b57cec5SDimitry Andric // Excluding the least significant bit in the bitmap, each non-zero bit in 3480b57cec5SDimitry Andric // the bitmap represents a relocation to be applied to a corresponding machine 3490b57cec5SDimitry Andric // word that follows the base address word. The second least significant bit 3500b57cec5SDimitry Andric // represents the machine word immediately following the initial address, and 3510b57cec5SDimitry Andric // each bit that follows represents the next word, in linear order. As such, 3520b57cec5SDimitry Andric // a single bitmap can encode up to 31 relocations in a 32-bit object, and 3530b57cec5SDimitry Andric // 63 relocations in a 64-bit object. 3540b57cec5SDimitry Andric // 3550b57cec5SDimitry Andric // This encoding has a couple of interesting properties: 3560b57cec5SDimitry Andric // 1. Looking at any entry, it is clear whether it's an address or a bitmap: 3570b57cec5SDimitry Andric // even means address, odd means bitmap. 3580b57cec5SDimitry Andric // 2. Just a simple list of addresses is a valid encoding. 3590b57cec5SDimitry Andric 360e8d8bef9SDimitry Andric Elf_Rel Rel; 361e8d8bef9SDimitry Andric Rel.r_info = 0; 362e8d8bef9SDimitry Andric Rel.setType(getRelativeRelocationType(), false); 363e8d8bef9SDimitry Andric std::vector<Elf_Rel> Relocs; 3640b57cec5SDimitry Andric 3650b57cec5SDimitry Andric // Word type: uint32_t for Elf32, and uint64_t for Elf64. 366349cc55cSDimitry Andric using Addr = typename ELFT::uint; 3670b57cec5SDimitry Andric 368349cc55cSDimitry Andric Addr Base = 0; 369349cc55cSDimitry Andric for (Elf_Relr R : relrs) { 370349cc55cSDimitry Andric typename ELFT::uint Entry = R; 3710b57cec5SDimitry Andric if ((Entry & 1) == 0) { 3720b57cec5SDimitry Andric // Even entry: encodes the offset for next relocation. 373e8d8bef9SDimitry Andric Rel.r_offset = Entry; 374e8d8bef9SDimitry Andric Relocs.push_back(Rel); 3750b57cec5SDimitry Andric // Set base offset for subsequent bitmap entries. 376349cc55cSDimitry Andric Base = Entry + sizeof(Addr); 377349cc55cSDimitry Andric } else { 3780b57cec5SDimitry Andric // Odd entry: encodes bitmap for relocations starting at base. 379349cc55cSDimitry Andric for (Addr Offset = Base; (Entry >>= 1) != 0; Offset += sizeof(Addr)) 3800b57cec5SDimitry Andric if ((Entry & 1) != 0) { 381e8d8bef9SDimitry Andric Rel.r_offset = Offset; 382e8d8bef9SDimitry Andric Relocs.push_back(Rel); 3830b57cec5SDimitry Andric } 384349cc55cSDimitry Andric Base += (CHAR_BIT * sizeof(Entry) - 1) * sizeof(Addr); 3850b57cec5SDimitry Andric } 3860b57cec5SDimitry Andric } 3870b57cec5SDimitry Andric 3880b57cec5SDimitry Andric return Relocs; 3890b57cec5SDimitry Andric } 3900b57cec5SDimitry Andric 3910b57cec5SDimitry Andric template <class ELFT> 3920b57cec5SDimitry Andric Expected<std::vector<typename ELFT::Rela>> 393e8d8bef9SDimitry Andric ELFFile<ELFT>::android_relas(const Elf_Shdr &Sec) const { 3940b57cec5SDimitry Andric // This function reads relocations in Android's packed relocation format, 3950b57cec5SDimitry Andric // which is based on SLEB128 and delta encoding. 3960b57cec5SDimitry Andric Expected<ArrayRef<uint8_t>> ContentsOrErr = getSectionContents(Sec); 3970b57cec5SDimitry Andric if (!ContentsOrErr) 3980b57cec5SDimitry Andric return ContentsOrErr.takeError(); 399fe6060f1SDimitry Andric ArrayRef<uint8_t> Content = *ContentsOrErr; 400fe6060f1SDimitry Andric if (Content.size() < 4 || Content[0] != 'A' || Content[1] != 'P' || 401fe6060f1SDimitry Andric Content[2] != 'S' || Content[3] != '2') 4020b57cec5SDimitry Andric return createError("invalid packed relocation header"); 403fe6060f1SDimitry Andric DataExtractor Data(Content, isLE(), ELFT::Is64Bits ? 8 : 4); 404fe6060f1SDimitry Andric DataExtractor::Cursor Cur(/*Offset=*/4); 4050b57cec5SDimitry Andric 406fe6060f1SDimitry Andric uint64_t NumRelocs = Data.getSLEB128(Cur); 407fe6060f1SDimitry Andric uint64_t Offset = Data.getSLEB128(Cur); 4080b57cec5SDimitry Andric uint64_t Addend = 0; 4090b57cec5SDimitry Andric 410fe6060f1SDimitry Andric if (!Cur) 411fe6060f1SDimitry Andric return std::move(Cur.takeError()); 4120b57cec5SDimitry Andric 4130b57cec5SDimitry Andric std::vector<Elf_Rela> Relocs; 4140b57cec5SDimitry Andric Relocs.reserve(NumRelocs); 4150b57cec5SDimitry Andric while (NumRelocs) { 416fe6060f1SDimitry Andric uint64_t NumRelocsInGroup = Data.getSLEB128(Cur); 417fe6060f1SDimitry Andric if (!Cur) 418fe6060f1SDimitry Andric return std::move(Cur.takeError()); 4190b57cec5SDimitry Andric if (NumRelocsInGroup > NumRelocs) 4200b57cec5SDimitry Andric return createError("relocation group unexpectedly large"); 4210b57cec5SDimitry Andric NumRelocs -= NumRelocsInGroup; 4220b57cec5SDimitry Andric 423fe6060f1SDimitry Andric uint64_t GroupFlags = Data.getSLEB128(Cur); 4240b57cec5SDimitry Andric bool GroupedByInfo = GroupFlags & ELF::RELOCATION_GROUPED_BY_INFO_FLAG; 4250b57cec5SDimitry Andric bool GroupedByOffsetDelta = GroupFlags & ELF::RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG; 4260b57cec5SDimitry Andric bool GroupedByAddend = GroupFlags & ELF::RELOCATION_GROUPED_BY_ADDEND_FLAG; 4270b57cec5SDimitry Andric bool GroupHasAddend = GroupFlags & ELF::RELOCATION_GROUP_HAS_ADDEND_FLAG; 4280b57cec5SDimitry Andric 4290b57cec5SDimitry Andric uint64_t GroupOffsetDelta; 4300b57cec5SDimitry Andric if (GroupedByOffsetDelta) 431fe6060f1SDimitry Andric GroupOffsetDelta = Data.getSLEB128(Cur); 4320b57cec5SDimitry Andric 4330b57cec5SDimitry Andric uint64_t GroupRInfo; 4340b57cec5SDimitry Andric if (GroupedByInfo) 435fe6060f1SDimitry Andric GroupRInfo = Data.getSLEB128(Cur); 4360b57cec5SDimitry Andric 4370b57cec5SDimitry Andric if (GroupedByAddend && GroupHasAddend) 438fe6060f1SDimitry Andric Addend += Data.getSLEB128(Cur); 4390b57cec5SDimitry Andric 4400b57cec5SDimitry Andric if (!GroupHasAddend) 4410b57cec5SDimitry Andric Addend = 0; 4420b57cec5SDimitry Andric 443fe6060f1SDimitry Andric for (uint64_t I = 0; Cur && I != NumRelocsInGroup; ++I) { 4440b57cec5SDimitry Andric Elf_Rela R; 445fe6060f1SDimitry Andric Offset += GroupedByOffsetDelta ? GroupOffsetDelta : Data.getSLEB128(Cur); 4460b57cec5SDimitry Andric R.r_offset = Offset; 447fe6060f1SDimitry Andric R.r_info = GroupedByInfo ? GroupRInfo : Data.getSLEB128(Cur); 4480b57cec5SDimitry Andric if (GroupHasAddend && !GroupedByAddend) 449fe6060f1SDimitry Andric Addend += Data.getSLEB128(Cur); 4500b57cec5SDimitry Andric R.r_addend = Addend; 4510b57cec5SDimitry Andric Relocs.push_back(R); 4520b57cec5SDimitry Andric } 453fe6060f1SDimitry Andric if (!Cur) 454fe6060f1SDimitry Andric return std::move(Cur.takeError()); 4550b57cec5SDimitry Andric } 4560b57cec5SDimitry Andric 4570b57cec5SDimitry Andric return Relocs; 4580b57cec5SDimitry Andric } 4590b57cec5SDimitry Andric 4600b57cec5SDimitry Andric template <class ELFT> 4610b57cec5SDimitry Andric std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch, 4620b57cec5SDimitry Andric uint64_t Type) const { 4630b57cec5SDimitry Andric #define DYNAMIC_STRINGIFY_ENUM(tag, value) \ 4640b57cec5SDimitry Andric case value: \ 4650b57cec5SDimitry Andric return #tag; 4660b57cec5SDimitry Andric 4670b57cec5SDimitry Andric #define DYNAMIC_TAG(n, v) 4680b57cec5SDimitry Andric switch (Arch) { 4690b57cec5SDimitry Andric case ELF::EM_AARCH64: 4700b57cec5SDimitry Andric switch (Type) { 4710b57cec5SDimitry Andric #define AARCH64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 4720b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 4730b57cec5SDimitry Andric #undef AARCH64_DYNAMIC_TAG 4740b57cec5SDimitry Andric } 4750b57cec5SDimitry Andric break; 4760b57cec5SDimitry Andric 4770b57cec5SDimitry Andric case ELF::EM_HEXAGON: 4780b57cec5SDimitry Andric switch (Type) { 4790b57cec5SDimitry Andric #define HEXAGON_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 4800b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 4810b57cec5SDimitry Andric #undef HEXAGON_DYNAMIC_TAG 4820b57cec5SDimitry Andric } 4830b57cec5SDimitry Andric break; 4840b57cec5SDimitry Andric 4850b57cec5SDimitry Andric case ELF::EM_MIPS: 4860b57cec5SDimitry Andric switch (Type) { 4870b57cec5SDimitry Andric #define MIPS_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 4880b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 4890b57cec5SDimitry Andric #undef MIPS_DYNAMIC_TAG 4900b57cec5SDimitry Andric } 4910b57cec5SDimitry Andric break; 4920b57cec5SDimitry Andric 493349cc55cSDimitry Andric case ELF::EM_PPC: 494349cc55cSDimitry Andric switch (Type) { 495349cc55cSDimitry Andric #define PPC_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 496349cc55cSDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 497349cc55cSDimitry Andric #undef PPC_DYNAMIC_TAG 498349cc55cSDimitry Andric } 499349cc55cSDimitry Andric break; 500349cc55cSDimitry Andric 5010b57cec5SDimitry Andric case ELF::EM_PPC64: 5020b57cec5SDimitry Andric switch (Type) { 5030b57cec5SDimitry Andric #define PPC64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 5040b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 5050b57cec5SDimitry Andric #undef PPC64_DYNAMIC_TAG 5060b57cec5SDimitry Andric } 5070b57cec5SDimitry Andric break; 508349cc55cSDimitry Andric 509349cc55cSDimitry Andric case ELF::EM_RISCV: 510349cc55cSDimitry Andric switch (Type) { 511349cc55cSDimitry Andric #define RISCV_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 512349cc55cSDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 513349cc55cSDimitry Andric #undef RISCV_DYNAMIC_TAG 514349cc55cSDimitry Andric } 515349cc55cSDimitry Andric break; 5160b57cec5SDimitry Andric } 5170b57cec5SDimitry Andric #undef DYNAMIC_TAG 5180b57cec5SDimitry Andric switch (Type) { 5190b57cec5SDimitry Andric // Now handle all dynamic tags except the architecture specific ones 5200b57cec5SDimitry Andric #define AARCH64_DYNAMIC_TAG(name, value) 5210b57cec5SDimitry Andric #define MIPS_DYNAMIC_TAG(name, value) 5220b57cec5SDimitry Andric #define HEXAGON_DYNAMIC_TAG(name, value) 523349cc55cSDimitry Andric #define PPC_DYNAMIC_TAG(name, value) 5240b57cec5SDimitry Andric #define PPC64_DYNAMIC_TAG(name, value) 525349cc55cSDimitry Andric #define RISCV_DYNAMIC_TAG(name, value) 5260b57cec5SDimitry Andric // Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc. 5270b57cec5SDimitry Andric #define DYNAMIC_TAG_MARKER(name, value) 528480093f4SDimitry Andric #define DYNAMIC_TAG(name, value) case value: return #name; 5290b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 5300b57cec5SDimitry Andric #undef DYNAMIC_TAG 5310b57cec5SDimitry Andric #undef AARCH64_DYNAMIC_TAG 5320b57cec5SDimitry Andric #undef MIPS_DYNAMIC_TAG 5330b57cec5SDimitry Andric #undef HEXAGON_DYNAMIC_TAG 534349cc55cSDimitry Andric #undef PPC_DYNAMIC_TAG 5350b57cec5SDimitry Andric #undef PPC64_DYNAMIC_TAG 536349cc55cSDimitry Andric #undef RISCV_DYNAMIC_TAG 5370b57cec5SDimitry Andric #undef DYNAMIC_TAG_MARKER 5380b57cec5SDimitry Andric #undef DYNAMIC_STRINGIFY_ENUM 5390b57cec5SDimitry Andric default: 5400b57cec5SDimitry Andric return "<unknown:>0x" + utohexstr(Type, true); 5410b57cec5SDimitry Andric } 5420b57cec5SDimitry Andric } 5430b57cec5SDimitry Andric 5440b57cec5SDimitry Andric template <class ELFT> 5450b57cec5SDimitry Andric std::string ELFFile<ELFT>::getDynamicTagAsString(uint64_t Type) const { 546e8d8bef9SDimitry Andric return getDynamicTagAsString(getHeader().e_machine, Type); 5470b57cec5SDimitry Andric } 5480b57cec5SDimitry Andric 5490b57cec5SDimitry Andric template <class ELFT> 5500b57cec5SDimitry Andric Expected<typename ELFT::DynRange> ELFFile<ELFT>::dynamicEntries() const { 5510b57cec5SDimitry Andric ArrayRef<Elf_Dyn> Dyn; 5520b57cec5SDimitry Andric 5530b57cec5SDimitry Andric auto ProgramHeadersOrError = program_headers(); 5540b57cec5SDimitry Andric if (!ProgramHeadersOrError) 5550b57cec5SDimitry Andric return ProgramHeadersOrError.takeError(); 5560b57cec5SDimitry Andric 5570b57cec5SDimitry Andric for (const Elf_Phdr &Phdr : *ProgramHeadersOrError) { 5580b57cec5SDimitry Andric if (Phdr.p_type == ELF::PT_DYNAMIC) { 559bdd1243dSDimitry Andric Dyn = ArrayRef(reinterpret_cast<const Elf_Dyn *>(base() + Phdr.p_offset), 5600b57cec5SDimitry Andric Phdr.p_filesz / sizeof(Elf_Dyn)); 5610b57cec5SDimitry Andric break; 5620b57cec5SDimitry Andric } 5630b57cec5SDimitry Andric } 5640b57cec5SDimitry Andric 5650b57cec5SDimitry Andric // If we can't find the dynamic section in the program headers, we just fall 5660b57cec5SDimitry Andric // back on the sections. 5670b57cec5SDimitry Andric if (Dyn.empty()) { 5680b57cec5SDimitry Andric auto SectionsOrError = sections(); 5690b57cec5SDimitry Andric if (!SectionsOrError) 5700b57cec5SDimitry Andric return SectionsOrError.takeError(); 5710b57cec5SDimitry Andric 5720b57cec5SDimitry Andric for (const Elf_Shdr &Sec : *SectionsOrError) { 5730b57cec5SDimitry Andric if (Sec.sh_type == ELF::SHT_DYNAMIC) { 5740b57cec5SDimitry Andric Expected<ArrayRef<Elf_Dyn>> DynOrError = 575e8d8bef9SDimitry Andric getSectionContentsAsArray<Elf_Dyn>(Sec); 5760b57cec5SDimitry Andric if (!DynOrError) 5770b57cec5SDimitry Andric return DynOrError.takeError(); 5780b57cec5SDimitry Andric Dyn = *DynOrError; 5790b57cec5SDimitry Andric break; 5800b57cec5SDimitry Andric } 5810b57cec5SDimitry Andric } 5820b57cec5SDimitry Andric 5830b57cec5SDimitry Andric if (!Dyn.data()) 5840b57cec5SDimitry Andric return ArrayRef<Elf_Dyn>(); 5850b57cec5SDimitry Andric } 5860b57cec5SDimitry Andric 5870b57cec5SDimitry Andric if (Dyn.empty()) 5880b57cec5SDimitry Andric return createError("invalid empty dynamic section"); 5890b57cec5SDimitry Andric 5900b57cec5SDimitry Andric if (Dyn.back().d_tag != ELF::DT_NULL) 5910b57cec5SDimitry Andric return createError("dynamic sections must be DT_NULL terminated"); 5920b57cec5SDimitry Andric 5930b57cec5SDimitry Andric return Dyn; 5940b57cec5SDimitry Andric } 5950b57cec5SDimitry Andric 5960b57cec5SDimitry Andric template <class ELFT> 597e8d8bef9SDimitry Andric Expected<const uint8_t *> 598e8d8bef9SDimitry Andric ELFFile<ELFT>::toMappedAddr(uint64_t VAddr, WarningHandler WarnHandler) const { 5990b57cec5SDimitry Andric auto ProgramHeadersOrError = program_headers(); 6000b57cec5SDimitry Andric if (!ProgramHeadersOrError) 6010b57cec5SDimitry Andric return ProgramHeadersOrError.takeError(); 6020b57cec5SDimitry Andric 6030b57cec5SDimitry Andric llvm::SmallVector<Elf_Phdr *, 4> LoadSegments; 6040b57cec5SDimitry Andric 6050b57cec5SDimitry Andric for (const Elf_Phdr &Phdr : *ProgramHeadersOrError) 6060b57cec5SDimitry Andric if (Phdr.p_type == ELF::PT_LOAD) 6070b57cec5SDimitry Andric LoadSegments.push_back(const_cast<Elf_Phdr *>(&Phdr)); 6080b57cec5SDimitry Andric 609e8d8bef9SDimitry Andric auto SortPred = [](const Elf_Phdr_Impl<ELFT> *A, 610e8d8bef9SDimitry Andric const Elf_Phdr_Impl<ELFT> *B) { 611e8d8bef9SDimitry Andric return A->p_vaddr < B->p_vaddr; 612e8d8bef9SDimitry Andric }; 613e8d8bef9SDimitry Andric if (!llvm::is_sorted(LoadSegments, SortPred)) { 614e8d8bef9SDimitry Andric if (Error E = 615e8d8bef9SDimitry Andric WarnHandler("loadable segments are unsorted by virtual address")) 616e8d8bef9SDimitry Andric return std::move(E); 617e8d8bef9SDimitry Andric llvm::stable_sort(LoadSegments, SortPred); 618e8d8bef9SDimitry Andric } 619e8d8bef9SDimitry Andric 620e8d8bef9SDimitry Andric const Elf_Phdr *const *I = llvm::upper_bound( 621e8d8bef9SDimitry Andric LoadSegments, VAddr, [](uint64_t VAddr, const Elf_Phdr_Impl<ELFT> *Phdr) { 6220b57cec5SDimitry Andric return VAddr < Phdr->p_vaddr; 6230b57cec5SDimitry Andric }); 6240b57cec5SDimitry Andric 6250b57cec5SDimitry Andric if (I == LoadSegments.begin()) 6260b57cec5SDimitry Andric return createError("virtual address is not in any segment: 0x" + 6270b57cec5SDimitry Andric Twine::utohexstr(VAddr)); 6280b57cec5SDimitry Andric --I; 6290b57cec5SDimitry Andric const Elf_Phdr &Phdr = **I; 6300b57cec5SDimitry Andric uint64_t Delta = VAddr - Phdr.p_vaddr; 6310b57cec5SDimitry Andric if (Delta >= Phdr.p_filesz) 6320b57cec5SDimitry Andric return createError("virtual address is not in any segment: 0x" + 6330b57cec5SDimitry Andric Twine::utohexstr(VAddr)); 6345ffd83dbSDimitry Andric 6355ffd83dbSDimitry Andric uint64_t Offset = Phdr.p_offset + Delta; 6365ffd83dbSDimitry Andric if (Offset >= getBufSize()) 6375ffd83dbSDimitry Andric return createError("can't map virtual address 0x" + 6385ffd83dbSDimitry Andric Twine::utohexstr(VAddr) + " to the segment with index " + 6395ffd83dbSDimitry Andric Twine(&Phdr - (*ProgramHeadersOrError).data() + 1) + 6405ffd83dbSDimitry Andric ": the segment ends at 0x" + 6415ffd83dbSDimitry Andric Twine::utohexstr(Phdr.p_offset + Phdr.p_filesz) + 6425ffd83dbSDimitry Andric ", which is greater than the file size (0x" + 6435ffd83dbSDimitry Andric Twine::utohexstr(getBufSize()) + ")"); 6445ffd83dbSDimitry Andric 6455ffd83dbSDimitry Andric return base() + Offset; 6460b57cec5SDimitry Andric } 6470b57cec5SDimitry Andric 648fe6060f1SDimitry Andric template <class ELFT> 649349cc55cSDimitry Andric Expected<std::vector<BBAddrMap>> 650*06c3fb27SDimitry Andric ELFFile<ELFT>::decodeBBAddrMap(const Elf_Shdr &Sec, 651*06c3fb27SDimitry Andric const Elf_Shdr *RelaSec) const { 652*06c3fb27SDimitry Andric bool IsRelocatable = getHeader().e_type == ELF::ET_REL; 653*06c3fb27SDimitry Andric 654*06c3fb27SDimitry Andric // This DenseMap maps the offset of each function (the location of the 655*06c3fb27SDimitry Andric // reference to the function in the SHT_LLVM_BB_ADDR_MAP section) to the 656*06c3fb27SDimitry Andric // addend (the location of the function in the text section). 657*06c3fb27SDimitry Andric llvm::DenseMap<uint64_t, uint64_t> FunctionOffsetTranslations; 658*06c3fb27SDimitry Andric if (IsRelocatable && RelaSec) { 659*06c3fb27SDimitry Andric assert(RelaSec && 660*06c3fb27SDimitry Andric "Can't read a SHT_LLVM_BB_ADDR_MAP section in a relocatable " 661*06c3fb27SDimitry Andric "object file without providing a relocation section."); 662*06c3fb27SDimitry Andric Expected<Elf_Rela_Range> Relas = this->relas(*RelaSec); 663*06c3fb27SDimitry Andric if (!Relas) 664*06c3fb27SDimitry Andric return createError("unable to read relocations for section " + 665*06c3fb27SDimitry Andric describe(*this, Sec) + ": " + 666*06c3fb27SDimitry Andric toString(Relas.takeError())); 667*06c3fb27SDimitry Andric for (Elf_Rela Rela : *Relas) 668*06c3fb27SDimitry Andric FunctionOffsetTranslations[Rela.r_offset] = Rela.r_addend; 669*06c3fb27SDimitry Andric } 670fe6060f1SDimitry Andric Expected<ArrayRef<uint8_t>> ContentsOrErr = getSectionContents(Sec); 671fe6060f1SDimitry Andric if (!ContentsOrErr) 672fe6060f1SDimitry Andric return ContentsOrErr.takeError(); 673fe6060f1SDimitry Andric ArrayRef<uint8_t> Content = *ContentsOrErr; 674fe6060f1SDimitry Andric DataExtractor Data(Content, isLE(), ELFT::Is64Bits ? 8 : 4); 675349cc55cSDimitry Andric std::vector<BBAddrMap> FunctionEntries; 676fe6060f1SDimitry Andric 677fe6060f1SDimitry Andric DataExtractor::Cursor Cur(0); 678fe6060f1SDimitry Andric Error ULEBSizeErr = Error::success(); 679*06c3fb27SDimitry Andric Error MetadataDecodeErr = Error::success(); 680fe6060f1SDimitry Andric // Helper to extract and decode the next ULEB128 value as uint32_t. 681fe6060f1SDimitry Andric // Returns zero and sets ULEBSizeErr if the ULEB128 value exceeds the uint32_t 682fe6060f1SDimitry Andric // limit. 683fe6060f1SDimitry Andric // Also returns zero if ULEBSizeErr is already in an error state. 684fe6060f1SDimitry Andric auto ReadULEB128AsUInt32 = [&Data, &Cur, &ULEBSizeErr]() -> uint32_t { 685fe6060f1SDimitry Andric // Bail out and do not extract data if ULEBSizeErr is already set. 686fe6060f1SDimitry Andric if (ULEBSizeErr) 687fe6060f1SDimitry Andric return 0; 688fe6060f1SDimitry Andric uint64_t Offset = Cur.tell(); 689fe6060f1SDimitry Andric uint64_t Value = Data.getULEB128(Cur); 690fe6060f1SDimitry Andric if (Value > UINT32_MAX) { 691fe6060f1SDimitry Andric ULEBSizeErr = createError( 692fe6060f1SDimitry Andric "ULEB128 value at offset 0x" + Twine::utohexstr(Offset) + 693fe6060f1SDimitry Andric " exceeds UINT32_MAX (0x" + Twine::utohexstr(Value) + ")"); 694fe6060f1SDimitry Andric return 0; 695fe6060f1SDimitry Andric } 696fe6060f1SDimitry Andric return static_cast<uint32_t>(Value); 697fe6060f1SDimitry Andric }; 698fe6060f1SDimitry Andric 69981ad6265SDimitry Andric uint8_t Version = 0; 700*06c3fb27SDimitry Andric while (!ULEBSizeErr && !MetadataDecodeErr && Cur && 701*06c3fb27SDimitry Andric Cur.tell() < Content.size()) { 70281ad6265SDimitry Andric if (Sec.sh_type == ELF::SHT_LLVM_BB_ADDR_MAP) { 70381ad6265SDimitry Andric Version = Data.getU8(Cur); 70481ad6265SDimitry Andric if (!Cur) 70581ad6265SDimitry Andric break; 706bdd1243dSDimitry Andric if (Version > 2) 70781ad6265SDimitry Andric return createError("unsupported SHT_LLVM_BB_ADDR_MAP version: " + 70881ad6265SDimitry Andric Twine(static_cast<int>(Version))); 70981ad6265SDimitry Andric Data.getU8(Cur); // Feature byte 71081ad6265SDimitry Andric } 711*06c3fb27SDimitry Andric uint64_t SectionOffset = Cur.tell(); 712fe6060f1SDimitry Andric uintX_t Address = static_cast<uintX_t>(Data.getAddress(Cur)); 713*06c3fb27SDimitry Andric if (!Cur) 714*06c3fb27SDimitry Andric return Cur.takeError(); 715*06c3fb27SDimitry Andric if (IsRelocatable) { 716*06c3fb27SDimitry Andric assert(Address == 0); 717*06c3fb27SDimitry Andric auto FOTIterator = FunctionOffsetTranslations.find(SectionOffset); 718*06c3fb27SDimitry Andric if (FOTIterator == FunctionOffsetTranslations.end()) { 719*06c3fb27SDimitry Andric return createError("failed to get relocation data for offset: " + 720*06c3fb27SDimitry Andric Twine::utohexstr(SectionOffset) + " in section " + 721*06c3fb27SDimitry Andric describe(*this, Sec)); 722*06c3fb27SDimitry Andric } 723*06c3fb27SDimitry Andric Address = FOTIterator->second; 724*06c3fb27SDimitry Andric } 725fe6060f1SDimitry Andric uint32_t NumBlocks = ReadULEB128AsUInt32(); 726349cc55cSDimitry Andric std::vector<BBAddrMap::BBEntry> BBEntries; 72781ad6265SDimitry Andric uint32_t PrevBBEndOffset = 0; 728bdd1243dSDimitry Andric for (uint32_t BlockIndex = 0; 729*06c3fb27SDimitry Andric !MetadataDecodeErr && !ULEBSizeErr && Cur && (BlockIndex < NumBlocks); 730*06c3fb27SDimitry Andric ++BlockIndex) { 731bdd1243dSDimitry Andric uint32_t ID = Version >= 2 ? ReadULEB128AsUInt32() : BlockIndex; 732fe6060f1SDimitry Andric uint32_t Offset = ReadULEB128AsUInt32(); 733fe6060f1SDimitry Andric uint32_t Size = ReadULEB128AsUInt32(); 734*06c3fb27SDimitry Andric uint32_t MD = ReadULEB128AsUInt32(); 73581ad6265SDimitry Andric if (Version >= 1) { 73681ad6265SDimitry Andric // Offset is calculated relative to the end of the previous BB. 73781ad6265SDimitry Andric Offset += PrevBBEndOffset; 73881ad6265SDimitry Andric PrevBBEndOffset = Offset + Size; 73981ad6265SDimitry Andric } 740*06c3fb27SDimitry Andric Expected<BBAddrMap::BBEntry::Metadata> MetadataOrErr = 741*06c3fb27SDimitry Andric BBAddrMap::BBEntry::Metadata::decode(MD); 742*06c3fb27SDimitry Andric if (!MetadataOrErr) { 743*06c3fb27SDimitry Andric MetadataDecodeErr = MetadataOrErr.takeError(); 744*06c3fb27SDimitry Andric break; 745*06c3fb27SDimitry Andric } 746*06c3fb27SDimitry Andric BBEntries.push_back({ID, Offset, Size, *MetadataOrErr}); 747fe6060f1SDimitry Andric } 74881ad6265SDimitry Andric FunctionEntries.push_back({Address, std::move(BBEntries)}); 749fe6060f1SDimitry Andric } 750*06c3fb27SDimitry Andric // Either Cur is in the error state, or we have an error in ULEBSizeErr or 751*06c3fb27SDimitry Andric // MetadataDecodeErr (but not both), but we join all errors here to be safe. 752*06c3fb27SDimitry Andric if (!Cur || ULEBSizeErr || MetadataDecodeErr) 753*06c3fb27SDimitry Andric return joinErrors(joinErrors(Cur.takeError(), std::move(ULEBSizeErr)), 754*06c3fb27SDimitry Andric std::move(MetadataDecodeErr)); 755fe6060f1SDimitry Andric return FunctionEntries; 756fe6060f1SDimitry Andric } 757fe6060f1SDimitry Andric 758*06c3fb27SDimitry Andric template <class ELFT> 759*06c3fb27SDimitry Andric Expected< 760*06c3fb27SDimitry Andric MapVector<const typename ELFT::Shdr *, const typename ELFT::Shdr *>> 761*06c3fb27SDimitry Andric ELFFile<ELFT>::getSectionAndRelocations( 762*06c3fb27SDimitry Andric std::function<Expected<bool>(const Elf_Shdr &)> IsMatch) const { 763*06c3fb27SDimitry Andric MapVector<const Elf_Shdr *, const Elf_Shdr *> SecToRelocMap; 764*06c3fb27SDimitry Andric Error Errors = Error::success(); 765*06c3fb27SDimitry Andric for (const Elf_Shdr &Sec : cantFail(this->sections())) { 766*06c3fb27SDimitry Andric Expected<bool> DoesSectionMatch = IsMatch(Sec); 767*06c3fb27SDimitry Andric if (!DoesSectionMatch) { 768*06c3fb27SDimitry Andric Errors = joinErrors(std::move(Errors), DoesSectionMatch.takeError()); 769*06c3fb27SDimitry Andric continue; 770*06c3fb27SDimitry Andric } 771*06c3fb27SDimitry Andric if (*DoesSectionMatch) { 772*06c3fb27SDimitry Andric if (SecToRelocMap.insert(std::make_pair(&Sec, (const Elf_Shdr *)nullptr)) 773*06c3fb27SDimitry Andric .second) 774*06c3fb27SDimitry Andric continue; 775*06c3fb27SDimitry Andric } 776*06c3fb27SDimitry Andric 777*06c3fb27SDimitry Andric if (Sec.sh_type != ELF::SHT_RELA && Sec.sh_type != ELF::SHT_REL) 778*06c3fb27SDimitry Andric continue; 779*06c3fb27SDimitry Andric 780*06c3fb27SDimitry Andric Expected<const Elf_Shdr *> RelSecOrErr = this->getSection(Sec.sh_info); 781*06c3fb27SDimitry Andric if (!RelSecOrErr) { 782*06c3fb27SDimitry Andric Errors = joinErrors(std::move(Errors), 783*06c3fb27SDimitry Andric createError(describe(*this, Sec) + 784*06c3fb27SDimitry Andric ": failed to get a relocated section: " + 785*06c3fb27SDimitry Andric toString(RelSecOrErr.takeError()))); 786*06c3fb27SDimitry Andric continue; 787*06c3fb27SDimitry Andric } 788*06c3fb27SDimitry Andric const Elf_Shdr *ContentsSec = *RelSecOrErr; 789*06c3fb27SDimitry Andric Expected<bool> DoesRelTargetMatch = IsMatch(*ContentsSec); 790*06c3fb27SDimitry Andric if (!DoesRelTargetMatch) { 791*06c3fb27SDimitry Andric Errors = joinErrors(std::move(Errors), DoesRelTargetMatch.takeError()); 792*06c3fb27SDimitry Andric continue; 793*06c3fb27SDimitry Andric } 794*06c3fb27SDimitry Andric if (*DoesRelTargetMatch) 795*06c3fb27SDimitry Andric SecToRelocMap[ContentsSec] = &Sec; 796*06c3fb27SDimitry Andric } 797*06c3fb27SDimitry Andric if(Errors) 798*06c3fb27SDimitry Andric return std::move(Errors); 799*06c3fb27SDimitry Andric return SecToRelocMap; 800*06c3fb27SDimitry Andric } 801*06c3fb27SDimitry Andric 8020b57cec5SDimitry Andric template class llvm::object::ELFFile<ELF32LE>; 8030b57cec5SDimitry Andric template class llvm::object::ELFFile<ELF32BE>; 8040b57cec5SDimitry Andric template class llvm::object::ELFFile<ELF64LE>; 8050b57cec5SDimitry Andric template class llvm::object::ELFFile<ELF64BE>; 806