1 //===-- ObjectFileELF.cpp -------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "ObjectFileELF.h" 10 11 #include <algorithm> 12 #include <cassert> 13 #include <optional> 14 #include <unordered_map> 15 16 #include "lldb/Core/Module.h" 17 #include "lldb/Core/ModuleSpec.h" 18 #include "lldb/Core/PluginManager.h" 19 #include "lldb/Core/Progress.h" 20 #include "lldb/Core/Section.h" 21 #include "lldb/Host/FileSystem.h" 22 #include "lldb/Host/LZMA.h" 23 #include "lldb/Symbol/DWARFCallFrameInfo.h" 24 #include "lldb/Symbol/SymbolContext.h" 25 #include "lldb/Target/SectionLoadList.h" 26 #include "lldb/Target/Target.h" 27 #include "lldb/Utility/ArchSpec.h" 28 #include "lldb/Utility/DataBufferHeap.h" 29 #include "lldb/Utility/FileSpecList.h" 30 #include "lldb/Utility/LLDBLog.h" 31 #include "lldb/Utility/Log.h" 32 #include "lldb/Utility/RangeMap.h" 33 #include "lldb/Utility/Status.h" 34 #include "lldb/Utility/Stream.h" 35 #include "lldb/Utility/Timer.h" 36 #include "llvm/ADT/IntervalMap.h" 37 #include "llvm/ADT/PointerUnion.h" 38 #include "llvm/ADT/StringRef.h" 39 #include "llvm/BinaryFormat/ELF.h" 40 #include "llvm/Object/Decompressor.h" 41 #include "llvm/Support/ARMBuildAttributes.h" 42 #include "llvm/Support/CRC.h" 43 #include "llvm/Support/FormatVariadic.h" 44 #include "llvm/Support/MathExtras.h" 45 #include "llvm/Support/MemoryBuffer.h" 46 #include "llvm/Support/MipsABIFlags.h" 47 48 #define CASE_AND_STREAM(s, def, width) \ 49 case def: \ 50 s->Printf("%-*s", width, #def); \ 51 break; 52 53 using namespace lldb; 54 using namespace lldb_private; 55 using namespace elf; 56 using namespace llvm::ELF; 57 58 LLDB_PLUGIN_DEFINE(ObjectFileELF) 59 60 // ELF note owner definitions 61 static const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD"; 62 static const char *const LLDB_NT_OWNER_GNU = "GNU"; 63 static const char *const LLDB_NT_OWNER_NETBSD = "NetBSD"; 64 static const char *const LLDB_NT_OWNER_NETBSDCORE = "NetBSD-CORE"; 65 static const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD"; 66 static const char *const LLDB_NT_OWNER_ANDROID = "Android"; 67 static const char *const LLDB_NT_OWNER_CORE = "CORE"; 68 static const char *const LLDB_NT_OWNER_LINUX = "LINUX"; 69 70 // ELF note type definitions 71 static const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01; 72 static const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4; 73 74 static const elf_word LLDB_NT_GNU_ABI_TAG = 0x01; 75 static const elf_word LLDB_NT_GNU_ABI_SIZE = 16; 76 77 static const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03; 78 79 static const elf_word LLDB_NT_NETBSD_IDENT_TAG = 1; 80 static const elf_word LLDB_NT_NETBSD_IDENT_DESCSZ = 4; 81 static const elf_word LLDB_NT_NETBSD_IDENT_NAMESZ = 7; 82 static const elf_word LLDB_NT_NETBSD_PROCINFO = 1; 83 84 // GNU ABI note OS constants 85 static const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00; 86 static const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01; 87 static const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02; 88 89 namespace { 90 91 //===----------------------------------------------------------------------===// 92 /// \class ELFRelocation 93 /// Generic wrapper for ELFRel and ELFRela. 94 /// 95 /// This helper class allows us to parse both ELFRel and ELFRela relocation 96 /// entries in a generic manner. 97 class ELFRelocation { 98 public: 99 /// Constructs an ELFRelocation entry with a personality as given by @p 100 /// type. 101 /// 102 /// \param type Either DT_REL or DT_RELA. Any other value is invalid. 103 ELFRelocation(unsigned type); 104 105 ~ELFRelocation(); 106 107 bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 108 109 static unsigned RelocType32(const ELFRelocation &rel); 110 111 static unsigned RelocType64(const ELFRelocation &rel); 112 113 static unsigned RelocSymbol32(const ELFRelocation &rel); 114 115 static unsigned RelocSymbol64(const ELFRelocation &rel); 116 117 static elf_addr RelocOffset32(const ELFRelocation &rel); 118 119 static elf_addr RelocOffset64(const ELFRelocation &rel); 120 121 static elf_sxword RelocAddend32(const ELFRelocation &rel); 122 123 static elf_sxword RelocAddend64(const ELFRelocation &rel); 124 125 bool IsRela() { return (reloc.is<ELFRela *>()); } 126 127 private: 128 typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion; 129 130 RelocUnion reloc; 131 }; 132 } // end anonymous namespace 133 134 ELFRelocation::ELFRelocation(unsigned type) { 135 if (type == DT_REL || type == SHT_REL) 136 reloc = new ELFRel(); 137 else if (type == DT_RELA || type == SHT_RELA) 138 reloc = new ELFRela(); 139 else { 140 assert(false && "unexpected relocation type"); 141 reloc = static_cast<ELFRel *>(nullptr); 142 } 143 } 144 145 ELFRelocation::~ELFRelocation() { 146 if (reloc.is<ELFRel *>()) 147 delete reloc.get<ELFRel *>(); 148 else 149 delete reloc.get<ELFRela *>(); 150 } 151 152 bool ELFRelocation::Parse(const lldb_private::DataExtractor &data, 153 lldb::offset_t *offset) { 154 if (reloc.is<ELFRel *>()) 155 return reloc.get<ELFRel *>()->Parse(data, offset); 156 else 157 return reloc.get<ELFRela *>()->Parse(data, offset); 158 } 159 160 unsigned ELFRelocation::RelocType32(const ELFRelocation &rel) { 161 if (rel.reloc.is<ELFRel *>()) 162 return ELFRel::RelocType32(*rel.reloc.get<ELFRel *>()); 163 else 164 return ELFRela::RelocType32(*rel.reloc.get<ELFRela *>()); 165 } 166 167 unsigned ELFRelocation::RelocType64(const ELFRelocation &rel) { 168 if (rel.reloc.is<ELFRel *>()) 169 return ELFRel::RelocType64(*rel.reloc.get<ELFRel *>()); 170 else 171 return ELFRela::RelocType64(*rel.reloc.get<ELFRela *>()); 172 } 173 174 unsigned ELFRelocation::RelocSymbol32(const ELFRelocation &rel) { 175 if (rel.reloc.is<ELFRel *>()) 176 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel *>()); 177 else 178 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela *>()); 179 } 180 181 unsigned ELFRelocation::RelocSymbol64(const ELFRelocation &rel) { 182 if (rel.reloc.is<ELFRel *>()) 183 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel *>()); 184 else 185 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela *>()); 186 } 187 188 elf_addr ELFRelocation::RelocOffset32(const ELFRelocation &rel) { 189 if (rel.reloc.is<ELFRel *>()) 190 return rel.reloc.get<ELFRel *>()->r_offset; 191 else 192 return rel.reloc.get<ELFRela *>()->r_offset; 193 } 194 195 elf_addr ELFRelocation::RelocOffset64(const ELFRelocation &rel) { 196 if (rel.reloc.is<ELFRel *>()) 197 return rel.reloc.get<ELFRel *>()->r_offset; 198 else 199 return rel.reloc.get<ELFRela *>()->r_offset; 200 } 201 202 elf_sxword ELFRelocation::RelocAddend32(const ELFRelocation &rel) { 203 if (rel.reloc.is<ELFRel *>()) 204 return 0; 205 else 206 return rel.reloc.get<ELFRela *>()->r_addend; 207 } 208 209 elf_sxword ELFRelocation::RelocAddend64(const ELFRelocation &rel) { 210 if (rel.reloc.is<ELFRel *>()) 211 return 0; 212 else 213 return rel.reloc.get<ELFRela *>()->r_addend; 214 } 215 216 static user_id_t SegmentID(size_t PHdrIndex) { 217 return ~user_id_t(PHdrIndex); 218 } 219 220 bool ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) { 221 // Read all fields. 222 if (data.GetU32(offset, &n_namesz, 3) == nullptr) 223 return false; 224 225 // The name field is required to be nul-terminated, and n_namesz includes the 226 // terminating nul in observed implementations (contrary to the ELF-64 spec). 227 // A special case is needed for cores generated by some older Linux versions, 228 // which write a note named "CORE" without a nul terminator and n_namesz = 4. 229 if (n_namesz == 4) { 230 char buf[4]; 231 if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4) 232 return false; 233 if (strncmp(buf, "CORE", 4) == 0) { 234 n_name = "CORE"; 235 *offset += 4; 236 return true; 237 } 238 } 239 240 const char *cstr = data.GetCStr(offset, llvm::alignTo(n_namesz, 4)); 241 if (cstr == nullptr) { 242 Log *log = GetLog(LLDBLog::Symbols); 243 LLDB_LOGF(log, "Failed to parse note name lacking nul terminator"); 244 245 return false; 246 } 247 n_name = cstr; 248 return true; 249 } 250 251 static uint32_t mipsVariantFromElfFlags (const elf::ELFHeader &header) { 252 const uint32_t mips_arch = header.e_flags & llvm::ELF::EF_MIPS_ARCH; 253 uint32_t endian = header.e_ident[EI_DATA]; 254 uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown; 255 uint32_t fileclass = header.e_ident[EI_CLASS]; 256 257 // If there aren't any elf flags available (e.g core elf file) then return 258 // default 259 // 32 or 64 bit arch (without any architecture revision) based on object file's class. 260 if (header.e_type == ET_CORE) { 261 switch (fileclass) { 262 case llvm::ELF::ELFCLASS32: 263 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el 264 : ArchSpec::eMIPSSubType_mips32; 265 case llvm::ELF::ELFCLASS64: 266 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el 267 : ArchSpec::eMIPSSubType_mips64; 268 default: 269 return arch_variant; 270 } 271 } 272 273 switch (mips_arch) { 274 case llvm::ELF::EF_MIPS_ARCH_1: 275 case llvm::ELF::EF_MIPS_ARCH_2: 276 case llvm::ELF::EF_MIPS_ARCH_32: 277 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el 278 : ArchSpec::eMIPSSubType_mips32; 279 case llvm::ELF::EF_MIPS_ARCH_32R2: 280 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r2el 281 : ArchSpec::eMIPSSubType_mips32r2; 282 case llvm::ELF::EF_MIPS_ARCH_32R6: 283 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r6el 284 : ArchSpec::eMIPSSubType_mips32r6; 285 case llvm::ELF::EF_MIPS_ARCH_3: 286 case llvm::ELF::EF_MIPS_ARCH_4: 287 case llvm::ELF::EF_MIPS_ARCH_5: 288 case llvm::ELF::EF_MIPS_ARCH_64: 289 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el 290 : ArchSpec::eMIPSSubType_mips64; 291 case llvm::ELF::EF_MIPS_ARCH_64R2: 292 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r2el 293 : ArchSpec::eMIPSSubType_mips64r2; 294 case llvm::ELF::EF_MIPS_ARCH_64R6: 295 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r6el 296 : ArchSpec::eMIPSSubType_mips64r6; 297 default: 298 break; 299 } 300 301 return arch_variant; 302 } 303 304 static uint32_t riscvVariantFromElfFlags(const elf::ELFHeader &header) { 305 uint32_t fileclass = header.e_ident[EI_CLASS]; 306 switch (fileclass) { 307 case llvm::ELF::ELFCLASS32: 308 return ArchSpec::eRISCVSubType_riscv32; 309 case llvm::ELF::ELFCLASS64: 310 return ArchSpec::eRISCVSubType_riscv64; 311 default: 312 return ArchSpec::eRISCVSubType_unknown; 313 } 314 } 315 316 static uint32_t ppc64VariantFromElfFlags(const elf::ELFHeader &header) { 317 uint32_t endian = header.e_ident[EI_DATA]; 318 if (endian == ELFDATA2LSB) 319 return ArchSpec::eCore_ppc64le_generic; 320 else 321 return ArchSpec::eCore_ppc64_generic; 322 } 323 324 static uint32_t loongarchVariantFromElfFlags(const elf::ELFHeader &header) { 325 uint32_t fileclass = header.e_ident[EI_CLASS]; 326 switch (fileclass) { 327 case llvm::ELF::ELFCLASS32: 328 return ArchSpec::eLoongArchSubType_loongarch32; 329 case llvm::ELF::ELFCLASS64: 330 return ArchSpec::eLoongArchSubType_loongarch64; 331 default: 332 return ArchSpec::eLoongArchSubType_unknown; 333 } 334 } 335 336 static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) { 337 if (header.e_machine == llvm::ELF::EM_MIPS) 338 return mipsVariantFromElfFlags(header); 339 else if (header.e_machine == llvm::ELF::EM_PPC64) 340 return ppc64VariantFromElfFlags(header); 341 else if (header.e_machine == llvm::ELF::EM_RISCV) 342 return riscvVariantFromElfFlags(header); 343 else if (header.e_machine == llvm::ELF::EM_LOONGARCH) 344 return loongarchVariantFromElfFlags(header); 345 346 return LLDB_INVALID_CPUTYPE; 347 } 348 349 char ObjectFileELF::ID; 350 351 // Arbitrary constant used as UUID prefix for core files. 352 const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C); 353 354 // Static methods. 355 void ObjectFileELF::Initialize() { 356 PluginManager::RegisterPlugin(GetPluginNameStatic(), 357 GetPluginDescriptionStatic(), CreateInstance, 358 CreateMemoryInstance, GetModuleSpecifications); 359 } 360 361 void ObjectFileELF::Terminate() { 362 PluginManager::UnregisterPlugin(CreateInstance); 363 } 364 365 ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp, 366 DataBufferSP data_sp, 367 lldb::offset_t data_offset, 368 const lldb_private::FileSpec *file, 369 lldb::offset_t file_offset, 370 lldb::offset_t length) { 371 bool mapped_writable = false; 372 if (!data_sp) { 373 data_sp = MapFileDataWritable(*file, length, file_offset); 374 if (!data_sp) 375 return nullptr; 376 data_offset = 0; 377 mapped_writable = true; 378 } 379 380 assert(data_sp); 381 382 if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset)) 383 return nullptr; 384 385 const uint8_t *magic = data_sp->GetBytes() + data_offset; 386 if (!ELFHeader::MagicBytesMatch(magic)) 387 return nullptr; 388 389 // Update the data to contain the entire file if it doesn't already 390 if (data_sp->GetByteSize() < length) { 391 data_sp = MapFileDataWritable(*file, length, file_offset); 392 if (!data_sp) 393 return nullptr; 394 data_offset = 0; 395 mapped_writable = true; 396 magic = data_sp->GetBytes(); 397 } 398 399 // If we didn't map the data as writable take ownership of the buffer. 400 if (!mapped_writable) { 401 data_sp = std::make_shared<DataBufferHeap>(data_sp->GetBytes(), 402 data_sp->GetByteSize()); 403 data_offset = 0; 404 magic = data_sp->GetBytes(); 405 } 406 407 unsigned address_size = ELFHeader::AddressSizeInBytes(magic); 408 if (address_size == 4 || address_size == 8) { 409 std::unique_ptr<ObjectFileELF> objfile_up(new ObjectFileELF( 410 module_sp, data_sp, data_offset, file, file_offset, length)); 411 ArchSpec spec = objfile_up->GetArchitecture(); 412 if (spec && objfile_up->SetModulesArchitecture(spec)) 413 return objfile_up.release(); 414 } 415 416 return nullptr; 417 } 418 419 ObjectFile *ObjectFileELF::CreateMemoryInstance( 420 const lldb::ModuleSP &module_sp, WritableDataBufferSP data_sp, 421 const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) { 422 if (!data_sp || data_sp->GetByteSize() < (llvm::ELF::EI_NIDENT)) 423 return nullptr; 424 const uint8_t *magic = data_sp->GetBytes(); 425 if (!ELFHeader::MagicBytesMatch(magic)) 426 return nullptr; 427 // Read the ELF header first so we can figure out how many bytes we need 428 // to read to get as least the ELF header + program headers. 429 DataExtractor data; 430 data.SetData(data_sp); 431 elf::ELFHeader hdr; 432 lldb::offset_t offset = 0; 433 if (!hdr.Parse(data, &offset)) 434 return nullptr; 435 436 // Make sure the address size is set correctly in the ELF header. 437 if (!hdr.Is32Bit() && !hdr.Is64Bit()) 438 return nullptr; 439 // Figure out where the program headers end and read enough bytes to get the 440 // program headers in their entirety. 441 lldb::offset_t end_phdrs = hdr.e_phoff + (hdr.e_phentsize * hdr.e_phnum); 442 if (end_phdrs > data_sp->GetByteSize()) 443 data_sp = ReadMemory(process_sp, header_addr, end_phdrs); 444 445 std::unique_ptr<ObjectFileELF> objfile_up( 446 new ObjectFileELF(module_sp, data_sp, process_sp, header_addr)); 447 ArchSpec spec = objfile_up->GetArchitecture(); 448 if (spec && objfile_up->SetModulesArchitecture(spec)) 449 return objfile_up.release(); 450 451 return nullptr; 452 } 453 454 bool ObjectFileELF::MagicBytesMatch(DataBufferSP &data_sp, 455 lldb::addr_t data_offset, 456 lldb::addr_t data_length) { 457 if (data_sp && 458 data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) { 459 const uint8_t *magic = data_sp->GetBytes() + data_offset; 460 return ELFHeader::MagicBytesMatch(magic); 461 } 462 return false; 463 } 464 465 static uint32_t calc_crc32(uint32_t init, const DataExtractor &data) { 466 return llvm::crc32(init, 467 llvm::ArrayRef(data.GetDataStart(), data.GetByteSize())); 468 } 469 470 uint32_t ObjectFileELF::CalculateELFNotesSegmentsCRC32( 471 const ProgramHeaderColl &program_headers, DataExtractor &object_data) { 472 473 uint32_t core_notes_crc = 0; 474 475 for (const ELFProgramHeader &H : program_headers) { 476 if (H.p_type == llvm::ELF::PT_NOTE) { 477 const elf_off ph_offset = H.p_offset; 478 const size_t ph_size = H.p_filesz; 479 480 DataExtractor segment_data; 481 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size) { 482 // The ELF program header contained incorrect data, probably corefile 483 // is incomplete or corrupted. 484 break; 485 } 486 487 core_notes_crc = calc_crc32(core_notes_crc, segment_data); 488 } 489 } 490 491 return core_notes_crc; 492 } 493 494 static const char *OSABIAsCString(unsigned char osabi_byte) { 495 #define _MAKE_OSABI_CASE(x) \ 496 case x: \ 497 return #x 498 switch (osabi_byte) { 499 _MAKE_OSABI_CASE(ELFOSABI_NONE); 500 _MAKE_OSABI_CASE(ELFOSABI_HPUX); 501 _MAKE_OSABI_CASE(ELFOSABI_NETBSD); 502 _MAKE_OSABI_CASE(ELFOSABI_GNU); 503 _MAKE_OSABI_CASE(ELFOSABI_HURD); 504 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS); 505 _MAKE_OSABI_CASE(ELFOSABI_AIX); 506 _MAKE_OSABI_CASE(ELFOSABI_IRIX); 507 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD); 508 _MAKE_OSABI_CASE(ELFOSABI_TRU64); 509 _MAKE_OSABI_CASE(ELFOSABI_MODESTO); 510 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD); 511 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS); 512 _MAKE_OSABI_CASE(ELFOSABI_NSK); 513 _MAKE_OSABI_CASE(ELFOSABI_AROS); 514 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS); 515 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI); 516 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX); 517 _MAKE_OSABI_CASE(ELFOSABI_ARM); 518 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE); 519 default: 520 return "<unknown-osabi>"; 521 } 522 #undef _MAKE_OSABI_CASE 523 } 524 525 // 526 // WARNING : This function is being deprecated 527 // It's functionality has moved to ArchSpec::SetArchitecture This function is 528 // only being kept to validate the move. 529 // 530 // TODO : Remove this function 531 static bool GetOsFromOSABI(unsigned char osabi_byte, 532 llvm::Triple::OSType &ostype) { 533 switch (osabi_byte) { 534 case ELFOSABI_AIX: 535 ostype = llvm::Triple::OSType::AIX; 536 break; 537 case ELFOSABI_FREEBSD: 538 ostype = llvm::Triple::OSType::FreeBSD; 539 break; 540 case ELFOSABI_GNU: 541 ostype = llvm::Triple::OSType::Linux; 542 break; 543 case ELFOSABI_NETBSD: 544 ostype = llvm::Triple::OSType::NetBSD; 545 break; 546 case ELFOSABI_OPENBSD: 547 ostype = llvm::Triple::OSType::OpenBSD; 548 break; 549 case ELFOSABI_SOLARIS: 550 ostype = llvm::Triple::OSType::Solaris; 551 break; 552 default: 553 ostype = llvm::Triple::OSType::UnknownOS; 554 } 555 return ostype != llvm::Triple::OSType::UnknownOS; 556 } 557 558 size_t ObjectFileELF::GetModuleSpecifications( 559 const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp, 560 lldb::offset_t data_offset, lldb::offset_t file_offset, 561 lldb::offset_t length, lldb_private::ModuleSpecList &specs) { 562 Log *log = GetLog(LLDBLog::Modules); 563 564 const size_t initial_count = specs.GetSize(); 565 566 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) { 567 DataExtractor data; 568 data.SetData(data_sp); 569 elf::ELFHeader header; 570 lldb::offset_t header_offset = data_offset; 571 if (header.Parse(data, &header_offset)) { 572 if (data_sp) { 573 ModuleSpec spec(file); 574 // In Android API level 23 and above, bionic dynamic linker is able to 575 // load .so file directly from zip file. In that case, .so file is 576 // page aligned and uncompressed, and this module spec should retain the 577 // .so file offset and file size to pass through the information from 578 // lldb-server to LLDB. For normal file, file_offset should be 0, 579 // length should be the size of the file. 580 spec.SetObjectOffset(file_offset); 581 spec.SetObjectSize(length); 582 583 const uint32_t sub_type = subTypeFromElfHeader(header); 584 spec.GetArchitecture().SetArchitecture( 585 eArchTypeELF, header.e_machine, sub_type, header.e_ident[EI_OSABI]); 586 587 if (spec.GetArchitecture().IsValid()) { 588 llvm::Triple::OSType ostype; 589 llvm::Triple::VendorType vendor; 590 llvm::Triple::OSType spec_ostype = 591 spec.GetArchitecture().GetTriple().getOS(); 592 593 LLDB_LOGF(log, "ObjectFileELF::%s file '%s' module OSABI: %s", 594 __FUNCTION__, file.GetPath().c_str(), 595 OSABIAsCString(header.e_ident[EI_OSABI])); 596 597 // SetArchitecture should have set the vendor to unknown 598 vendor = spec.GetArchitecture().GetTriple().getVendor(); 599 assert(vendor == llvm::Triple::UnknownVendor); 600 UNUSED_IF_ASSERT_DISABLED(vendor); 601 602 // 603 // Validate it is ok to remove GetOsFromOSABI 604 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype); 605 assert(spec_ostype == ostype); 606 if (spec_ostype != llvm::Triple::OSType::UnknownOS) { 607 LLDB_LOGF(log, 608 "ObjectFileELF::%s file '%s' set ELF module OS type " 609 "from ELF header OSABI.", 610 __FUNCTION__, file.GetPath().c_str()); 611 } 612 613 // When ELF file does not contain GNU build ID, the later code will 614 // calculate CRC32 with this data_sp file_offset and length. It is 615 // important for Android zip .so file, which is a slice of a file, 616 // to not access the outside of the file slice range. 617 if (data_sp->GetByteSize() < length) 618 data_sp = MapFileData(file, length, file_offset); 619 if (data_sp) 620 data.SetData(data_sp); 621 // In case there is header extension in the section #0, the header we 622 // parsed above could have sentinel values for e_phnum, e_shnum, and 623 // e_shstrndx. In this case we need to reparse the header with a 624 // bigger data source to get the actual values. 625 if (header.HasHeaderExtension()) { 626 lldb::offset_t header_offset = data_offset; 627 header.Parse(data, &header_offset); 628 } 629 630 uint32_t gnu_debuglink_crc = 0; 631 std::string gnu_debuglink_file; 632 SectionHeaderColl section_headers; 633 lldb_private::UUID &uuid = spec.GetUUID(); 634 635 GetSectionHeaderInfo(section_headers, data, header, uuid, 636 gnu_debuglink_file, gnu_debuglink_crc, 637 spec.GetArchitecture()); 638 639 llvm::Triple &spec_triple = spec.GetArchitecture().GetTriple(); 640 641 LLDB_LOGF(log, 642 "ObjectFileELF::%s file '%s' module set to triple: %s " 643 "(architecture %s)", 644 __FUNCTION__, file.GetPath().c_str(), 645 spec_triple.getTriple().c_str(), 646 spec.GetArchitecture().GetArchitectureName()); 647 648 if (!uuid.IsValid()) { 649 uint32_t core_notes_crc = 0; 650 651 if (!gnu_debuglink_crc) { 652 LLDB_SCOPED_TIMERF( 653 "Calculating module crc32 %s with size %" PRIu64 " KiB", 654 file.GetFilename().AsCString(), 655 (length - file_offset) / 1024); 656 657 // For core files - which usually don't happen to have a 658 // gnu_debuglink, and are pretty bulky - calculating whole 659 // contents crc32 would be too much of luxury. Thus we will need 660 // to fallback to something simpler. 661 if (header.e_type == llvm::ELF::ET_CORE) { 662 ProgramHeaderColl program_headers; 663 GetProgramHeaderInfo(program_headers, data, header); 664 665 core_notes_crc = 666 CalculateELFNotesSegmentsCRC32(program_headers, data); 667 } else { 668 gnu_debuglink_crc = calc_crc32(0, data); 669 } 670 } 671 using u32le = llvm::support::ulittle32_t; 672 if (gnu_debuglink_crc) { 673 // Use 4 bytes of crc from the .gnu_debuglink section. 674 u32le data(gnu_debuglink_crc); 675 uuid = UUID(&data, sizeof(data)); 676 } else if (core_notes_crc) { 677 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make 678 // it look different form .gnu_debuglink crc followed by 4 bytes 679 // of note segments crc. 680 u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)}; 681 uuid = UUID(data, sizeof(data)); 682 } 683 } 684 685 specs.Append(spec); 686 } 687 } 688 } 689 } 690 691 return specs.GetSize() - initial_count; 692 } 693 694 // ObjectFile protocol 695 696 ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp, 697 DataBufferSP data_sp, lldb::offset_t data_offset, 698 const FileSpec *file, lldb::offset_t file_offset, 699 lldb::offset_t length) 700 : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset) { 701 if (file) 702 m_file = *file; 703 } 704 705 ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp, 706 DataBufferSP header_data_sp, 707 const lldb::ProcessSP &process_sp, 708 addr_t header_addr) 709 : ObjectFile(module_sp, process_sp, header_addr, header_data_sp) {} 710 711 bool ObjectFileELF::IsExecutable() const { 712 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0); 713 } 714 715 bool ObjectFileELF::SetLoadAddress(Target &target, lldb::addr_t value, 716 bool value_is_offset) { 717 ModuleSP module_sp = GetModule(); 718 if (module_sp) { 719 size_t num_loaded_sections = 0; 720 SectionList *section_list = GetSectionList(); 721 if (section_list) { 722 if (!value_is_offset) { 723 addr_t base = GetBaseAddress().GetFileAddress(); 724 if (base == LLDB_INVALID_ADDRESS) 725 return false; 726 value -= base; 727 } 728 729 const size_t num_sections = section_list->GetSize(); 730 size_t sect_idx = 0; 731 732 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) { 733 // Iterate through the object file sections to find all of the sections 734 // that have SHF_ALLOC in their flag bits. 735 SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx)); 736 737 // PT_TLS segments can have the same p_vaddr and p_paddr as other 738 // PT_LOAD segments so we shouldn't load them. If we do load them, then 739 // the SectionLoadList will incorrectly fill in the instance variable 740 // SectionLoadList::m_addr_to_sect with the same address as a PT_LOAD 741 // segment and we won't be able to resolve addresses in the PT_LOAD 742 // segment whose p_vaddr entry matches that of the PT_TLS. Any variables 743 // that appear in the PT_TLS segments get resolved by the DWARF 744 // expressions. If this ever changes we will need to fix all object 745 // file plug-ins, but until then, we don't want PT_TLS segments to 746 // remove the entry from SectionLoadList::m_addr_to_sect when we call 747 // SetSectionLoadAddress() below. 748 if (section_sp->IsThreadSpecific()) 749 continue; 750 if (section_sp->Test(SHF_ALLOC) || 751 section_sp->GetType() == eSectionTypeContainer) { 752 lldb::addr_t load_addr = section_sp->GetFileAddress(); 753 // We don't want to update the load address of a section with type 754 // eSectionTypeAbsoluteAddress as they already have the absolute load 755 // address already specified 756 if (section_sp->GetType() != eSectionTypeAbsoluteAddress) 757 load_addr += value; 758 759 // On 32-bit systems the load address have to fit into 4 bytes. The 760 // rest of the bytes are the overflow from the addition. 761 if (GetAddressByteSize() == 4) 762 load_addr &= 0xFFFFFFFF; 763 764 if (target.GetSectionLoadList().SetSectionLoadAddress(section_sp, 765 load_addr)) 766 ++num_loaded_sections; 767 } 768 } 769 return num_loaded_sections > 0; 770 } 771 } 772 return false; 773 } 774 775 ByteOrder ObjectFileELF::GetByteOrder() const { 776 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB) 777 return eByteOrderBig; 778 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB) 779 return eByteOrderLittle; 780 return eByteOrderInvalid; 781 } 782 783 uint32_t ObjectFileELF::GetAddressByteSize() const { 784 return m_data.GetAddressByteSize(); 785 } 786 787 AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) { 788 Symtab *symtab = GetSymtab(); 789 if (!symtab) 790 return AddressClass::eUnknown; 791 792 // The address class is determined based on the symtab. Ask it from the 793 // object file what contains the symtab information. 794 ObjectFile *symtab_objfile = symtab->GetObjectFile(); 795 if (symtab_objfile != nullptr && symtab_objfile != this) 796 return symtab_objfile->GetAddressClass(file_addr); 797 798 auto res = ObjectFile::GetAddressClass(file_addr); 799 if (res != AddressClass::eCode) 800 return res; 801 802 auto ub = m_address_class_map.upper_bound(file_addr); 803 if (ub == m_address_class_map.begin()) { 804 // No entry in the address class map before the address. Return default 805 // address class for an address in a code section. 806 return AddressClass::eCode; 807 } 808 809 // Move iterator to the address class entry preceding address 810 --ub; 811 812 return ub->second; 813 } 814 815 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) { 816 return std::distance(m_section_headers.begin(), I); 817 } 818 819 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const { 820 return std::distance(m_section_headers.begin(), I); 821 } 822 823 bool ObjectFileELF::ParseHeader() { 824 lldb::offset_t offset = 0; 825 return m_header.Parse(m_data, &offset); 826 } 827 828 UUID ObjectFileELF::GetUUID() { 829 // Need to parse the section list to get the UUIDs, so make sure that's been 830 // done. 831 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile) 832 return UUID(); 833 834 if (!m_uuid) { 835 using u32le = llvm::support::ulittle32_t; 836 if (GetType() == ObjectFile::eTypeCoreFile) { 837 uint32_t core_notes_crc = 0; 838 839 if (!ParseProgramHeaders()) 840 return UUID(); 841 842 core_notes_crc = 843 CalculateELFNotesSegmentsCRC32(m_program_headers, m_data); 844 845 if (core_notes_crc) { 846 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it 847 // look different form .gnu_debuglink crc - followed by 4 bytes of note 848 // segments crc. 849 u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)}; 850 m_uuid = UUID(data, sizeof(data)); 851 } 852 } else { 853 if (!m_gnu_debuglink_crc) 854 m_gnu_debuglink_crc = calc_crc32(0, m_data); 855 if (m_gnu_debuglink_crc) { 856 // Use 4 bytes of crc from the .gnu_debuglink section. 857 u32le data(m_gnu_debuglink_crc); 858 m_uuid = UUID(&data, sizeof(data)); 859 } 860 } 861 } 862 863 return m_uuid; 864 } 865 866 std::optional<FileSpec> ObjectFileELF::GetDebugLink() { 867 if (m_gnu_debuglink_file.empty()) 868 return std::nullopt; 869 return FileSpec(m_gnu_debuglink_file); 870 } 871 872 uint32_t ObjectFileELF::GetDependentModules(FileSpecList &files) { 873 size_t num_modules = ParseDependentModules(); 874 uint32_t num_specs = 0; 875 876 for (unsigned i = 0; i < num_modules; ++i) { 877 if (files.AppendIfUnique(m_filespec_up->GetFileSpecAtIndex(i))) 878 num_specs++; 879 } 880 881 return num_specs; 882 } 883 884 Address ObjectFileELF::GetImageInfoAddress(Target *target) { 885 if (!ParseDynamicSymbols()) 886 return Address(); 887 888 SectionList *section_list = GetSectionList(); 889 if (!section_list) 890 return Address(); 891 892 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) { 893 const ELFDynamic &symbol = m_dynamic_symbols[i].symbol; 894 895 if (symbol.d_tag != DT_DEBUG && symbol.d_tag != DT_MIPS_RLD_MAP && 896 symbol.d_tag != DT_MIPS_RLD_MAP_REL) 897 continue; 898 899 // Compute the offset as the number of previous entries plus the size of 900 // d_tag. 901 const addr_t offset = (i * 2 + 1) * GetAddressByteSize(); 902 const addr_t d_file_addr = m_dynamic_base_addr + offset; 903 Address d_addr; 904 if (!d_addr.ResolveAddressUsingFileSections(d_file_addr, GetSectionList())) 905 return Address(); 906 if (symbol.d_tag == DT_DEBUG) 907 return d_addr; 908 909 // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP 910 // exists in non-PIE. 911 if ((symbol.d_tag == DT_MIPS_RLD_MAP || 912 symbol.d_tag == DT_MIPS_RLD_MAP_REL) && 913 target) { 914 const addr_t d_load_addr = d_addr.GetLoadAddress(target); 915 if (d_load_addr == LLDB_INVALID_ADDRESS) 916 return Address(); 917 918 Status error; 919 if (symbol.d_tag == DT_MIPS_RLD_MAP) { 920 // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer. 921 Address addr; 922 if (target->ReadPointerFromMemory(d_load_addr, error, addr, true)) 923 return addr; 924 } 925 if (symbol.d_tag == DT_MIPS_RLD_MAP_REL) { 926 // DT_MIPS_RLD_MAP_REL tag stores the offset to the debug pointer, 927 // relative to the address of the tag. 928 uint64_t rel_offset; 929 rel_offset = target->ReadUnsignedIntegerFromMemory( 930 d_load_addr, GetAddressByteSize(), UINT64_MAX, error, true); 931 if (error.Success() && rel_offset != UINT64_MAX) { 932 Address addr; 933 addr_t debug_ptr_address = 934 d_load_addr - GetAddressByteSize() + rel_offset; 935 addr.SetOffset(debug_ptr_address); 936 return addr; 937 } 938 } 939 } 940 } 941 return Address(); 942 } 943 944 lldb_private::Address ObjectFileELF::GetEntryPointAddress() { 945 if (m_entry_point_address.IsValid()) 946 return m_entry_point_address; 947 948 if (!ParseHeader() || !IsExecutable()) 949 return m_entry_point_address; 950 951 SectionList *section_list = GetSectionList(); 952 addr_t offset = m_header.e_entry; 953 954 if (!section_list) 955 m_entry_point_address.SetOffset(offset); 956 else 957 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list); 958 return m_entry_point_address; 959 } 960 961 Address ObjectFileELF::GetBaseAddress() { 962 if (GetType() == ObjectFile::eTypeObjectFile) { 963 for (SectionHeaderCollIter I = std::next(m_section_headers.begin()); 964 I != m_section_headers.end(); ++I) { 965 const ELFSectionHeaderInfo &header = *I; 966 if (header.sh_flags & SHF_ALLOC) 967 return Address(GetSectionList()->FindSectionByID(SectionIndex(I)), 0); 968 } 969 return LLDB_INVALID_ADDRESS; 970 } 971 972 for (const auto &EnumPHdr : llvm::enumerate(ProgramHeaders())) { 973 const ELFProgramHeader &H = EnumPHdr.value(); 974 if (H.p_type != PT_LOAD) 975 continue; 976 977 return Address( 978 GetSectionList()->FindSectionByID(SegmentID(EnumPHdr.index())), 0); 979 } 980 return LLDB_INVALID_ADDRESS; 981 } 982 983 size_t ObjectFileELF::ParseDependentModules() { 984 if (m_filespec_up) 985 return m_filespec_up->GetSize(); 986 987 m_filespec_up = std::make_unique<FileSpecList>(); 988 989 if (ParseDynamicSymbols()) { 990 for (const auto &entry : m_dynamic_symbols) { 991 if (entry.symbol.d_tag != DT_NEEDED) 992 continue; 993 if (!entry.name.empty()) { 994 FileSpec file_spec(entry.name); 995 FileSystem::Instance().Resolve(file_spec); 996 m_filespec_up->Append(file_spec); 997 } 998 } 999 } 1000 return m_filespec_up->GetSize(); 1001 } 1002 1003 // GetProgramHeaderInfo 1004 size_t ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers, 1005 DataExtractor &object_data, 1006 const ELFHeader &header) { 1007 // We have already parsed the program headers 1008 if (!program_headers.empty()) 1009 return program_headers.size(); 1010 1011 // If there are no program headers to read we are done. 1012 if (header.e_phnum == 0) 1013 return 0; 1014 1015 program_headers.resize(header.e_phnum); 1016 if (program_headers.size() != header.e_phnum) 1017 return 0; 1018 1019 const size_t ph_size = header.e_phnum * header.e_phentsize; 1020 const elf_off ph_offset = header.e_phoff; 1021 DataExtractor data; 1022 if (data.SetData(object_data, ph_offset, ph_size) != ph_size) 1023 return 0; 1024 1025 uint32_t idx; 1026 lldb::offset_t offset; 1027 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx) { 1028 if (!program_headers[idx].Parse(data, &offset)) 1029 break; 1030 } 1031 1032 if (idx < program_headers.size()) 1033 program_headers.resize(idx); 1034 1035 return program_headers.size(); 1036 } 1037 1038 // ParseProgramHeaders 1039 bool ObjectFileELF::ParseProgramHeaders() { 1040 return GetProgramHeaderInfo(m_program_headers, m_data, m_header) != 0; 1041 } 1042 1043 lldb_private::Status 1044 ObjectFileELF::RefineModuleDetailsFromNote(lldb_private::DataExtractor &data, 1045 lldb_private::ArchSpec &arch_spec, 1046 lldb_private::UUID &uuid) { 1047 Log *log = GetLog(LLDBLog::Modules); 1048 Status error; 1049 1050 lldb::offset_t offset = 0; 1051 1052 while (true) { 1053 // Parse the note header. If this fails, bail out. 1054 const lldb::offset_t note_offset = offset; 1055 ELFNote note = ELFNote(); 1056 if (!note.Parse(data, &offset)) { 1057 // We're done. 1058 return error; 1059 } 1060 1061 LLDB_LOGF(log, "ObjectFileELF::%s parsing note name='%s', type=%" PRIu32, 1062 __FUNCTION__, note.n_name.c_str(), note.n_type); 1063 1064 // Process FreeBSD ELF notes. 1065 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) && 1066 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) && 1067 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE)) { 1068 // Pull out the min version info. 1069 uint32_t version_info; 1070 if (data.GetU32(&offset, &version_info, 1) == nullptr) { 1071 error.SetErrorString("failed to read FreeBSD ABI note payload"); 1072 return error; 1073 } 1074 1075 // Convert the version info into a major/minor number. 1076 const uint32_t version_major = version_info / 100000; 1077 const uint32_t version_minor = (version_info / 1000) % 100; 1078 1079 char os_name[32]; 1080 snprintf(os_name, sizeof(os_name), "freebsd%" PRIu32 ".%" PRIu32, 1081 version_major, version_minor); 1082 1083 // Set the elf OS version to FreeBSD. Also clear the vendor. 1084 arch_spec.GetTriple().setOSName(os_name); 1085 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1086 1087 LLDB_LOGF(log, 1088 "ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32 1089 ".%" PRIu32, 1090 __FUNCTION__, version_major, version_minor, 1091 static_cast<uint32_t>(version_info % 1000)); 1092 } 1093 // Process GNU ELF notes. 1094 else if (note.n_name == LLDB_NT_OWNER_GNU) { 1095 switch (note.n_type) { 1096 case LLDB_NT_GNU_ABI_TAG: 1097 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE) { 1098 // Pull out the min OS version supporting the ABI. 1099 uint32_t version_info[4]; 1100 if (data.GetU32(&offset, &version_info[0], note.n_descsz / 4) == 1101 nullptr) { 1102 error.SetErrorString("failed to read GNU ABI note payload"); 1103 return error; 1104 } 1105 1106 // Set the OS per the OS field. 1107 switch (version_info[0]) { 1108 case LLDB_NT_GNU_ABI_OS_LINUX: 1109 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1110 arch_spec.GetTriple().setVendor( 1111 llvm::Triple::VendorType::UnknownVendor); 1112 LLDB_LOGF(log, 1113 "ObjectFileELF::%s detected Linux, min version %" PRIu32 1114 ".%" PRIu32 ".%" PRIu32, 1115 __FUNCTION__, version_info[1], version_info[2], 1116 version_info[3]); 1117 // FIXME we have the minimal version number, we could be propagating 1118 // that. version_info[1] = OS Major, version_info[2] = OS Minor, 1119 // version_info[3] = Revision. 1120 break; 1121 case LLDB_NT_GNU_ABI_OS_HURD: 1122 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS); 1123 arch_spec.GetTriple().setVendor( 1124 llvm::Triple::VendorType::UnknownVendor); 1125 LLDB_LOGF(log, 1126 "ObjectFileELF::%s detected Hurd (unsupported), min " 1127 "version %" PRIu32 ".%" PRIu32 ".%" PRIu32, 1128 __FUNCTION__, version_info[1], version_info[2], 1129 version_info[3]); 1130 break; 1131 case LLDB_NT_GNU_ABI_OS_SOLARIS: 1132 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Solaris); 1133 arch_spec.GetTriple().setVendor( 1134 llvm::Triple::VendorType::UnknownVendor); 1135 LLDB_LOGF(log, 1136 "ObjectFileELF::%s detected Solaris, min version %" PRIu32 1137 ".%" PRIu32 ".%" PRIu32, 1138 __FUNCTION__, version_info[1], version_info[2], 1139 version_info[3]); 1140 break; 1141 default: 1142 LLDB_LOGF(log, 1143 "ObjectFileELF::%s unrecognized OS in note, id %" PRIu32 1144 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, 1145 __FUNCTION__, version_info[0], version_info[1], 1146 version_info[2], version_info[3]); 1147 break; 1148 } 1149 } 1150 break; 1151 1152 case LLDB_NT_GNU_BUILD_ID_TAG: 1153 // Only bother processing this if we don't already have the uuid set. 1154 if (!uuid.IsValid()) { 1155 // 16 bytes is UUID|MD5, 20 bytes is SHA1. Other linkers may produce a 1156 // build-id of a different length. Accept it as long as it's at least 1157 // 4 bytes as it will be better than our own crc32. 1158 if (note.n_descsz >= 4) { 1159 if (const uint8_t *buf = data.PeekData(offset, note.n_descsz)) { 1160 // Save the build id as the UUID for the module. 1161 uuid = UUID(buf, note.n_descsz); 1162 } else { 1163 error.SetErrorString("failed to read GNU_BUILD_ID note payload"); 1164 return error; 1165 } 1166 } 1167 } 1168 break; 1169 } 1170 if (arch_spec.IsMIPS() && 1171 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) 1172 // The note.n_name == LLDB_NT_OWNER_GNU is valid for Linux platform 1173 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1174 } 1175 // Process NetBSD ELF executables and shared libraries 1176 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) && 1177 (note.n_type == LLDB_NT_NETBSD_IDENT_TAG) && 1178 (note.n_descsz == LLDB_NT_NETBSD_IDENT_DESCSZ) && 1179 (note.n_namesz == LLDB_NT_NETBSD_IDENT_NAMESZ)) { 1180 // Pull out the version info. 1181 uint32_t version_info; 1182 if (data.GetU32(&offset, &version_info, 1) == nullptr) { 1183 error.SetErrorString("failed to read NetBSD ABI note payload"); 1184 return error; 1185 } 1186 // Convert the version info into a major/minor/patch number. 1187 // #define __NetBSD_Version__ MMmmrrpp00 1188 // 1189 // M = major version 1190 // m = minor version; a minor number of 99 indicates current. 1191 // r = 0 (since NetBSD 3.0 not used) 1192 // p = patchlevel 1193 const uint32_t version_major = version_info / 100000000; 1194 const uint32_t version_minor = (version_info % 100000000) / 1000000; 1195 const uint32_t version_patch = (version_info % 10000) / 100; 1196 // Set the elf OS version to NetBSD. Also clear the vendor. 1197 arch_spec.GetTriple().setOSName( 1198 llvm::formatv("netbsd{0}.{1}.{2}", version_major, version_minor, 1199 version_patch).str()); 1200 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1201 } 1202 // Process NetBSD ELF core(5) notes 1203 else if ((note.n_name == LLDB_NT_OWNER_NETBSDCORE) && 1204 (note.n_type == LLDB_NT_NETBSD_PROCINFO)) { 1205 // Set the elf OS version to NetBSD. Also clear the vendor. 1206 arch_spec.GetTriple().setOS(llvm::Triple::OSType::NetBSD); 1207 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1208 } 1209 // Process OpenBSD ELF notes. 1210 else if (note.n_name == LLDB_NT_OWNER_OPENBSD) { 1211 // Set the elf OS version to OpenBSD. Also clear the vendor. 1212 arch_spec.GetTriple().setOS(llvm::Triple::OSType::OpenBSD); 1213 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1214 } else if (note.n_name == LLDB_NT_OWNER_ANDROID) { 1215 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1216 arch_spec.GetTriple().setEnvironment( 1217 llvm::Triple::EnvironmentType::Android); 1218 } else if (note.n_name == LLDB_NT_OWNER_LINUX) { 1219 // This is sometimes found in core files and usually contains extended 1220 // register info 1221 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1222 } else if (note.n_name == LLDB_NT_OWNER_CORE) { 1223 // Parse the NT_FILE to look for stuff in paths to shared libraries 1224 // The contents look like this in a 64 bit ELF core file: 1225 // 1226 // count = 0x000000000000000a (10) 1227 // page_size = 0x0000000000001000 (4096) 1228 // Index start end file_ofs path 1229 // ===== ------------------ ------------------ ------------------ ------------------------------------- 1230 // [ 0] 0x0000000000401000 0x0000000000000000 /tmp/a.out 1231 // [ 1] 0x0000000000600000 0x0000000000601000 0x0000000000000000 /tmp/a.out 1232 // [ 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001 /tmp/a.out 1233 // [ 3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000 /lib/x86_64-linux-gnu/libc-2.19.so 1234 // [ 4] 0x00007fa79cba8000 0x00007fa79cda7000 0x00000000000001bb /lib/x86_64-linux-gnu/libc-2.19.so 1235 // [ 5] 0x00007fa79cda7000 0x00007fa79cdab000 0x00000000000001ba /lib/x86_64-linux-gnu/libc-2.19.so 1236 // [ 6] 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be /lib/x86_64-linux-gnu/libc-2.19.so 1237 // [ 7] 0x00007fa79cdb2000 0x00007fa79cdd5000 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.19.so 1238 // [ 8] 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022 /lib/x86_64-linux-gnu/ld-2.19.so 1239 // [ 9] 0x00007fa79cfd5000 0x00007fa79cfd6000 0x0000000000000023 /lib/x86_64-linux-gnu/ld-2.19.so 1240 // 1241 // In the 32 bit ELFs the count, page_size, start, end, file_ofs are 1242 // uint32_t. 1243 // 1244 // For reference: see readelf source code (in binutils). 1245 if (note.n_type == NT_FILE) { 1246 uint64_t count = data.GetAddress(&offset); 1247 const char *cstr; 1248 data.GetAddress(&offset); // Skip page size 1249 offset += count * 3 * 1250 data.GetAddressByteSize(); // Skip all start/end/file_ofs 1251 for (size_t i = 0; i < count; ++i) { 1252 cstr = data.GetCStr(&offset); 1253 if (cstr == nullptr) { 1254 error.SetErrorStringWithFormat("ObjectFileELF::%s trying to read " 1255 "at an offset after the end " 1256 "(GetCStr returned nullptr)", 1257 __FUNCTION__); 1258 return error; 1259 } 1260 llvm::StringRef path(cstr); 1261 if (path.contains("/lib/x86_64-linux-gnu") || path.contains("/lib/i386-linux-gnu")) { 1262 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1263 break; 1264 } 1265 } 1266 if (arch_spec.IsMIPS() && 1267 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) 1268 // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing for some 1269 // cases (e.g. compile with -nostdlib) Hence set OS to Linux 1270 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1271 } 1272 } 1273 1274 // Calculate the offset of the next note just in case "offset" has been 1275 // used to poke at the contents of the note data 1276 offset = note_offset + note.GetByteSize(); 1277 } 1278 1279 return error; 1280 } 1281 1282 void ObjectFileELF::ParseARMAttributes(DataExtractor &data, uint64_t length, 1283 ArchSpec &arch_spec) { 1284 lldb::offset_t Offset = 0; 1285 1286 uint8_t FormatVersion = data.GetU8(&Offset); 1287 if (FormatVersion != llvm::ELFAttrs::Format_Version) 1288 return; 1289 1290 Offset = Offset + sizeof(uint32_t); // Section Length 1291 llvm::StringRef VendorName = data.GetCStr(&Offset); 1292 1293 if (VendorName != "aeabi") 1294 return; 1295 1296 if (arch_spec.GetTriple().getEnvironment() == 1297 llvm::Triple::UnknownEnvironment) 1298 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI); 1299 1300 while (Offset < length) { 1301 uint8_t Tag = data.GetU8(&Offset); 1302 uint32_t Size = data.GetU32(&Offset); 1303 1304 if (Tag != llvm::ARMBuildAttrs::File || Size == 0) 1305 continue; 1306 1307 while (Offset < length) { 1308 uint64_t Tag = data.GetULEB128(&Offset); 1309 switch (Tag) { 1310 default: 1311 if (Tag < 32) 1312 data.GetULEB128(&Offset); 1313 else if (Tag % 2 == 0) 1314 data.GetULEB128(&Offset); 1315 else 1316 data.GetCStr(&Offset); 1317 1318 break; 1319 1320 case llvm::ARMBuildAttrs::CPU_raw_name: 1321 case llvm::ARMBuildAttrs::CPU_name: 1322 data.GetCStr(&Offset); 1323 1324 break; 1325 1326 case llvm::ARMBuildAttrs::ABI_VFP_args: { 1327 uint64_t VFPArgs = data.GetULEB128(&Offset); 1328 1329 if (VFPArgs == llvm::ARMBuildAttrs::BaseAAPCS) { 1330 if (arch_spec.GetTriple().getEnvironment() == 1331 llvm::Triple::UnknownEnvironment || 1332 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABIHF) 1333 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI); 1334 1335 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float); 1336 } else if (VFPArgs == llvm::ARMBuildAttrs::HardFPAAPCS) { 1337 if (arch_spec.GetTriple().getEnvironment() == 1338 llvm::Triple::UnknownEnvironment || 1339 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABI) 1340 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABIHF); 1341 1342 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float); 1343 } 1344 1345 break; 1346 } 1347 } 1348 } 1349 } 1350 } 1351 1352 // GetSectionHeaderInfo 1353 size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_headers, 1354 DataExtractor &object_data, 1355 const elf::ELFHeader &header, 1356 lldb_private::UUID &uuid, 1357 std::string &gnu_debuglink_file, 1358 uint32_t &gnu_debuglink_crc, 1359 ArchSpec &arch_spec) { 1360 // Don't reparse the section headers if we already did that. 1361 if (!section_headers.empty()) 1362 return section_headers.size(); 1363 1364 // Only initialize the arch_spec to okay defaults if they're not already set. 1365 // We'll refine this with note data as we parse the notes. 1366 if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) { 1367 llvm::Triple::OSType ostype; 1368 llvm::Triple::OSType spec_ostype; 1369 const uint32_t sub_type = subTypeFromElfHeader(header); 1370 arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type, 1371 header.e_ident[EI_OSABI]); 1372 1373 // Validate if it is ok to remove GetOsFromOSABI. Note, that now the OS is 1374 // determined based on EI_OSABI flag and the info extracted from ELF notes 1375 // (see RefineModuleDetailsFromNote). However in some cases that still 1376 // might be not enough: for example a shared library might not have any 1377 // notes at all and have EI_OSABI flag set to System V, as result the OS 1378 // will be set to UnknownOS. 1379 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype); 1380 spec_ostype = arch_spec.GetTriple().getOS(); 1381 assert(spec_ostype == ostype); 1382 UNUSED_IF_ASSERT_DISABLED(spec_ostype); 1383 } 1384 1385 if (arch_spec.GetMachine() == llvm::Triple::mips || 1386 arch_spec.GetMachine() == llvm::Triple::mipsel || 1387 arch_spec.GetMachine() == llvm::Triple::mips64 || 1388 arch_spec.GetMachine() == llvm::Triple::mips64el) { 1389 switch (header.e_flags & llvm::ELF::EF_MIPS_ARCH_ASE) { 1390 case llvm::ELF::EF_MIPS_MICROMIPS: 1391 arch_spec.SetFlags(ArchSpec::eMIPSAse_micromips); 1392 break; 1393 case llvm::ELF::EF_MIPS_ARCH_ASE_M16: 1394 arch_spec.SetFlags(ArchSpec::eMIPSAse_mips16); 1395 break; 1396 case llvm::ELF::EF_MIPS_ARCH_ASE_MDMX: 1397 arch_spec.SetFlags(ArchSpec::eMIPSAse_mdmx); 1398 break; 1399 default: 1400 break; 1401 } 1402 } 1403 1404 if (arch_spec.GetMachine() == llvm::Triple::arm || 1405 arch_spec.GetMachine() == llvm::Triple::thumb) { 1406 if (header.e_flags & llvm::ELF::EF_ARM_SOFT_FLOAT) 1407 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float); 1408 else if (header.e_flags & llvm::ELF::EF_ARM_VFP_FLOAT) 1409 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float); 1410 } 1411 1412 if (arch_spec.GetMachine() == llvm::Triple::riscv32 || 1413 arch_spec.GetMachine() == llvm::Triple::riscv64) { 1414 uint32_t flags = arch_spec.GetFlags(); 1415 1416 if (header.e_flags & llvm::ELF::EF_RISCV_RVC) 1417 flags |= ArchSpec::eRISCV_rvc; 1418 if (header.e_flags & llvm::ELF::EF_RISCV_RVE) 1419 flags |= ArchSpec::eRISCV_rve; 1420 1421 if ((header.e_flags & llvm::ELF::EF_RISCV_FLOAT_ABI_SINGLE) == 1422 llvm::ELF::EF_RISCV_FLOAT_ABI_SINGLE) 1423 flags |= ArchSpec::eRISCV_float_abi_single; 1424 else if ((header.e_flags & llvm::ELF::EF_RISCV_FLOAT_ABI_DOUBLE) == 1425 llvm::ELF::EF_RISCV_FLOAT_ABI_DOUBLE) 1426 flags |= ArchSpec::eRISCV_float_abi_double; 1427 else if ((header.e_flags & llvm::ELF::EF_RISCV_FLOAT_ABI_QUAD) == 1428 llvm::ELF::EF_RISCV_FLOAT_ABI_QUAD) 1429 flags |= ArchSpec::eRISCV_float_abi_quad; 1430 1431 arch_spec.SetFlags(flags); 1432 } 1433 1434 // If there are no section headers we are done. 1435 if (header.e_shnum == 0) 1436 return 0; 1437 1438 Log *log = GetLog(LLDBLog::Modules); 1439 1440 section_headers.resize(header.e_shnum); 1441 if (section_headers.size() != header.e_shnum) 1442 return 0; 1443 1444 const size_t sh_size = header.e_shnum * header.e_shentsize; 1445 const elf_off sh_offset = header.e_shoff; 1446 DataExtractor sh_data; 1447 if (sh_data.SetData(object_data, sh_offset, sh_size) != sh_size) 1448 return 0; 1449 1450 uint32_t idx; 1451 lldb::offset_t offset; 1452 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) { 1453 if (!section_headers[idx].Parse(sh_data, &offset)) 1454 break; 1455 } 1456 if (idx < section_headers.size()) 1457 section_headers.resize(idx); 1458 1459 const unsigned strtab_idx = header.e_shstrndx; 1460 if (strtab_idx && strtab_idx < section_headers.size()) { 1461 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx]; 1462 const size_t byte_size = sheader.sh_size; 1463 const Elf64_Off offset = sheader.sh_offset; 1464 lldb_private::DataExtractor shstr_data; 1465 1466 if (shstr_data.SetData(object_data, offset, byte_size) == byte_size) { 1467 for (SectionHeaderCollIter I = section_headers.begin(); 1468 I != section_headers.end(); ++I) { 1469 static ConstString g_sect_name_gnu_debuglink(".gnu_debuglink"); 1470 const ELFSectionHeaderInfo &sheader = *I; 1471 const uint64_t section_size = 1472 sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size; 1473 ConstString name(shstr_data.PeekCStr(I->sh_name)); 1474 1475 I->section_name = name; 1476 1477 if (arch_spec.IsMIPS()) { 1478 uint32_t arch_flags = arch_spec.GetFlags(); 1479 DataExtractor data; 1480 if (sheader.sh_type == SHT_MIPS_ABIFLAGS) { 1481 1482 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1483 section_size) == section_size)) { 1484 // MIPS ASE Mask is at offset 12 in MIPS.abiflags section 1485 lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0 1486 arch_flags |= data.GetU32(&offset); 1487 1488 // The floating point ABI is at offset 7 1489 offset = 7; 1490 switch (data.GetU8(&offset)) { 1491 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY: 1492 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY; 1493 break; 1494 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE: 1495 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE; 1496 break; 1497 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE: 1498 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE; 1499 break; 1500 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT: 1501 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT; 1502 break; 1503 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64: 1504 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64; 1505 break; 1506 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX: 1507 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX; 1508 break; 1509 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64: 1510 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64; 1511 break; 1512 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A: 1513 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A; 1514 break; 1515 } 1516 } 1517 } 1518 // Settings appropriate ArchSpec ABI Flags 1519 switch (header.e_flags & llvm::ELF::EF_MIPS_ABI) { 1520 case llvm::ELF::EF_MIPS_ABI_O32: 1521 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32; 1522 break; 1523 case EF_MIPS_ABI_O64: 1524 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64; 1525 break; 1526 case EF_MIPS_ABI_EABI32: 1527 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32; 1528 break; 1529 case EF_MIPS_ABI_EABI64: 1530 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64; 1531 break; 1532 default: 1533 // ABI Mask doesn't cover N32 and N64 ABI. 1534 if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64) 1535 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64; 1536 else if (header.e_flags & llvm::ELF::EF_MIPS_ABI2) 1537 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32; 1538 break; 1539 } 1540 arch_spec.SetFlags(arch_flags); 1541 } 1542 1543 if (arch_spec.GetMachine() == llvm::Triple::arm || 1544 arch_spec.GetMachine() == llvm::Triple::thumb) { 1545 DataExtractor data; 1546 1547 if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 && 1548 data.SetData(object_data, sheader.sh_offset, section_size) == section_size) 1549 ParseARMAttributes(data, section_size, arch_spec); 1550 } 1551 1552 if (name == g_sect_name_gnu_debuglink) { 1553 DataExtractor data; 1554 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1555 section_size) == section_size)) { 1556 lldb::offset_t gnu_debuglink_offset = 0; 1557 gnu_debuglink_file = data.GetCStr(&gnu_debuglink_offset); 1558 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4); 1559 data.GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1); 1560 } 1561 } 1562 1563 // Process ELF note section entries. 1564 bool is_note_header = (sheader.sh_type == SHT_NOTE); 1565 1566 // The section header ".note.android.ident" is stored as a 1567 // PROGBITS type header but it is actually a note header. 1568 static ConstString g_sect_name_android_ident(".note.android.ident"); 1569 if (!is_note_header && name == g_sect_name_android_ident) 1570 is_note_header = true; 1571 1572 if (is_note_header) { 1573 // Allow notes to refine module info. 1574 DataExtractor data; 1575 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1576 section_size) == section_size)) { 1577 Status error = RefineModuleDetailsFromNote(data, arch_spec, uuid); 1578 if (error.Fail()) { 1579 LLDB_LOGF(log, "ObjectFileELF::%s ELF note processing failed: %s", 1580 __FUNCTION__, error.AsCString()); 1581 } 1582 } 1583 } 1584 } 1585 1586 // Make any unknown triple components to be unspecified unknowns. 1587 if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor) 1588 arch_spec.GetTriple().setVendorName(llvm::StringRef()); 1589 if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS) 1590 arch_spec.GetTriple().setOSName(llvm::StringRef()); 1591 1592 return section_headers.size(); 1593 } 1594 } 1595 1596 section_headers.clear(); 1597 return 0; 1598 } 1599 1600 llvm::StringRef 1601 ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const { 1602 size_t pos = symbol_name.find('@'); 1603 return symbol_name.substr(0, pos); 1604 } 1605 1606 // ParseSectionHeaders 1607 size_t ObjectFileELF::ParseSectionHeaders() { 1608 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, 1609 m_gnu_debuglink_file, m_gnu_debuglink_crc, 1610 m_arch_spec); 1611 } 1612 1613 const ObjectFileELF::ELFSectionHeaderInfo * 1614 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) { 1615 if (!ParseSectionHeaders()) 1616 return nullptr; 1617 1618 if (id < m_section_headers.size()) 1619 return &m_section_headers[id]; 1620 1621 return nullptr; 1622 } 1623 1624 lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) { 1625 if (!name || !name[0] || !ParseSectionHeaders()) 1626 return 0; 1627 for (size_t i = 1; i < m_section_headers.size(); ++i) 1628 if (m_section_headers[i].section_name == ConstString(name)) 1629 return i; 1630 return 0; 1631 } 1632 1633 static SectionType GetSectionTypeFromName(llvm::StringRef Name) { 1634 if (Name.consume_front(".debug_")) { 1635 return llvm::StringSwitch<SectionType>(Name) 1636 .Case("abbrev", eSectionTypeDWARFDebugAbbrev) 1637 .Case("abbrev.dwo", eSectionTypeDWARFDebugAbbrevDwo) 1638 .Case("addr", eSectionTypeDWARFDebugAddr) 1639 .Case("aranges", eSectionTypeDWARFDebugAranges) 1640 .Case("cu_index", eSectionTypeDWARFDebugCuIndex) 1641 .Case("frame", eSectionTypeDWARFDebugFrame) 1642 .Case("info", eSectionTypeDWARFDebugInfo) 1643 .Case("info.dwo", eSectionTypeDWARFDebugInfoDwo) 1644 .Cases("line", "line.dwo", eSectionTypeDWARFDebugLine) 1645 .Cases("line_str", "line_str.dwo", eSectionTypeDWARFDebugLineStr) 1646 .Case("loc", eSectionTypeDWARFDebugLoc) 1647 .Case("loc.dwo", eSectionTypeDWARFDebugLocDwo) 1648 .Case("loclists", eSectionTypeDWARFDebugLocLists) 1649 .Case("loclists.dwo", eSectionTypeDWARFDebugLocListsDwo) 1650 .Case("macinfo", eSectionTypeDWARFDebugMacInfo) 1651 .Cases("macro", "macro.dwo", eSectionTypeDWARFDebugMacro) 1652 .Case("names", eSectionTypeDWARFDebugNames) 1653 .Case("pubnames", eSectionTypeDWARFDebugPubNames) 1654 .Case("pubtypes", eSectionTypeDWARFDebugPubTypes) 1655 .Case("ranges", eSectionTypeDWARFDebugRanges) 1656 .Case("rnglists", eSectionTypeDWARFDebugRngLists) 1657 .Case("rnglists.dwo", eSectionTypeDWARFDebugRngListsDwo) 1658 .Case("str", eSectionTypeDWARFDebugStr) 1659 .Case("str.dwo", eSectionTypeDWARFDebugStrDwo) 1660 .Case("str_offsets", eSectionTypeDWARFDebugStrOffsets) 1661 .Case("str_offsets.dwo", eSectionTypeDWARFDebugStrOffsetsDwo) 1662 .Case("tu_index", eSectionTypeDWARFDebugTuIndex) 1663 .Case("types", eSectionTypeDWARFDebugTypes) 1664 .Case("types.dwo", eSectionTypeDWARFDebugTypesDwo) 1665 .Default(eSectionTypeOther); 1666 } 1667 return llvm::StringSwitch<SectionType>(Name) 1668 .Case(".ARM.exidx", eSectionTypeARMexidx) 1669 .Case(".ARM.extab", eSectionTypeARMextab) 1670 .Case(".ctf", eSectionTypeDebug) 1671 .Cases(".data", ".tdata", eSectionTypeData) 1672 .Case(".eh_frame", eSectionTypeEHFrame) 1673 .Case(".gnu_debugaltlink", eSectionTypeDWARFGNUDebugAltLink) 1674 .Case(".gosymtab", eSectionTypeGoSymtab) 1675 .Case(".text", eSectionTypeCode) 1676 .Case(".swift_ast", eSectionTypeSwiftModules) 1677 .Default(eSectionTypeOther); 1678 } 1679 1680 SectionType ObjectFileELF::GetSectionType(const ELFSectionHeaderInfo &H) const { 1681 switch (H.sh_type) { 1682 case SHT_PROGBITS: 1683 if (H.sh_flags & SHF_EXECINSTR) 1684 return eSectionTypeCode; 1685 break; 1686 case SHT_NOBITS: 1687 if (H.sh_flags & SHF_ALLOC) 1688 return eSectionTypeZeroFill; 1689 break; 1690 case SHT_SYMTAB: 1691 return eSectionTypeELFSymbolTable; 1692 case SHT_DYNSYM: 1693 return eSectionTypeELFDynamicSymbols; 1694 case SHT_RELA: 1695 case SHT_REL: 1696 return eSectionTypeELFRelocationEntries; 1697 case SHT_DYNAMIC: 1698 return eSectionTypeELFDynamicLinkInfo; 1699 } 1700 return GetSectionTypeFromName(H.section_name.GetStringRef()); 1701 } 1702 1703 static uint32_t GetTargetByteSize(SectionType Type, const ArchSpec &arch) { 1704 switch (Type) { 1705 case eSectionTypeData: 1706 case eSectionTypeZeroFill: 1707 return arch.GetDataByteSize(); 1708 case eSectionTypeCode: 1709 return arch.GetCodeByteSize(); 1710 default: 1711 return 1; 1712 } 1713 } 1714 1715 static Permissions GetPermissions(const ELFSectionHeader &H) { 1716 Permissions Perm = Permissions(0); 1717 if (H.sh_flags & SHF_ALLOC) 1718 Perm |= ePermissionsReadable; 1719 if (H.sh_flags & SHF_WRITE) 1720 Perm |= ePermissionsWritable; 1721 if (H.sh_flags & SHF_EXECINSTR) 1722 Perm |= ePermissionsExecutable; 1723 return Perm; 1724 } 1725 1726 static Permissions GetPermissions(const ELFProgramHeader &H) { 1727 Permissions Perm = Permissions(0); 1728 if (H.p_flags & PF_R) 1729 Perm |= ePermissionsReadable; 1730 if (H.p_flags & PF_W) 1731 Perm |= ePermissionsWritable; 1732 if (H.p_flags & PF_X) 1733 Perm |= ePermissionsExecutable; 1734 return Perm; 1735 } 1736 1737 namespace { 1738 1739 using VMRange = lldb_private::Range<addr_t, addr_t>; 1740 1741 struct SectionAddressInfo { 1742 SectionSP Segment; 1743 VMRange Range; 1744 }; 1745 1746 // (Unlinked) ELF object files usually have 0 for every section address, meaning 1747 // we need to compute synthetic addresses in order for "file addresses" from 1748 // different sections to not overlap. This class handles that logic. 1749 class VMAddressProvider { 1750 using VMMap = llvm::IntervalMap<addr_t, SectionSP, 4, 1751 llvm::IntervalMapHalfOpenInfo<addr_t>>; 1752 1753 ObjectFile::Type ObjectType; 1754 addr_t NextVMAddress = 0; 1755 VMMap::Allocator Alloc; 1756 VMMap Segments{Alloc}; 1757 VMMap Sections{Alloc}; 1758 lldb_private::Log *Log = GetLog(LLDBLog::Modules); 1759 size_t SegmentCount = 0; 1760 std::string SegmentName; 1761 1762 VMRange GetVMRange(const ELFSectionHeader &H) { 1763 addr_t Address = H.sh_addr; 1764 addr_t Size = H.sh_flags & SHF_ALLOC ? H.sh_size : 0; 1765 1766 // When this is a debug file for relocatable file, the address is all zero 1767 // and thus needs to use accumulate method 1768 if ((ObjectType == ObjectFile::Type::eTypeObjectFile || 1769 (ObjectType == ObjectFile::Type::eTypeDebugInfo && H.sh_addr == 0)) && 1770 Segments.empty() && (H.sh_flags & SHF_ALLOC)) { 1771 NextVMAddress = 1772 llvm::alignTo(NextVMAddress, std::max<addr_t>(H.sh_addralign, 1)); 1773 Address = NextVMAddress; 1774 NextVMAddress += Size; 1775 } 1776 return VMRange(Address, Size); 1777 } 1778 1779 public: 1780 VMAddressProvider(ObjectFile::Type Type, llvm::StringRef SegmentName) 1781 : ObjectType(Type), SegmentName(std::string(SegmentName)) {} 1782 1783 std::string GetNextSegmentName() const { 1784 return llvm::formatv("{0}[{1}]", SegmentName, SegmentCount).str(); 1785 } 1786 1787 std::optional<VMRange> GetAddressInfo(const ELFProgramHeader &H) { 1788 if (H.p_memsz == 0) { 1789 LLDB_LOG(Log, "Ignoring zero-sized {0} segment. Corrupt object file?", 1790 SegmentName); 1791 return std::nullopt; 1792 } 1793 1794 if (Segments.overlaps(H.p_vaddr, H.p_vaddr + H.p_memsz)) { 1795 LLDB_LOG(Log, "Ignoring overlapping {0} segment. Corrupt object file?", 1796 SegmentName); 1797 return std::nullopt; 1798 } 1799 return VMRange(H.p_vaddr, H.p_memsz); 1800 } 1801 1802 std::optional<SectionAddressInfo> GetAddressInfo(const ELFSectionHeader &H) { 1803 VMRange Range = GetVMRange(H); 1804 SectionSP Segment; 1805 auto It = Segments.find(Range.GetRangeBase()); 1806 if ((H.sh_flags & SHF_ALLOC) && It.valid()) { 1807 addr_t MaxSize; 1808 if (It.start() <= Range.GetRangeBase()) { 1809 MaxSize = It.stop() - Range.GetRangeBase(); 1810 Segment = *It; 1811 } else 1812 MaxSize = It.start() - Range.GetRangeBase(); 1813 if (Range.GetByteSize() > MaxSize) { 1814 LLDB_LOG(Log, "Shortening section crossing segment boundaries. " 1815 "Corrupt object file?"); 1816 Range.SetByteSize(MaxSize); 1817 } 1818 } 1819 if (Range.GetByteSize() > 0 && 1820 Sections.overlaps(Range.GetRangeBase(), Range.GetRangeEnd())) { 1821 LLDB_LOG(Log, "Ignoring overlapping section. Corrupt object file?"); 1822 return std::nullopt; 1823 } 1824 if (Segment) 1825 Range.Slide(-Segment->GetFileAddress()); 1826 return SectionAddressInfo{Segment, Range}; 1827 } 1828 1829 void AddSegment(const VMRange &Range, SectionSP Seg) { 1830 Segments.insert(Range.GetRangeBase(), Range.GetRangeEnd(), std::move(Seg)); 1831 ++SegmentCount; 1832 } 1833 1834 void AddSection(SectionAddressInfo Info, SectionSP Sect) { 1835 if (Info.Range.GetByteSize() == 0) 1836 return; 1837 if (Info.Segment) 1838 Info.Range.Slide(Info.Segment->GetFileAddress()); 1839 Sections.insert(Info.Range.GetRangeBase(), Info.Range.GetRangeEnd(), 1840 std::move(Sect)); 1841 } 1842 }; 1843 } 1844 1845 // We have to do this because ELF doesn't have section IDs, and also 1846 // doesn't require section names to be unique. (We use the section index 1847 // for section IDs, but that isn't guaranteed to be the same in separate 1848 // debug images.) 1849 static SectionSP FindMatchingSection(const SectionList §ion_list, 1850 SectionSP section) { 1851 SectionSP sect_sp; 1852 1853 addr_t vm_addr = section->GetFileAddress(); 1854 ConstString name = section->GetName(); 1855 offset_t byte_size = section->GetByteSize(); 1856 bool thread_specific = section->IsThreadSpecific(); 1857 uint32_t permissions = section->GetPermissions(); 1858 uint32_t alignment = section->GetLog2Align(); 1859 1860 for (auto sect : section_list) { 1861 if (sect->GetName() == name && 1862 sect->IsThreadSpecific() == thread_specific && 1863 sect->GetPermissions() == permissions && 1864 sect->GetByteSize() == byte_size && sect->GetFileAddress() == vm_addr && 1865 sect->GetLog2Align() == alignment) { 1866 sect_sp = sect; 1867 break; 1868 } else { 1869 sect_sp = FindMatchingSection(sect->GetChildren(), section); 1870 if (sect_sp) 1871 break; 1872 } 1873 } 1874 1875 return sect_sp; 1876 } 1877 1878 void ObjectFileELF::CreateSections(SectionList &unified_section_list) { 1879 if (m_sections_up) 1880 return; 1881 1882 m_sections_up = std::make_unique<SectionList>(); 1883 VMAddressProvider regular_provider(GetType(), "PT_LOAD"); 1884 VMAddressProvider tls_provider(GetType(), "PT_TLS"); 1885 1886 for (const auto &EnumPHdr : llvm::enumerate(ProgramHeaders())) { 1887 const ELFProgramHeader &PHdr = EnumPHdr.value(); 1888 if (PHdr.p_type != PT_LOAD && PHdr.p_type != PT_TLS) 1889 continue; 1890 1891 VMAddressProvider &provider = 1892 PHdr.p_type == PT_TLS ? tls_provider : regular_provider; 1893 auto InfoOr = provider.GetAddressInfo(PHdr); 1894 if (!InfoOr) 1895 continue; 1896 1897 uint32_t Log2Align = llvm::Log2_64(std::max<elf_xword>(PHdr.p_align, 1)); 1898 SectionSP Segment = std::make_shared<Section>( 1899 GetModule(), this, SegmentID(EnumPHdr.index()), 1900 ConstString(provider.GetNextSegmentName()), eSectionTypeContainer, 1901 InfoOr->GetRangeBase(), InfoOr->GetByteSize(), PHdr.p_offset, 1902 PHdr.p_filesz, Log2Align, /*flags*/ 0); 1903 Segment->SetPermissions(GetPermissions(PHdr)); 1904 Segment->SetIsThreadSpecific(PHdr.p_type == PT_TLS); 1905 m_sections_up->AddSection(Segment); 1906 1907 provider.AddSegment(*InfoOr, std::move(Segment)); 1908 } 1909 1910 ParseSectionHeaders(); 1911 if (m_section_headers.empty()) 1912 return; 1913 1914 for (SectionHeaderCollIter I = std::next(m_section_headers.begin()); 1915 I != m_section_headers.end(); ++I) { 1916 const ELFSectionHeaderInfo &header = *I; 1917 1918 ConstString &name = I->section_name; 1919 const uint64_t file_size = 1920 header.sh_type == SHT_NOBITS ? 0 : header.sh_size; 1921 1922 VMAddressProvider &provider = 1923 header.sh_flags & SHF_TLS ? tls_provider : regular_provider; 1924 auto InfoOr = provider.GetAddressInfo(header); 1925 if (!InfoOr) 1926 continue; 1927 1928 SectionType sect_type = GetSectionType(header); 1929 1930 const uint32_t target_bytes_size = 1931 GetTargetByteSize(sect_type, m_arch_spec); 1932 1933 elf::elf_xword log2align = 1934 (header.sh_addralign == 0) ? 0 : llvm::Log2_64(header.sh_addralign); 1935 1936 SectionSP section_sp(new Section( 1937 InfoOr->Segment, GetModule(), // Module to which this section belongs. 1938 this, // ObjectFile to which this section belongs and should 1939 // read section data from. 1940 SectionIndex(I), // Section ID. 1941 name, // Section name. 1942 sect_type, // Section type. 1943 InfoOr->Range.GetRangeBase(), // VM address. 1944 InfoOr->Range.GetByteSize(), // VM size in bytes of this section. 1945 header.sh_offset, // Offset of this section in the file. 1946 file_size, // Size of the section as found in the file. 1947 log2align, // Alignment of the section 1948 header.sh_flags, // Flags for this section. 1949 target_bytes_size)); // Number of host bytes per target byte 1950 1951 section_sp->SetPermissions(GetPermissions(header)); 1952 section_sp->SetIsThreadSpecific(header.sh_flags & SHF_TLS); 1953 (InfoOr->Segment ? InfoOr->Segment->GetChildren() : *m_sections_up) 1954 .AddSection(section_sp); 1955 provider.AddSection(std::move(*InfoOr), std::move(section_sp)); 1956 } 1957 1958 // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the 1959 // unified section list. 1960 if (GetType() != eTypeDebugInfo) 1961 unified_section_list = *m_sections_up; 1962 1963 // If there's a .gnu_debugdata section, we'll try to read the .symtab that's 1964 // embedded in there and replace the one in the original object file (if any). 1965 // If there's none in the orignal object file, we add it to it. 1966 if (auto gdd_obj_file = GetGnuDebugDataObjectFile()) { 1967 if (auto gdd_objfile_section_list = gdd_obj_file->GetSectionList()) { 1968 if (SectionSP symtab_section_sp = 1969 gdd_objfile_section_list->FindSectionByType( 1970 eSectionTypeELFSymbolTable, true)) { 1971 SectionSP module_section_sp = unified_section_list.FindSectionByType( 1972 eSectionTypeELFSymbolTable, true); 1973 if (module_section_sp) 1974 unified_section_list.ReplaceSection(module_section_sp->GetID(), 1975 symtab_section_sp); 1976 else 1977 unified_section_list.AddSection(symtab_section_sp); 1978 } 1979 } 1980 } 1981 } 1982 1983 std::shared_ptr<ObjectFileELF> ObjectFileELF::GetGnuDebugDataObjectFile() { 1984 if (m_gnu_debug_data_object_file != nullptr) 1985 return m_gnu_debug_data_object_file; 1986 1987 SectionSP section = 1988 GetSectionList()->FindSectionByName(ConstString(".gnu_debugdata")); 1989 if (!section) 1990 return nullptr; 1991 1992 if (!lldb_private::lzma::isAvailable()) { 1993 GetModule()->ReportWarning( 1994 "No LZMA support found for reading .gnu_debugdata section"); 1995 return nullptr; 1996 } 1997 1998 // Uncompress the data 1999 DataExtractor data; 2000 section->GetSectionData(data); 2001 llvm::SmallVector<uint8_t, 0> uncompressedData; 2002 auto err = lldb_private::lzma::uncompress(data.GetData(), uncompressedData); 2003 if (err) { 2004 GetModule()->ReportWarning( 2005 "An error occurred while decompression the section {0}: {1}", 2006 section->GetName().AsCString(), llvm::toString(std::move(err)).c_str()); 2007 return nullptr; 2008 } 2009 2010 // Construct ObjectFileELF object from decompressed buffer 2011 DataBufferSP gdd_data_buf( 2012 new DataBufferHeap(uncompressedData.data(), uncompressedData.size())); 2013 auto fspec = GetFileSpec().CopyByAppendingPathComponent( 2014 llvm::StringRef("gnu_debugdata")); 2015 m_gnu_debug_data_object_file.reset(new ObjectFileELF( 2016 GetModule(), gdd_data_buf, 0, &fspec, 0, gdd_data_buf->GetByteSize())); 2017 2018 // This line is essential; otherwise a breakpoint can be set but not hit. 2019 m_gnu_debug_data_object_file->SetType(ObjectFile::eTypeDebugInfo); 2020 2021 ArchSpec spec = m_gnu_debug_data_object_file->GetArchitecture(); 2022 if (spec && m_gnu_debug_data_object_file->SetModulesArchitecture(spec)) 2023 return m_gnu_debug_data_object_file; 2024 2025 return nullptr; 2026 } 2027 2028 // Find the arm/aarch64 mapping symbol character in the given symbol name. 2029 // Mapping symbols have the form of "$<char>[.<any>]*". Additionally we 2030 // recognize cases when the mapping symbol prefixed by an arbitrary string 2031 // because if a symbol prefix added to each symbol in the object file with 2032 // objcopy then the mapping symbols are also prefixed. 2033 static char FindArmAarch64MappingSymbol(const char *symbol_name) { 2034 if (!symbol_name) 2035 return '\0'; 2036 2037 const char *dollar_pos = ::strchr(symbol_name, '$'); 2038 if (!dollar_pos || dollar_pos[1] == '\0') 2039 return '\0'; 2040 2041 if (dollar_pos[2] == '\0' || dollar_pos[2] == '.') 2042 return dollar_pos[1]; 2043 return '\0'; 2044 } 2045 2046 #define STO_MIPS_ISA (3 << 6) 2047 #define STO_MICROMIPS (2 << 6) 2048 #define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS) 2049 2050 // private 2051 std::pair<unsigned, ObjectFileELF::FileAddressToAddressClassMap> 2052 ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, 2053 SectionList *section_list, const size_t num_symbols, 2054 const DataExtractor &symtab_data, 2055 const DataExtractor &strtab_data) { 2056 ELFSymbol symbol; 2057 lldb::offset_t offset = 0; 2058 // The changes these symbols would make to the class map. We will also update 2059 // m_address_class_map but need to tell the caller what changed because the 2060 // caller may be another object file. 2061 FileAddressToAddressClassMap address_class_map; 2062 2063 static ConstString text_section_name(".text"); 2064 static ConstString init_section_name(".init"); 2065 static ConstString fini_section_name(".fini"); 2066 static ConstString ctors_section_name(".ctors"); 2067 static ConstString dtors_section_name(".dtors"); 2068 2069 static ConstString data_section_name(".data"); 2070 static ConstString rodata_section_name(".rodata"); 2071 static ConstString rodata1_section_name(".rodata1"); 2072 static ConstString data2_section_name(".data1"); 2073 static ConstString bss_section_name(".bss"); 2074 static ConstString opd_section_name(".opd"); // For ppc64 2075 2076 // On Android the oatdata and the oatexec symbols in the oat and odex files 2077 // covers the full .text section what causes issues with displaying unusable 2078 // symbol name to the user and very slow unwinding speed because the 2079 // instruction emulation based unwind plans try to emulate all instructions 2080 // in these symbols. Don't add these symbols to the symbol list as they have 2081 // no use for the debugger and they are causing a lot of trouble. Filtering 2082 // can't be restricted to Android because this special object file don't 2083 // contain the note section specifying the environment to Android but the 2084 // custom extension and file name makes it highly unlikely that this will 2085 // collide with anything else. 2086 llvm::StringRef file_extension = m_file.GetFileNameExtension(); 2087 bool skip_oatdata_oatexec = 2088 file_extension == ".oat" || file_extension == ".odex"; 2089 2090 ArchSpec arch = GetArchitecture(); 2091 ModuleSP module_sp(GetModule()); 2092 SectionList *module_section_list = 2093 module_sp ? module_sp->GetSectionList() : nullptr; 2094 2095 // We might have debug information in a separate object, in which case 2096 // we need to map the sections from that object to the sections in the 2097 // main object during symbol lookup. If we had to compare the sections 2098 // for every single symbol, that would be expensive, so this map is 2099 // used to accelerate the process. 2100 std::unordered_map<lldb::SectionSP, lldb::SectionSP> section_map; 2101 2102 unsigned i; 2103 for (i = 0; i < num_symbols; ++i) { 2104 if (!symbol.Parse(symtab_data, &offset)) 2105 break; 2106 2107 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 2108 if (!symbol_name) 2109 symbol_name = ""; 2110 2111 // No need to add non-section symbols that have no names 2112 if (symbol.getType() != STT_SECTION && 2113 (symbol_name == nullptr || symbol_name[0] == '\0')) 2114 continue; 2115 2116 // Skipping oatdata and oatexec sections if it is requested. See details 2117 // above the definition of skip_oatdata_oatexec for the reasons. 2118 if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 || 2119 ::strcmp(symbol_name, "oatexec") == 0)) 2120 continue; 2121 2122 SectionSP symbol_section_sp; 2123 SymbolType symbol_type = eSymbolTypeInvalid; 2124 Elf64_Half shndx = symbol.st_shndx; 2125 2126 switch (shndx) { 2127 case SHN_ABS: 2128 symbol_type = eSymbolTypeAbsolute; 2129 break; 2130 case SHN_UNDEF: 2131 symbol_type = eSymbolTypeUndefined; 2132 break; 2133 default: 2134 symbol_section_sp = section_list->FindSectionByID(shndx); 2135 break; 2136 } 2137 2138 // If a symbol is undefined do not process it further even if it has a STT 2139 // type 2140 if (symbol_type != eSymbolTypeUndefined) { 2141 switch (symbol.getType()) { 2142 default: 2143 case STT_NOTYPE: 2144 // The symbol's type is not specified. 2145 break; 2146 2147 case STT_OBJECT: 2148 // The symbol is associated with a data object, such as a variable, an 2149 // array, etc. 2150 symbol_type = eSymbolTypeData; 2151 break; 2152 2153 case STT_FUNC: 2154 // The symbol is associated with a function or other executable code. 2155 symbol_type = eSymbolTypeCode; 2156 break; 2157 2158 case STT_SECTION: 2159 // The symbol is associated with a section. Symbol table entries of 2160 // this type exist primarily for relocation and normally have STB_LOCAL 2161 // binding. 2162 break; 2163 2164 case STT_FILE: 2165 // Conventionally, the symbol's name gives the name of the source file 2166 // associated with the object file. A file symbol has STB_LOCAL 2167 // binding, its section index is SHN_ABS, and it precedes the other 2168 // STB_LOCAL symbols for the file, if it is present. 2169 symbol_type = eSymbolTypeSourceFile; 2170 break; 2171 2172 case STT_GNU_IFUNC: 2173 // The symbol is associated with an indirect function. The actual 2174 // function will be resolved if it is referenced. 2175 symbol_type = eSymbolTypeResolver; 2176 break; 2177 } 2178 } 2179 2180 if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION) { 2181 if (symbol_section_sp) { 2182 ConstString sect_name = symbol_section_sp->GetName(); 2183 if (sect_name == text_section_name || sect_name == init_section_name || 2184 sect_name == fini_section_name || sect_name == ctors_section_name || 2185 sect_name == dtors_section_name) { 2186 symbol_type = eSymbolTypeCode; 2187 } else if (sect_name == data_section_name || 2188 sect_name == data2_section_name || 2189 sect_name == rodata_section_name || 2190 sect_name == rodata1_section_name || 2191 sect_name == bss_section_name) { 2192 symbol_type = eSymbolTypeData; 2193 } 2194 } 2195 } 2196 2197 int64_t symbol_value_offset = 0; 2198 uint32_t additional_flags = 0; 2199 2200 if (arch.IsValid()) { 2201 if (arch.GetMachine() == llvm::Triple::arm) { 2202 if (symbol.getBinding() == STB_LOCAL) { 2203 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); 2204 if (symbol_type == eSymbolTypeCode) { 2205 switch (mapping_symbol) { 2206 case 'a': 2207 // $a[.<any>]* - marks an ARM instruction sequence 2208 address_class_map[symbol.st_value] = AddressClass::eCode; 2209 break; 2210 case 'b': 2211 case 't': 2212 // $b[.<any>]* - marks a THUMB BL instruction sequence 2213 // $t[.<any>]* - marks a THUMB instruction sequence 2214 address_class_map[symbol.st_value] = 2215 AddressClass::eCodeAlternateISA; 2216 break; 2217 case 'd': 2218 // $d[.<any>]* - marks a data item sequence (e.g. lit pool) 2219 address_class_map[symbol.st_value] = AddressClass::eData; 2220 break; 2221 } 2222 } 2223 if (mapping_symbol) 2224 continue; 2225 } 2226 } else if (arch.GetMachine() == llvm::Triple::aarch64) { 2227 if (symbol.getBinding() == STB_LOCAL) { 2228 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); 2229 if (symbol_type == eSymbolTypeCode) { 2230 switch (mapping_symbol) { 2231 case 'x': 2232 // $x[.<any>]* - marks an A64 instruction sequence 2233 address_class_map[symbol.st_value] = AddressClass::eCode; 2234 break; 2235 case 'd': 2236 // $d[.<any>]* - marks a data item sequence (e.g. lit pool) 2237 address_class_map[symbol.st_value] = AddressClass::eData; 2238 break; 2239 } 2240 } 2241 if (mapping_symbol) 2242 continue; 2243 } 2244 } 2245 2246 if (arch.GetMachine() == llvm::Triple::arm) { 2247 if (symbol_type == eSymbolTypeCode) { 2248 if (symbol.st_value & 1) { 2249 // Subtracting 1 from the address effectively unsets the low order 2250 // bit, which results in the address actually pointing to the 2251 // beginning of the symbol. This delta will be used below in 2252 // conjunction with symbol.st_value to produce the final 2253 // symbol_value that we store in the symtab. 2254 symbol_value_offset = -1; 2255 address_class_map[symbol.st_value ^ 1] = 2256 AddressClass::eCodeAlternateISA; 2257 } else { 2258 // This address is ARM 2259 address_class_map[symbol.st_value] = AddressClass::eCode; 2260 } 2261 } 2262 } 2263 2264 /* 2265 * MIPS: 2266 * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for 2267 * MIPS). 2268 * This allows processor to switch between microMIPS and MIPS without any 2269 * need 2270 * for special mode-control register. However, apart from .debug_line, 2271 * none of 2272 * the ELF/DWARF sections set the ISA bit (for symbol or section). Use 2273 * st_other 2274 * flag to check whether the symbol is microMIPS and then set the address 2275 * class 2276 * accordingly. 2277 */ 2278 if (arch.IsMIPS()) { 2279 if (IS_MICROMIPS(symbol.st_other)) 2280 address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA; 2281 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) { 2282 symbol.st_value = symbol.st_value & (~1ull); 2283 address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA; 2284 } else { 2285 if (symbol_type == eSymbolTypeCode) 2286 address_class_map[symbol.st_value] = AddressClass::eCode; 2287 else if (symbol_type == eSymbolTypeData) 2288 address_class_map[symbol.st_value] = AddressClass::eData; 2289 else 2290 address_class_map[symbol.st_value] = AddressClass::eUnknown; 2291 } 2292 } 2293 } 2294 2295 // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB 2296 // symbols. See above for more details. 2297 uint64_t symbol_value = symbol.st_value + symbol_value_offset; 2298 2299 if (symbol_section_sp && 2300 CalculateType() != ObjectFile::Type::eTypeObjectFile) 2301 symbol_value -= symbol_section_sp->GetFileAddress(); 2302 2303 if (symbol_section_sp && module_section_list && 2304 module_section_list != section_list) { 2305 auto section_it = section_map.find(symbol_section_sp); 2306 if (section_it == section_map.end()) { 2307 section_it = section_map 2308 .emplace(symbol_section_sp, 2309 FindMatchingSection(*module_section_list, 2310 symbol_section_sp)) 2311 .first; 2312 } 2313 if (section_it->second) 2314 symbol_section_sp = section_it->second; 2315 } 2316 2317 bool is_global = symbol.getBinding() == STB_GLOBAL; 2318 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags; 2319 llvm::StringRef symbol_ref(symbol_name); 2320 2321 // Symbol names may contain @VERSION suffixes. Find those and strip them 2322 // temporarily. 2323 size_t version_pos = symbol_ref.find('@'); 2324 bool has_suffix = version_pos != llvm::StringRef::npos; 2325 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos); 2326 Mangled mangled(symbol_bare); 2327 2328 // Now append the suffix back to mangled and unmangled names. Only do it if 2329 // the demangling was successful (string is not empty). 2330 if (has_suffix) { 2331 llvm::StringRef suffix = symbol_ref.substr(version_pos); 2332 2333 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef(); 2334 if (!mangled_name.empty()) 2335 mangled.SetMangledName(ConstString((mangled_name + suffix).str())); 2336 2337 ConstString demangled = mangled.GetDemangledName(); 2338 llvm::StringRef demangled_name = demangled.GetStringRef(); 2339 if (!demangled_name.empty()) 2340 mangled.SetDemangledName(ConstString((demangled_name + suffix).str())); 2341 } 2342 2343 // In ELF all symbol should have a valid size but it is not true for some 2344 // function symbols coming from hand written assembly. As none of the 2345 // function symbol should have 0 size we try to calculate the size for 2346 // these symbols in the symtab with saying that their original size is not 2347 // valid. 2348 bool symbol_size_valid = 2349 symbol.st_size != 0 || symbol.getType() != STT_FUNC; 2350 2351 bool is_trampoline = false; 2352 if (arch.IsValid() && (arch.GetMachine() == llvm::Triple::aarch64)) { 2353 // On AArch64, trampolines are registered as code. 2354 // If we detect a trampoline (which starts with __AArch64ADRPThunk_ or 2355 // __AArch64AbsLongThunk_) we register the symbol as a trampoline. This 2356 // way we will be able to detect the trampoline when we step in a function 2357 // and step through the trampoline. 2358 if (symbol_type == eSymbolTypeCode) { 2359 llvm::StringRef trampoline_name = mangled.GetName().GetStringRef(); 2360 if (trampoline_name.starts_with("__AArch64ADRPThunk_") || 2361 trampoline_name.starts_with("__AArch64AbsLongThunk_")) { 2362 symbol_type = eSymbolTypeTrampoline; 2363 is_trampoline = true; 2364 } 2365 } 2366 } 2367 2368 Symbol dc_symbol( 2369 i + start_id, // ID is the original symbol table index. 2370 mangled, 2371 symbol_type, // Type of this symbol 2372 is_global, // Is this globally visible? 2373 false, // Is this symbol debug info? 2374 is_trampoline, // Is this symbol a trampoline? 2375 false, // Is this symbol artificial? 2376 AddressRange(symbol_section_sp, // Section in which this symbol is 2377 // defined or null. 2378 symbol_value, // Offset in section or symbol value. 2379 symbol.st_size), // Size in bytes of this symbol. 2380 symbol_size_valid, // Symbol size is valid 2381 has_suffix, // Contains linker annotations? 2382 flags); // Symbol flags. 2383 if (symbol.getBinding() == STB_WEAK) 2384 dc_symbol.SetIsWeak(true); 2385 symtab->AddSymbol(dc_symbol); 2386 } 2387 2388 m_address_class_map.merge(address_class_map); 2389 return {i, address_class_map}; 2390 } 2391 2392 std::pair<unsigned, ObjectFileELF::FileAddressToAddressClassMap> 2393 ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, 2394 lldb_private::Section *symtab) { 2395 if (symtab->GetObjectFile() != this) { 2396 // If the symbol table section is owned by a different object file, have it 2397 // do the parsing. 2398 ObjectFileELF *obj_file_elf = 2399 static_cast<ObjectFileELF *>(symtab->GetObjectFile()); 2400 auto [num_symbols, address_class_map] = 2401 obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab); 2402 2403 // The other object file returned the changes it made to its address 2404 // class map, make the same changes to ours. 2405 m_address_class_map.merge(address_class_map); 2406 2407 return {num_symbols, address_class_map}; 2408 } 2409 2410 // Get section list for this object file. 2411 SectionList *section_list = m_sections_up.get(); 2412 if (!section_list) 2413 return {}; 2414 2415 user_id_t symtab_id = symtab->GetID(); 2416 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id); 2417 assert(symtab_hdr->sh_type == SHT_SYMTAB || 2418 symtab_hdr->sh_type == SHT_DYNSYM); 2419 2420 // sh_link: section header index of associated string table. 2421 user_id_t strtab_id = symtab_hdr->sh_link; 2422 Section *strtab = section_list->FindSectionByID(strtab_id).get(); 2423 2424 if (symtab && strtab) { 2425 assert(symtab->GetObjectFile() == this); 2426 assert(strtab->GetObjectFile() == this); 2427 2428 DataExtractor symtab_data; 2429 DataExtractor strtab_data; 2430 if (ReadSectionData(symtab, symtab_data) && 2431 ReadSectionData(strtab, strtab_data)) { 2432 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize; 2433 2434 return ParseSymbols(symbol_table, start_id, section_list, num_symbols, 2435 symtab_data, strtab_data); 2436 } 2437 } 2438 2439 return {0, {}}; 2440 } 2441 2442 size_t ObjectFileELF::ParseDynamicSymbols() { 2443 if (m_dynamic_symbols.size()) 2444 return m_dynamic_symbols.size(); 2445 2446 std::optional<DataExtractor> dynamic_data = GetDynamicData(); 2447 if (!dynamic_data) 2448 return 0; 2449 2450 ELFDynamicWithName e; 2451 lldb::offset_t cursor = 0; 2452 while (e.symbol.Parse(*dynamic_data, &cursor)) { 2453 m_dynamic_symbols.push_back(e); 2454 if (e.symbol.d_tag == DT_NULL) 2455 break; 2456 } 2457 if (std::optional<DataExtractor> dynstr_data = GetDynstrData()) { 2458 for (ELFDynamicWithName &entry : m_dynamic_symbols) { 2459 switch (entry.symbol.d_tag) { 2460 case DT_NEEDED: 2461 case DT_SONAME: 2462 case DT_RPATH: 2463 case DT_RUNPATH: 2464 case DT_AUXILIARY: 2465 case DT_FILTER: { 2466 lldb::offset_t cursor = entry.symbol.d_val; 2467 const char *name = dynstr_data->GetCStr(&cursor); 2468 if (name) 2469 entry.name = std::string(name); 2470 break; 2471 } 2472 default: 2473 break; 2474 } 2475 } 2476 } 2477 return m_dynamic_symbols.size(); 2478 } 2479 2480 const ELFDynamic *ObjectFileELF::FindDynamicSymbol(unsigned tag) { 2481 if (!ParseDynamicSymbols()) 2482 return nullptr; 2483 for (const auto &entry : m_dynamic_symbols) { 2484 if (entry.symbol.d_tag == tag) 2485 return &entry.symbol; 2486 } 2487 return nullptr; 2488 } 2489 2490 unsigned ObjectFileELF::PLTRelocationType() { 2491 // DT_PLTREL 2492 // This member specifies the type of relocation entry to which the 2493 // procedure linkage table refers. The d_val member holds DT_REL or 2494 // DT_RELA, as appropriate. All relocations in a procedure linkage table 2495 // must use the same relocation. 2496 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL); 2497 2498 if (symbol) 2499 return symbol->d_val; 2500 2501 return 0; 2502 } 2503 2504 // Returns the size of the normal plt entries and the offset of the first 2505 // normal plt entry. The 0th entry in the plt table is usually a resolution 2506 // entry which have different size in some architectures then the rest of the 2507 // plt entries. 2508 static std::pair<uint64_t, uint64_t> 2509 GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr, 2510 const ELFSectionHeader *plt_hdr) { 2511 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2512 2513 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 2514 // 16 bytes. So round the entsize up by the alignment if addralign is set. 2515 elf_xword plt_entsize = 2516 plt_hdr->sh_addralign 2517 ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign) 2518 : plt_hdr->sh_entsize; 2519 2520 // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly. 2521 // PLT entries relocation code in general requires multiple instruction and 2522 // should be greater than 4 bytes in most cases. Try to guess correct size 2523 // just in case. 2524 if (plt_entsize <= 4) { 2525 // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the 2526 // size of the plt entries based on the number of entries and the size of 2527 // the plt section with the assumption that the size of the 0th entry is at 2528 // least as big as the size of the normal entries and it isn't much bigger 2529 // then that. 2530 if (plt_hdr->sh_addralign) 2531 plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign / 2532 (num_relocations + 1) * plt_hdr->sh_addralign; 2533 else 2534 plt_entsize = plt_hdr->sh_size / (num_relocations + 1); 2535 } 2536 2537 elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize; 2538 2539 return std::make_pair(plt_entsize, plt_offset); 2540 } 2541 2542 static unsigned ParsePLTRelocations( 2543 Symtab *symbol_table, user_id_t start_id, unsigned rel_type, 2544 const ELFHeader *hdr, const ELFSectionHeader *rel_hdr, 2545 const ELFSectionHeader *plt_hdr, const ELFSectionHeader *sym_hdr, 2546 const lldb::SectionSP &plt_section_sp, DataExtractor &rel_data, 2547 DataExtractor &symtab_data, DataExtractor &strtab_data) { 2548 ELFRelocation rel(rel_type); 2549 ELFSymbol symbol; 2550 lldb::offset_t offset = 0; 2551 2552 uint64_t plt_offset, plt_entsize; 2553 std::tie(plt_entsize, plt_offset) = 2554 GetPltEntrySizeAndOffset(rel_hdr, plt_hdr); 2555 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2556 2557 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); 2558 reloc_info_fn reloc_type; 2559 reloc_info_fn reloc_symbol; 2560 2561 if (hdr->Is32Bit()) { 2562 reloc_type = ELFRelocation::RelocType32; 2563 reloc_symbol = ELFRelocation::RelocSymbol32; 2564 } else { 2565 reloc_type = ELFRelocation::RelocType64; 2566 reloc_symbol = ELFRelocation::RelocSymbol64; 2567 } 2568 2569 unsigned slot_type = hdr->GetRelocationJumpSlotType(); 2570 unsigned i; 2571 for (i = 0; i < num_relocations; ++i) { 2572 if (!rel.Parse(rel_data, &offset)) 2573 break; 2574 2575 if (reloc_type(rel) != slot_type) 2576 continue; 2577 2578 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize; 2579 if (!symbol.Parse(symtab_data, &symbol_offset)) 2580 break; 2581 2582 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 2583 uint64_t plt_index = plt_offset + i * plt_entsize; 2584 2585 Symbol jump_symbol( 2586 i + start_id, // Symbol table index 2587 symbol_name, // symbol name. 2588 eSymbolTypeTrampoline, // Type of this symbol 2589 false, // Is this globally visible? 2590 false, // Is this symbol debug info? 2591 true, // Is this symbol a trampoline? 2592 true, // Is this symbol artificial? 2593 plt_section_sp, // Section in which this symbol is defined or null. 2594 plt_index, // Offset in section or symbol value. 2595 plt_entsize, // Size in bytes of this symbol. 2596 true, // Size is valid 2597 false, // Contains linker annotations? 2598 0); // Symbol flags. 2599 2600 symbol_table->AddSymbol(jump_symbol); 2601 } 2602 2603 return i; 2604 } 2605 2606 unsigned 2607 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, user_id_t start_id, 2608 const ELFSectionHeaderInfo *rel_hdr, 2609 user_id_t rel_id) { 2610 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL); 2611 2612 // The link field points to the associated symbol table. 2613 user_id_t symtab_id = rel_hdr->sh_link; 2614 2615 // If the link field doesn't point to the appropriate symbol name table then 2616 // try to find it by name as some compiler don't fill in the link fields. 2617 if (!symtab_id) 2618 symtab_id = GetSectionIndexByName(".dynsym"); 2619 2620 // Get PLT section. We cannot use rel_hdr->sh_info, since current linkers 2621 // point that to the .got.plt or .got section instead of .plt. 2622 user_id_t plt_id = GetSectionIndexByName(".plt"); 2623 2624 if (!symtab_id || !plt_id) 2625 return 0; 2626 2627 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id); 2628 if (!plt_hdr) 2629 return 0; 2630 2631 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id); 2632 if (!sym_hdr) 2633 return 0; 2634 2635 SectionList *section_list = m_sections_up.get(); 2636 if (!section_list) 2637 return 0; 2638 2639 Section *rel_section = section_list->FindSectionByID(rel_id).get(); 2640 if (!rel_section) 2641 return 0; 2642 2643 SectionSP plt_section_sp(section_list->FindSectionByID(plt_id)); 2644 if (!plt_section_sp) 2645 return 0; 2646 2647 Section *symtab = section_list->FindSectionByID(symtab_id).get(); 2648 if (!symtab) 2649 return 0; 2650 2651 // sh_link points to associated string table. 2652 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link).get(); 2653 if (!strtab) 2654 return 0; 2655 2656 DataExtractor rel_data; 2657 if (!ReadSectionData(rel_section, rel_data)) 2658 return 0; 2659 2660 DataExtractor symtab_data; 2661 if (!ReadSectionData(symtab, symtab_data)) 2662 return 0; 2663 2664 DataExtractor strtab_data; 2665 if (!ReadSectionData(strtab, strtab_data)) 2666 return 0; 2667 2668 unsigned rel_type = PLTRelocationType(); 2669 if (!rel_type) 2670 return 0; 2671 2672 return ParsePLTRelocations(symbol_table, start_id, rel_type, &m_header, 2673 rel_hdr, plt_hdr, sym_hdr, plt_section_sp, 2674 rel_data, symtab_data, strtab_data); 2675 } 2676 2677 static void ApplyELF64ABS64Relocation(Symtab *symtab, ELFRelocation &rel, 2678 DataExtractor &debug_data, 2679 Section *rel_section) { 2680 Symbol *symbol = symtab->FindSymbolByID(ELFRelocation::RelocSymbol64(rel)); 2681 if (symbol) { 2682 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2683 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2684 // ObjectFileELF creates a WritableDataBuffer in CreateInstance. 2685 WritableDataBuffer *data_buffer = 2686 llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); 2687 uint64_t *dst = reinterpret_cast<uint64_t *>( 2688 data_buffer->GetBytes() + rel_section->GetFileOffset() + 2689 ELFRelocation::RelocOffset64(rel)); 2690 uint64_t val_offset = value + ELFRelocation::RelocAddend64(rel); 2691 memcpy(dst, &val_offset, sizeof(uint64_t)); 2692 } 2693 } 2694 2695 static void ApplyELF64ABS32Relocation(Symtab *symtab, ELFRelocation &rel, 2696 DataExtractor &debug_data, 2697 Section *rel_section, bool is_signed) { 2698 Symbol *symbol = symtab->FindSymbolByID(ELFRelocation::RelocSymbol64(rel)); 2699 if (symbol) { 2700 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2701 value += ELFRelocation::RelocAddend32(rel); 2702 if ((!is_signed && (value > UINT32_MAX)) || 2703 (is_signed && 2704 ((int64_t)value > INT32_MAX || (int64_t)value < INT32_MIN))) { 2705 Log *log = GetLog(LLDBLog::Modules); 2706 LLDB_LOGF(log, "Failed to apply debug info relocations"); 2707 return; 2708 } 2709 uint32_t truncated_addr = (value & 0xFFFFFFFF); 2710 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2711 // ObjectFileELF creates a WritableDataBuffer in CreateInstance. 2712 WritableDataBuffer *data_buffer = 2713 llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); 2714 uint32_t *dst = reinterpret_cast<uint32_t *>( 2715 data_buffer->GetBytes() + rel_section->GetFileOffset() + 2716 ELFRelocation::RelocOffset32(rel)); 2717 memcpy(dst, &truncated_addr, sizeof(uint32_t)); 2718 } 2719 } 2720 2721 static void ApplyELF32ABS32RelRelocation(Symtab *symtab, ELFRelocation &rel, 2722 DataExtractor &debug_data, 2723 Section *rel_section) { 2724 Log *log = GetLog(LLDBLog::Modules); 2725 Symbol *symbol = symtab->FindSymbolByID(ELFRelocation::RelocSymbol32(rel)); 2726 if (symbol) { 2727 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2728 if (value == LLDB_INVALID_ADDRESS) { 2729 const char *name = symbol->GetName().GetCString(); 2730 LLDB_LOGF(log, "Debug info symbol invalid: %s", name); 2731 return; 2732 } 2733 assert(llvm::isUInt<32>(value) && "Valid addresses are 32-bit"); 2734 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2735 // ObjectFileELF creates a WritableDataBuffer in CreateInstance. 2736 WritableDataBuffer *data_buffer = 2737 llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); 2738 uint8_t *dst = data_buffer->GetBytes() + rel_section->GetFileOffset() + 2739 ELFRelocation::RelocOffset32(rel); 2740 // Implicit addend is stored inline as a signed value. 2741 int32_t addend; 2742 memcpy(&addend, dst, sizeof(int32_t)); 2743 // The sum must be positive. This extra check prevents UB from overflow in 2744 // the actual range check below. 2745 if (addend < 0 && static_cast<uint32_t>(-addend) > value) { 2746 LLDB_LOGF(log, "Debug info relocation overflow: 0x%" PRIx64, 2747 static_cast<int64_t>(value) + addend); 2748 return; 2749 } 2750 if (!llvm::isUInt<32>(value + addend)) { 2751 LLDB_LOGF(log, "Debug info relocation out of range: 0x%" PRIx64, value); 2752 return; 2753 } 2754 uint32_t addr = value + addend; 2755 memcpy(dst, &addr, sizeof(uint32_t)); 2756 } 2757 } 2758 2759 unsigned ObjectFileELF::ApplyRelocations( 2760 Symtab *symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr, 2761 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr, 2762 DataExtractor &rel_data, DataExtractor &symtab_data, 2763 DataExtractor &debug_data, Section *rel_section) { 2764 ELFRelocation rel(rel_hdr->sh_type); 2765 lldb::addr_t offset = 0; 2766 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2767 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); 2768 reloc_info_fn reloc_type; 2769 reloc_info_fn reloc_symbol; 2770 2771 if (hdr->Is32Bit()) { 2772 reloc_type = ELFRelocation::RelocType32; 2773 reloc_symbol = ELFRelocation::RelocSymbol32; 2774 } else { 2775 reloc_type = ELFRelocation::RelocType64; 2776 reloc_symbol = ELFRelocation::RelocSymbol64; 2777 } 2778 2779 for (unsigned i = 0; i < num_relocations; ++i) { 2780 if (!rel.Parse(rel_data, &offset)) { 2781 GetModule()->ReportError(".rel{0}[{1:d}] failed to parse relocation", 2782 rel_section->GetName().AsCString(), i); 2783 break; 2784 } 2785 Symbol *symbol = nullptr; 2786 2787 if (hdr->Is32Bit()) { 2788 switch (hdr->e_machine) { 2789 case llvm::ELF::EM_ARM: 2790 switch (reloc_type(rel)) { 2791 case R_ARM_ABS32: 2792 ApplyELF32ABS32RelRelocation(symtab, rel, debug_data, rel_section); 2793 break; 2794 case R_ARM_REL32: 2795 GetModule()->ReportError("unsupported AArch32 relocation:" 2796 " .rel{0}[{1}], type {2}", 2797 rel_section->GetName().AsCString(), i, 2798 reloc_type(rel)); 2799 break; 2800 default: 2801 assert(false && "unexpected relocation type"); 2802 } 2803 break; 2804 case llvm::ELF::EM_386: 2805 switch (reloc_type(rel)) { 2806 case R_386_32: 2807 symbol = symtab->FindSymbolByID(reloc_symbol(rel)); 2808 if (symbol) { 2809 addr_t f_offset = 2810 rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel); 2811 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2812 // ObjectFileELF creates a WritableDataBuffer in CreateInstance. 2813 WritableDataBuffer *data_buffer = 2814 llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); 2815 uint32_t *dst = reinterpret_cast<uint32_t *>( 2816 data_buffer->GetBytes() + f_offset); 2817 2818 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2819 if (rel.IsRela()) { 2820 value += ELFRelocation::RelocAddend32(rel); 2821 } else { 2822 value += *dst; 2823 } 2824 *dst = value; 2825 } else { 2826 GetModule()->ReportError(".rel{0}[{1}] unknown symbol id: {2:d}", 2827 rel_section->GetName().AsCString(), i, 2828 reloc_symbol(rel)); 2829 } 2830 break; 2831 case R_386_NONE: 2832 case R_386_PC32: 2833 GetModule()->ReportError("unsupported i386 relocation:" 2834 " .rel{0}[{1}], type {2}", 2835 rel_section->GetName().AsCString(), i, 2836 reloc_type(rel)); 2837 break; 2838 default: 2839 assert(false && "unexpected relocation type"); 2840 break; 2841 } 2842 break; 2843 default: 2844 GetModule()->ReportError("unsupported 32-bit ELF machine arch: {0}", hdr->e_machine); 2845 break; 2846 } 2847 } else { 2848 switch (hdr->e_machine) { 2849 case llvm::ELF::EM_AARCH64: 2850 switch (reloc_type(rel)) { 2851 case R_AARCH64_ABS64: 2852 ApplyELF64ABS64Relocation(symtab, rel, debug_data, rel_section); 2853 break; 2854 case R_AARCH64_ABS32: 2855 ApplyELF64ABS32Relocation(symtab, rel, debug_data, rel_section, true); 2856 break; 2857 default: 2858 assert(false && "unexpected relocation type"); 2859 } 2860 break; 2861 case llvm::ELF::EM_LOONGARCH: 2862 switch (reloc_type(rel)) { 2863 case R_LARCH_64: 2864 ApplyELF64ABS64Relocation(symtab, rel, debug_data, rel_section); 2865 break; 2866 case R_LARCH_32: 2867 ApplyELF64ABS32Relocation(symtab, rel, debug_data, rel_section, true); 2868 break; 2869 default: 2870 assert(false && "unexpected relocation type"); 2871 } 2872 break; 2873 case llvm::ELF::EM_X86_64: 2874 switch (reloc_type(rel)) { 2875 case R_X86_64_64: 2876 ApplyELF64ABS64Relocation(symtab, rel, debug_data, rel_section); 2877 break; 2878 case R_X86_64_32: 2879 ApplyELF64ABS32Relocation(symtab, rel, debug_data, rel_section, 2880 false); 2881 break; 2882 case R_X86_64_32S: 2883 ApplyELF64ABS32Relocation(symtab, rel, debug_data, rel_section, true); 2884 break; 2885 case R_X86_64_PC32: 2886 default: 2887 assert(false && "unexpected relocation type"); 2888 } 2889 break; 2890 default: 2891 GetModule()->ReportError("unsupported 64-bit ELF machine arch: {0}", hdr->e_machine); 2892 break; 2893 } 2894 } 2895 } 2896 2897 return 0; 2898 } 2899 2900 unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, 2901 user_id_t rel_id, 2902 lldb_private::Symtab *thetab) { 2903 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL); 2904 2905 // Parse in the section list if needed. 2906 SectionList *section_list = GetSectionList(); 2907 if (!section_list) 2908 return 0; 2909 2910 user_id_t symtab_id = rel_hdr->sh_link; 2911 user_id_t debug_id = rel_hdr->sh_info; 2912 2913 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id); 2914 if (!symtab_hdr) 2915 return 0; 2916 2917 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id); 2918 if (!debug_hdr) 2919 return 0; 2920 2921 Section *rel = section_list->FindSectionByID(rel_id).get(); 2922 if (!rel) 2923 return 0; 2924 2925 Section *symtab = section_list->FindSectionByID(symtab_id).get(); 2926 if (!symtab) 2927 return 0; 2928 2929 Section *debug = section_list->FindSectionByID(debug_id).get(); 2930 if (!debug) 2931 return 0; 2932 2933 DataExtractor rel_data; 2934 DataExtractor symtab_data; 2935 DataExtractor debug_data; 2936 2937 if (GetData(rel->GetFileOffset(), rel->GetFileSize(), rel_data) && 2938 GetData(symtab->GetFileOffset(), symtab->GetFileSize(), symtab_data) && 2939 GetData(debug->GetFileOffset(), debug->GetFileSize(), debug_data)) { 2940 ApplyRelocations(thetab, &m_header, rel_hdr, symtab_hdr, debug_hdr, 2941 rel_data, symtab_data, debug_data, debug); 2942 } 2943 2944 return 0; 2945 } 2946 2947 void ObjectFileELF::ParseSymtab(Symtab &lldb_symtab) { 2948 ModuleSP module_sp(GetModule()); 2949 if (!module_sp) 2950 return; 2951 2952 Progress progress("Parsing symbol table", 2953 m_file.GetFilename().AsCString("<Unknown>")); 2954 ElapsedTime elapsed(module_sp->GetSymtabParseTime()); 2955 2956 // We always want to use the main object file so we (hopefully) only have one 2957 // cached copy of our symtab, dynamic sections, etc. 2958 ObjectFile *module_obj_file = module_sp->GetObjectFile(); 2959 if (module_obj_file && module_obj_file != this) 2960 return module_obj_file->ParseSymtab(lldb_symtab); 2961 2962 SectionList *section_list = module_sp->GetSectionList(); 2963 if (!section_list) 2964 return; 2965 2966 uint64_t symbol_id = 0; 2967 2968 // Sharable objects and dynamic executables usually have 2 distinct symbol 2969 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a 2970 // smaller version of the symtab that only contains global symbols. The 2971 // information found in the dynsym is therefore also found in the symtab, 2972 // while the reverse is not necessarily true. 2973 Section *symtab = 2974 section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get(); 2975 if (symtab) { 2976 auto [num_symbols, address_class_map] = 2977 ParseSymbolTable(&lldb_symtab, symbol_id, symtab); 2978 m_address_class_map.merge(address_class_map); 2979 symbol_id += num_symbols; 2980 } 2981 2982 // The symtab section is non-allocable and can be stripped, while the 2983 // .dynsym section which should always be always be there. To support the 2984 // minidebuginfo case we parse .dynsym when there's a .gnu_debuginfo 2985 // section, nomatter if .symtab was already parsed or not. This is because 2986 // minidebuginfo normally removes the .symtab symbols which have their 2987 // matching .dynsym counterparts. 2988 if (!symtab || 2989 GetSectionList()->FindSectionByName(ConstString(".gnu_debugdata"))) { 2990 Section *dynsym = 2991 section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true) 2992 .get(); 2993 if (dynsym) { 2994 auto [num_symbols, address_class_map] = 2995 ParseSymbolTable(&lldb_symtab, symbol_id, dynsym); 2996 symbol_id += num_symbols; 2997 m_address_class_map.merge(address_class_map); 2998 } 2999 } 3000 3001 // DT_JMPREL 3002 // If present, this entry's d_ptr member holds the address of 3003 // relocation 3004 // entries associated solely with the procedure linkage table. 3005 // Separating 3006 // these relocation entries lets the dynamic linker ignore them during 3007 // process initialization, if lazy binding is enabled. If this entry is 3008 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must 3009 // also be present. 3010 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL); 3011 if (symbol) { 3012 // Synthesize trampoline symbols to help navigate the PLT. 3013 addr_t addr = symbol->d_ptr; 3014 Section *reloc_section = 3015 section_list->FindSectionContainingFileAddress(addr).get(); 3016 if (reloc_section) { 3017 user_id_t reloc_id = reloc_section->GetID(); 3018 const ELFSectionHeaderInfo *reloc_header = 3019 GetSectionHeaderByIndex(reloc_id); 3020 if (reloc_header) 3021 ParseTrampolineSymbols(&lldb_symtab, symbol_id, reloc_header, reloc_id); 3022 } 3023 } 3024 3025 if (DWARFCallFrameInfo *eh_frame = 3026 GetModule()->GetUnwindTable().GetEHFrameInfo()) { 3027 ParseUnwindSymbols(&lldb_symtab, eh_frame); 3028 } 3029 3030 // In the event that there's no symbol entry for the entry point we'll 3031 // artificially create one. We delegate to the symtab object the figuring 3032 // out of the proper size, this will usually make it span til the next 3033 // symbol it finds in the section. This means that if there are missing 3034 // symbols the entry point might span beyond its function definition. 3035 // We're fine with this as it doesn't make it worse than not having a 3036 // symbol entry at all. 3037 if (CalculateType() == eTypeExecutable) { 3038 ArchSpec arch = GetArchitecture(); 3039 auto entry_point_addr = GetEntryPointAddress(); 3040 bool is_valid_entry_point = 3041 entry_point_addr.IsValid() && entry_point_addr.IsSectionOffset(); 3042 addr_t entry_point_file_addr = entry_point_addr.GetFileAddress(); 3043 if (is_valid_entry_point && !lldb_symtab.FindSymbolContainingFileAddress( 3044 entry_point_file_addr)) { 3045 uint64_t symbol_id = lldb_symtab.GetNumSymbols(); 3046 // Don't set the name for any synthetic symbols, the Symbol 3047 // object will generate one if needed when the name is accessed 3048 // via accessors. 3049 SectionSP section_sp = entry_point_addr.GetSection(); 3050 Symbol symbol( 3051 /*symID=*/symbol_id, 3052 /*name=*/llvm::StringRef(), // Name will be auto generated. 3053 /*type=*/eSymbolTypeCode, 3054 /*external=*/true, 3055 /*is_debug=*/false, 3056 /*is_trampoline=*/false, 3057 /*is_artificial=*/true, 3058 /*section_sp=*/section_sp, 3059 /*offset=*/0, 3060 /*size=*/0, // FDE can span multiple symbols so don't use its size. 3061 /*size_is_valid=*/false, 3062 /*contains_linker_annotations=*/false, 3063 /*flags=*/0); 3064 // When the entry point is arm thumb we need to explicitly set its 3065 // class address to reflect that. This is important because expression 3066 // evaluation relies on correctly setting a breakpoint at this 3067 // address. 3068 if (arch.GetMachine() == llvm::Triple::arm && 3069 (entry_point_file_addr & 1)) { 3070 symbol.GetAddressRef().SetOffset(entry_point_addr.GetOffset() ^ 1); 3071 m_address_class_map[entry_point_file_addr ^ 1] = 3072 AddressClass::eCodeAlternateISA; 3073 } else { 3074 m_address_class_map[entry_point_file_addr] = AddressClass::eCode; 3075 } 3076 lldb_symtab.AddSymbol(symbol); 3077 } 3078 } 3079 } 3080 3081 void ObjectFileELF::RelocateSection(lldb_private::Section *section) 3082 { 3083 static const char *debug_prefix = ".debug"; 3084 3085 // Set relocated bit so we stop getting called, regardless of whether we 3086 // actually relocate. 3087 section->SetIsRelocated(true); 3088 3089 // We only relocate in ELF relocatable files 3090 if (CalculateType() != eTypeObjectFile) 3091 return; 3092 3093 const char *section_name = section->GetName().GetCString(); 3094 // Can't relocate that which can't be named 3095 if (section_name == nullptr) 3096 return; 3097 3098 // We don't relocate non-debug sections at the moment 3099 if (strncmp(section_name, debug_prefix, strlen(debug_prefix))) 3100 return; 3101 3102 // Relocation section names to look for 3103 std::string needle = std::string(".rel") + section_name; 3104 std::string needlea = std::string(".rela") + section_name; 3105 3106 for (SectionHeaderCollIter I = m_section_headers.begin(); 3107 I != m_section_headers.end(); ++I) { 3108 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) { 3109 const char *hay_name = I->section_name.GetCString(); 3110 if (hay_name == nullptr) 3111 continue; 3112 if (needle == hay_name || needlea == hay_name) { 3113 const ELFSectionHeader &reloc_header = *I; 3114 user_id_t reloc_id = SectionIndex(I); 3115 RelocateDebugSections(&reloc_header, reloc_id, GetSymtab()); 3116 break; 3117 } 3118 } 3119 } 3120 } 3121 3122 void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table, 3123 DWARFCallFrameInfo *eh_frame) { 3124 SectionList *section_list = GetSectionList(); 3125 if (!section_list) 3126 return; 3127 3128 // First we save the new symbols into a separate list and add them to the 3129 // symbol table after we collected all symbols we want to add. This is 3130 // neccessary because adding a new symbol invalidates the internal index of 3131 // the symtab what causing the next lookup to be slow because it have to 3132 // recalculate the index first. 3133 std::vector<Symbol> new_symbols; 3134 3135 size_t num_symbols = symbol_table->GetNumSymbols(); 3136 uint64_t last_symbol_id = 3137 num_symbols ? symbol_table->SymbolAtIndex(num_symbols - 1)->GetID() : 0; 3138 eh_frame->ForEachFDEEntries([&](lldb::addr_t file_addr, uint32_t size, 3139 dw_offset_t) { 3140 Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr); 3141 if (symbol) { 3142 if (!symbol->GetByteSizeIsValid()) { 3143 symbol->SetByteSize(size); 3144 symbol->SetSizeIsSynthesized(true); 3145 } 3146 } else { 3147 SectionSP section_sp = 3148 section_list->FindSectionContainingFileAddress(file_addr); 3149 if (section_sp) { 3150 addr_t offset = file_addr - section_sp->GetFileAddress(); 3151 uint64_t symbol_id = ++last_symbol_id; 3152 // Don't set the name for any synthetic symbols, the Symbol 3153 // object will generate one if needed when the name is accessed 3154 // via accessors. 3155 Symbol eh_symbol( 3156 /*symID=*/symbol_id, 3157 /*name=*/llvm::StringRef(), // Name will be auto generated. 3158 /*type=*/eSymbolTypeCode, 3159 /*external=*/true, 3160 /*is_debug=*/false, 3161 /*is_trampoline=*/false, 3162 /*is_artificial=*/true, 3163 /*section_sp=*/section_sp, 3164 /*offset=*/offset, 3165 /*size=*/0, // FDE can span multiple symbols so don't use its size. 3166 /*size_is_valid=*/false, 3167 /*contains_linker_annotations=*/false, 3168 /*flags=*/0); 3169 new_symbols.push_back(eh_symbol); 3170 } 3171 } 3172 return true; 3173 }); 3174 3175 for (const Symbol &s : new_symbols) 3176 symbol_table->AddSymbol(s); 3177 } 3178 3179 bool ObjectFileELF::IsStripped() { 3180 // TODO: determine this for ELF 3181 return false; 3182 } 3183 3184 //===----------------------------------------------------------------------===// 3185 // Dump 3186 // 3187 // Dump the specifics of the runtime file container (such as any headers 3188 // segments, sections, etc). 3189 void ObjectFileELF::Dump(Stream *s) { 3190 ModuleSP module_sp(GetModule()); 3191 if (!module_sp) { 3192 return; 3193 } 3194 3195 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex()); 3196 s->Printf("%p: ", static_cast<void *>(this)); 3197 s->Indent(); 3198 s->PutCString("ObjectFileELF"); 3199 3200 ArchSpec header_arch = GetArchitecture(); 3201 3202 *s << ", file = '" << m_file 3203 << "', arch = " << header_arch.GetArchitectureName(); 3204 if (m_memory_addr != LLDB_INVALID_ADDRESS) 3205 s->Printf(", addr = %#16.16" PRIx64, m_memory_addr); 3206 s->EOL(); 3207 3208 DumpELFHeader(s, m_header); 3209 s->EOL(); 3210 DumpELFProgramHeaders(s); 3211 s->EOL(); 3212 DumpELFSectionHeaders(s); 3213 s->EOL(); 3214 SectionList *section_list = GetSectionList(); 3215 if (section_list) 3216 section_list->Dump(s->AsRawOstream(), s->GetIndentLevel(), nullptr, true, 3217 UINT32_MAX); 3218 Symtab *symtab = GetSymtab(); 3219 if (symtab) 3220 symtab->Dump(s, nullptr, eSortOrderNone); 3221 s->EOL(); 3222 DumpDependentModules(s); 3223 s->EOL(); 3224 DumpELFDynamic(s); 3225 s->EOL(); 3226 Address image_info_addr = GetImageInfoAddress(nullptr); 3227 if (image_info_addr.IsValid()) 3228 s->Printf("image_info_address = %#16.16" PRIx64 "\n", 3229 image_info_addr.GetFileAddress()); 3230 } 3231 3232 // DumpELFHeader 3233 // 3234 // Dump the ELF header to the specified output stream 3235 void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) { 3236 s->PutCString("ELF Header\n"); 3237 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]); 3238 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1], 3239 header.e_ident[EI_MAG1]); 3240 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2], 3241 header.e_ident[EI_MAG2]); 3242 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3], 3243 header.e_ident[EI_MAG3]); 3244 3245 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]); 3246 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]); 3247 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]); 3248 s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]); 3249 s->Printf("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]); 3250 3251 s->Printf("e_type = 0x%4.4x ", header.e_type); 3252 DumpELFHeader_e_type(s, header.e_type); 3253 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine); 3254 s->Printf("e_version = 0x%8.8x\n", header.e_version); 3255 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry); 3256 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff); 3257 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff); 3258 s->Printf("e_flags = 0x%8.8x\n", header.e_flags); 3259 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize); 3260 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize); 3261 s->Printf("e_phnum = 0x%8.8x\n", header.e_phnum); 3262 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize); 3263 s->Printf("e_shnum = 0x%8.8x\n", header.e_shnum); 3264 s->Printf("e_shstrndx = 0x%8.8x\n", header.e_shstrndx); 3265 } 3266 3267 // DumpELFHeader_e_type 3268 // 3269 // Dump an token value for the ELF header member e_type 3270 void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) { 3271 switch (e_type) { 3272 case ET_NONE: 3273 *s << "ET_NONE"; 3274 break; 3275 case ET_REL: 3276 *s << "ET_REL"; 3277 break; 3278 case ET_EXEC: 3279 *s << "ET_EXEC"; 3280 break; 3281 case ET_DYN: 3282 *s << "ET_DYN"; 3283 break; 3284 case ET_CORE: 3285 *s << "ET_CORE"; 3286 break; 3287 default: 3288 break; 3289 } 3290 } 3291 3292 // DumpELFHeader_e_ident_EI_DATA 3293 // 3294 // Dump an token value for the ELF header member e_ident[EI_DATA] 3295 void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, 3296 unsigned char ei_data) { 3297 switch (ei_data) { 3298 case ELFDATANONE: 3299 *s << "ELFDATANONE"; 3300 break; 3301 case ELFDATA2LSB: 3302 *s << "ELFDATA2LSB - Little Endian"; 3303 break; 3304 case ELFDATA2MSB: 3305 *s << "ELFDATA2MSB - Big Endian"; 3306 break; 3307 default: 3308 break; 3309 } 3310 } 3311 3312 // DumpELFProgramHeader 3313 // 3314 // Dump a single ELF program header to the specified output stream 3315 void ObjectFileELF::DumpELFProgramHeader(Stream *s, 3316 const ELFProgramHeader &ph) { 3317 DumpELFProgramHeader_p_type(s, ph.p_type); 3318 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, 3319 ph.p_vaddr, ph.p_paddr); 3320 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, 3321 ph.p_flags); 3322 3323 DumpELFProgramHeader_p_flags(s, ph.p_flags); 3324 s->Printf(") %8.8" PRIx64, ph.p_align); 3325 } 3326 3327 // DumpELFProgramHeader_p_type 3328 // 3329 // Dump an token value for the ELF program header member p_type which describes 3330 // the type of the program header 3331 void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) { 3332 const int kStrWidth = 15; 3333 switch (p_type) { 3334 CASE_AND_STREAM(s, PT_NULL, kStrWidth); 3335 CASE_AND_STREAM(s, PT_LOAD, kStrWidth); 3336 CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth); 3337 CASE_AND_STREAM(s, PT_INTERP, kStrWidth); 3338 CASE_AND_STREAM(s, PT_NOTE, kStrWidth); 3339 CASE_AND_STREAM(s, PT_SHLIB, kStrWidth); 3340 CASE_AND_STREAM(s, PT_PHDR, kStrWidth); 3341 CASE_AND_STREAM(s, PT_TLS, kStrWidth); 3342 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth); 3343 default: 3344 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, ""); 3345 break; 3346 } 3347 } 3348 3349 // DumpELFProgramHeader_p_flags 3350 // 3351 // Dump an token value for the ELF program header member p_flags 3352 void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) { 3353 *s << ((p_flags & PF_X) ? "PF_X" : " ") 3354 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ') 3355 << ((p_flags & PF_W) ? "PF_W" : " ") 3356 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ') 3357 << ((p_flags & PF_R) ? "PF_R" : " "); 3358 } 3359 3360 // DumpELFProgramHeaders 3361 // 3362 // Dump all of the ELF program header to the specified output stream 3363 void ObjectFileELF::DumpELFProgramHeaders(Stream *s) { 3364 if (!ParseProgramHeaders()) 3365 return; 3366 3367 s->PutCString("Program Headers\n"); 3368 s->PutCString("IDX p_type p_offset p_vaddr p_paddr " 3369 "p_filesz p_memsz p_flags p_align\n"); 3370 s->PutCString("==== --------------- -------- -------- -------- " 3371 "-------- -------- ------------------------- --------\n"); 3372 3373 for (const auto &H : llvm::enumerate(m_program_headers)) { 3374 s->Format("[{0,2}] ", H.index()); 3375 ObjectFileELF::DumpELFProgramHeader(s, H.value()); 3376 s->EOL(); 3377 } 3378 } 3379 3380 // DumpELFSectionHeader 3381 // 3382 // Dump a single ELF section header to the specified output stream 3383 void ObjectFileELF::DumpELFSectionHeader(Stream *s, 3384 const ELFSectionHeaderInfo &sh) { 3385 s->Printf("%8.8x ", sh.sh_name); 3386 DumpELFSectionHeader_sh_type(s, sh.sh_type); 3387 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags); 3388 DumpELFSectionHeader_sh_flags(s, sh.sh_flags); 3389 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, 3390 sh.sh_offset, sh.sh_size); 3391 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info); 3392 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize); 3393 } 3394 3395 // DumpELFSectionHeader_sh_type 3396 // 3397 // Dump an token value for the ELF section header member sh_type which 3398 // describes the type of the section 3399 void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) { 3400 const int kStrWidth = 12; 3401 switch (sh_type) { 3402 CASE_AND_STREAM(s, SHT_NULL, kStrWidth); 3403 CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth); 3404 CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth); 3405 CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth); 3406 CASE_AND_STREAM(s, SHT_RELA, kStrWidth); 3407 CASE_AND_STREAM(s, SHT_HASH, kStrWidth); 3408 CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth); 3409 CASE_AND_STREAM(s, SHT_NOTE, kStrWidth); 3410 CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth); 3411 CASE_AND_STREAM(s, SHT_REL, kStrWidth); 3412 CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth); 3413 CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth); 3414 CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth); 3415 CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth); 3416 CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth); 3417 CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth); 3418 default: 3419 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, ""); 3420 break; 3421 } 3422 } 3423 3424 // DumpELFSectionHeader_sh_flags 3425 // 3426 // Dump an token value for the ELF section header member sh_flags 3427 void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, 3428 elf_xword sh_flags) { 3429 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ") 3430 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ') 3431 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ") 3432 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ') 3433 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " "); 3434 } 3435 3436 // DumpELFSectionHeaders 3437 // 3438 // Dump all of the ELF section header to the specified output stream 3439 void ObjectFileELF::DumpELFSectionHeaders(Stream *s) { 3440 if (!ParseSectionHeaders()) 3441 return; 3442 3443 s->PutCString("Section Headers\n"); 3444 s->PutCString("IDX name type flags " 3445 "addr offset size link info addralgn " 3446 "entsize Name\n"); 3447 s->PutCString("==== -------- ------------ -------------------------------- " 3448 "-------- -------- -------- -------- -------- -------- " 3449 "-------- ====================\n"); 3450 3451 uint32_t idx = 0; 3452 for (SectionHeaderCollConstIter I = m_section_headers.begin(); 3453 I != m_section_headers.end(); ++I, ++idx) { 3454 s->Printf("[%2u] ", idx); 3455 ObjectFileELF::DumpELFSectionHeader(s, *I); 3456 const char *section_name = I->section_name.AsCString(""); 3457 if (section_name) 3458 *s << ' ' << section_name << "\n"; 3459 } 3460 } 3461 3462 void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) { 3463 size_t num_modules = ParseDependentModules(); 3464 3465 if (num_modules > 0) { 3466 s->PutCString("Dependent Modules:\n"); 3467 for (unsigned i = 0; i < num_modules; ++i) { 3468 const FileSpec &spec = m_filespec_up->GetFileSpecAtIndex(i); 3469 s->Printf(" %s\n", spec.GetFilename().GetCString()); 3470 } 3471 } 3472 } 3473 3474 std::string static getDynamicTagAsString(uint16_t Arch, uint64_t Type) { 3475 #define DYNAMIC_STRINGIFY_ENUM(tag, value) \ 3476 case value: \ 3477 return #tag; 3478 3479 #define DYNAMIC_TAG(n, v) 3480 switch (Arch) { 3481 case llvm::ELF::EM_AARCH64: 3482 switch (Type) { 3483 #define AARCH64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3484 #include "llvm/BinaryFormat/DynamicTags.def" 3485 #undef AARCH64_DYNAMIC_TAG 3486 } 3487 break; 3488 3489 case llvm::ELF::EM_HEXAGON: 3490 switch (Type) { 3491 #define HEXAGON_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3492 #include "llvm/BinaryFormat/DynamicTags.def" 3493 #undef HEXAGON_DYNAMIC_TAG 3494 } 3495 break; 3496 3497 case llvm::ELF::EM_MIPS: 3498 switch (Type) { 3499 #define MIPS_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3500 #include "llvm/BinaryFormat/DynamicTags.def" 3501 #undef MIPS_DYNAMIC_TAG 3502 } 3503 break; 3504 3505 case llvm::ELF::EM_PPC: 3506 switch (Type) { 3507 #define PPC_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3508 #include "llvm/BinaryFormat/DynamicTags.def" 3509 #undef PPC_DYNAMIC_TAG 3510 } 3511 break; 3512 3513 case llvm::ELF::EM_PPC64: 3514 switch (Type) { 3515 #define PPC64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3516 #include "llvm/BinaryFormat/DynamicTags.def" 3517 #undef PPC64_DYNAMIC_TAG 3518 } 3519 break; 3520 3521 case llvm::ELF::EM_RISCV: 3522 switch (Type) { 3523 #define RISCV_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3524 #include "llvm/BinaryFormat/DynamicTags.def" 3525 #undef RISCV_DYNAMIC_TAG 3526 } 3527 break; 3528 } 3529 #undef DYNAMIC_TAG 3530 switch (Type) { 3531 // Now handle all dynamic tags except the architecture specific ones 3532 #define AARCH64_DYNAMIC_TAG(name, value) 3533 #define MIPS_DYNAMIC_TAG(name, value) 3534 #define HEXAGON_DYNAMIC_TAG(name, value) 3535 #define PPC_DYNAMIC_TAG(name, value) 3536 #define PPC64_DYNAMIC_TAG(name, value) 3537 #define RISCV_DYNAMIC_TAG(name, value) 3538 // Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc. 3539 #define DYNAMIC_TAG_MARKER(name, value) 3540 #define DYNAMIC_TAG(name, value) \ 3541 case value: \ 3542 return #name; 3543 #include "llvm/BinaryFormat/DynamicTags.def" 3544 #undef DYNAMIC_TAG 3545 #undef AARCH64_DYNAMIC_TAG 3546 #undef MIPS_DYNAMIC_TAG 3547 #undef HEXAGON_DYNAMIC_TAG 3548 #undef PPC_DYNAMIC_TAG 3549 #undef PPC64_DYNAMIC_TAG 3550 #undef RISCV_DYNAMIC_TAG 3551 #undef DYNAMIC_TAG_MARKER 3552 #undef DYNAMIC_STRINGIFY_ENUM 3553 default: 3554 return "<unknown:>0x" + llvm::utohexstr(Type, true); 3555 } 3556 } 3557 3558 void ObjectFileELF::DumpELFDynamic(lldb_private::Stream *s) { 3559 ParseDynamicSymbols(); 3560 if (m_dynamic_symbols.empty()) 3561 return; 3562 3563 s->PutCString(".dynamic:\n"); 3564 s->PutCString("IDX d_tag d_val/d_ptr\n"); 3565 s->PutCString("==== ---------------- ------------------\n"); 3566 uint32_t idx = 0; 3567 for (const auto &entry : m_dynamic_symbols) { 3568 s->Printf("[%2u] ", idx++); 3569 s->Printf( 3570 "%-16s 0x%16.16" PRIx64, 3571 getDynamicTagAsString(m_header.e_machine, entry.symbol.d_tag).c_str(), 3572 entry.symbol.d_ptr); 3573 if (!entry.name.empty()) 3574 s->Printf(" \"%s\"", entry.name.c_str()); 3575 s->EOL(); 3576 } 3577 } 3578 3579 ArchSpec ObjectFileELF::GetArchitecture() { 3580 if (!ParseHeader()) 3581 return ArchSpec(); 3582 3583 if (m_section_headers.empty()) { 3584 // Allow elf notes to be parsed which may affect the detected architecture. 3585 ParseSectionHeaders(); 3586 } 3587 3588 if (CalculateType() == eTypeCoreFile && 3589 !m_arch_spec.TripleOSWasSpecified()) { 3590 // Core files don't have section headers yet they have PT_NOTE program 3591 // headers that might shed more light on the architecture 3592 for (const elf::ELFProgramHeader &H : ProgramHeaders()) { 3593 if (H.p_type != PT_NOTE || H.p_offset == 0 || H.p_filesz == 0) 3594 continue; 3595 DataExtractor data; 3596 if (data.SetData(m_data, H.p_offset, H.p_filesz) == H.p_filesz) { 3597 UUID uuid; 3598 RefineModuleDetailsFromNote(data, m_arch_spec, uuid); 3599 } 3600 } 3601 } 3602 return m_arch_spec; 3603 } 3604 3605 ObjectFile::Type ObjectFileELF::CalculateType() { 3606 switch (m_header.e_type) { 3607 case llvm::ELF::ET_NONE: 3608 // 0 - No file type 3609 return eTypeUnknown; 3610 3611 case llvm::ELF::ET_REL: 3612 // 1 - Relocatable file 3613 return eTypeObjectFile; 3614 3615 case llvm::ELF::ET_EXEC: 3616 // 2 - Executable file 3617 return eTypeExecutable; 3618 3619 case llvm::ELF::ET_DYN: 3620 // 3 - Shared object file 3621 return eTypeSharedLibrary; 3622 3623 case ET_CORE: 3624 // 4 - Core file 3625 return eTypeCoreFile; 3626 3627 default: 3628 break; 3629 } 3630 return eTypeUnknown; 3631 } 3632 3633 ObjectFile::Strata ObjectFileELF::CalculateStrata() { 3634 switch (m_header.e_type) { 3635 case llvm::ELF::ET_NONE: 3636 // 0 - No file type 3637 return eStrataUnknown; 3638 3639 case llvm::ELF::ET_REL: 3640 // 1 - Relocatable file 3641 return eStrataUnknown; 3642 3643 case llvm::ELF::ET_EXEC: 3644 // 2 - Executable file 3645 { 3646 SectionList *section_list = GetSectionList(); 3647 if (section_list) { 3648 static ConstString loader_section_name(".interp"); 3649 SectionSP loader_section = 3650 section_list->FindSectionByName(loader_section_name); 3651 if (loader_section) { 3652 char buffer[256]; 3653 size_t read_size = 3654 ReadSectionData(loader_section.get(), 0, buffer, sizeof(buffer)); 3655 3656 // We compare the content of .interp section 3657 // It will contains \0 when counting read_size, so the size needs to 3658 // decrease by one 3659 llvm::StringRef loader_name(buffer, read_size - 1); 3660 llvm::StringRef freebsd_kernel_loader_name("/red/herring"); 3661 if (loader_name == freebsd_kernel_loader_name) 3662 return eStrataKernel; 3663 } 3664 } 3665 return eStrataUser; 3666 } 3667 3668 case llvm::ELF::ET_DYN: 3669 // 3 - Shared object file 3670 // TODO: is there any way to detect that an shared library is a kernel 3671 // related executable by inspecting the program headers, section headers, 3672 // symbols, or any other flag bits??? 3673 return eStrataUnknown; 3674 3675 case ET_CORE: 3676 // 4 - Core file 3677 // TODO: is there any way to detect that an core file is a kernel 3678 // related executable by inspecting the program headers, section headers, 3679 // symbols, or any other flag bits??? 3680 return eStrataUnknown; 3681 3682 default: 3683 break; 3684 } 3685 return eStrataUnknown; 3686 } 3687 3688 size_t ObjectFileELF::ReadSectionData(Section *section, 3689 lldb::offset_t section_offset, void *dst, 3690 size_t dst_len) { 3691 // If some other objectfile owns this data, pass this to them. 3692 if (section->GetObjectFile() != this) 3693 return section->GetObjectFile()->ReadSectionData(section, section_offset, 3694 dst, dst_len); 3695 3696 if (!section->Test(SHF_COMPRESSED)) 3697 return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len); 3698 3699 // For compressed sections we need to read to full data to be able to 3700 // decompress. 3701 DataExtractor data; 3702 ReadSectionData(section, data); 3703 return data.CopyData(section_offset, dst_len, dst); 3704 } 3705 3706 size_t ObjectFileELF::ReadSectionData(Section *section, 3707 DataExtractor §ion_data) { 3708 // If some other objectfile owns this data, pass this to them. 3709 if (section->GetObjectFile() != this) 3710 return section->GetObjectFile()->ReadSectionData(section, section_data); 3711 3712 size_t result = ObjectFile::ReadSectionData(section, section_data); 3713 if (result == 0 || !(section->Get() & llvm::ELF::SHF_COMPRESSED)) 3714 return result; 3715 3716 auto Decompressor = llvm::object::Decompressor::create( 3717 section->GetName().GetStringRef(), 3718 {reinterpret_cast<const char *>(section_data.GetDataStart()), 3719 size_t(section_data.GetByteSize())}, 3720 GetByteOrder() == eByteOrderLittle, GetAddressByteSize() == 8); 3721 if (!Decompressor) { 3722 GetModule()->ReportWarning( 3723 "Unable to initialize decompressor for section '{0}': {1}", 3724 section->GetName().GetCString(), 3725 llvm::toString(Decompressor.takeError()).c_str()); 3726 section_data.Clear(); 3727 return 0; 3728 } 3729 3730 auto buffer_sp = 3731 std::make_shared<DataBufferHeap>(Decompressor->getDecompressedSize(), 0); 3732 if (auto error = Decompressor->decompress( 3733 {buffer_sp->GetBytes(), size_t(buffer_sp->GetByteSize())})) { 3734 GetModule()->ReportWarning("Decompression of section '{0}' failed: {1}", 3735 section->GetName().GetCString(), 3736 llvm::toString(std::move(error)).c_str()); 3737 section_data.Clear(); 3738 return 0; 3739 } 3740 3741 section_data.SetData(buffer_sp); 3742 return buffer_sp->GetByteSize(); 3743 } 3744 3745 llvm::ArrayRef<ELFProgramHeader> ObjectFileELF::ProgramHeaders() { 3746 ParseProgramHeaders(); 3747 return m_program_headers; 3748 } 3749 3750 DataExtractor ObjectFileELF::GetSegmentData(const ELFProgramHeader &H) { 3751 // Try and read the program header from our cached m_data which can come from 3752 // the file on disk being mmap'ed or from the initial part of the ELF file we 3753 // read from memory and cached. 3754 DataExtractor data = DataExtractor(m_data, H.p_offset, H.p_filesz); 3755 if (data.GetByteSize() == H.p_filesz) 3756 return data; 3757 if (IsInMemory()) { 3758 // We have a ELF file in process memory, read the program header data from 3759 // the process. 3760 if (ProcessSP process_sp = m_process_wp.lock()) { 3761 const lldb::offset_t base_file_addr = GetBaseAddress().GetFileAddress(); 3762 const addr_t load_bias = m_memory_addr - base_file_addr; 3763 const addr_t data_addr = H.p_vaddr + load_bias; 3764 if (DataBufferSP data_sp = ReadMemory(process_sp, data_addr, H.p_memsz)) 3765 return DataExtractor(data_sp, GetByteOrder(), GetAddressByteSize()); 3766 } 3767 } 3768 return DataExtractor(); 3769 } 3770 3771 bool ObjectFileELF::AnySegmentHasPhysicalAddress() { 3772 for (const ELFProgramHeader &H : ProgramHeaders()) { 3773 if (H.p_paddr != 0) 3774 return true; 3775 } 3776 return false; 3777 } 3778 3779 std::vector<ObjectFile::LoadableData> 3780 ObjectFileELF::GetLoadableData(Target &target) { 3781 // Create a list of loadable data from loadable segments, using physical 3782 // addresses if they aren't all null 3783 std::vector<LoadableData> loadables; 3784 bool should_use_paddr = AnySegmentHasPhysicalAddress(); 3785 for (const ELFProgramHeader &H : ProgramHeaders()) { 3786 LoadableData loadable; 3787 if (H.p_type != llvm::ELF::PT_LOAD) 3788 continue; 3789 loadable.Dest = should_use_paddr ? H.p_paddr : H.p_vaddr; 3790 if (loadable.Dest == LLDB_INVALID_ADDRESS) 3791 continue; 3792 if (H.p_filesz == 0) 3793 continue; 3794 auto segment_data = GetSegmentData(H); 3795 loadable.Contents = llvm::ArrayRef<uint8_t>(segment_data.GetDataStart(), 3796 segment_data.GetByteSize()); 3797 loadables.push_back(loadable); 3798 } 3799 return loadables; 3800 } 3801 3802 lldb::WritableDataBufferSP 3803 ObjectFileELF::MapFileDataWritable(const FileSpec &file, uint64_t Size, 3804 uint64_t Offset) { 3805 return FileSystem::Instance().CreateWritableDataBuffer(file.GetPath(), Size, 3806 Offset); 3807 } 3808 3809 std::optional<DataExtractor> ObjectFileELF::GetDynstrData() { 3810 if (SectionList *section_list = GetSectionList()) { 3811 // Find the SHT_DYNAMIC section. 3812 if (Section *dynamic = 3813 section_list 3814 ->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true) 3815 .get()) { 3816 assert(dynamic->GetObjectFile() == this); 3817 if (const ELFSectionHeaderInfo *header = 3818 GetSectionHeaderByIndex(dynamic->GetID())) { 3819 // sh_link: section header index of string table used by entries in 3820 // the section. 3821 if (Section *dynstr = 3822 section_list->FindSectionByID(header->sh_link).get()) { 3823 DataExtractor data; 3824 if (ReadSectionData(dynstr, data)) 3825 return data; 3826 } 3827 } 3828 } 3829 } 3830 3831 // Every ELF file which represents an executable or shared library has 3832 // mandatory .dynamic entries. Two of these values are DT_STRTAB and DT_STRSZ 3833 // and represent the dynamic symbol tables's string table. These are needed 3834 // by the dynamic loader and we can read them from a process' address space. 3835 // 3836 // When loading and ELF file from memory, only the program headers end up 3837 // being mapped into memory, and we can find these values in the PT_DYNAMIC 3838 // segment. 3839 const ELFDynamic *strtab = FindDynamicSymbol(DT_STRTAB); 3840 const ELFDynamic *strsz = FindDynamicSymbol(DT_STRSZ); 3841 if (strtab == nullptr || strsz == nullptr) 3842 return std::nullopt; 3843 3844 if (ProcessSP process_sp = m_process_wp.lock()) { 3845 if (DataBufferSP data_sp = 3846 ReadMemory(process_sp, strtab->d_ptr, strsz->d_val)) 3847 return DataExtractor(data_sp, GetByteOrder(), GetAddressByteSize()); 3848 } else { 3849 // We have an ELF file with no section headers or we didn't find the 3850 // .dynamic section. Try and find the .dynstr section. 3851 Address addr; 3852 if (addr.ResolveAddressUsingFileSections(strtab->d_ptr, GetSectionList())) { 3853 DataExtractor data; 3854 addr.GetSection()->GetSectionData(data); 3855 return DataExtractor(data, 3856 strtab->d_ptr - addr.GetSection()->GetFileAddress(), 3857 strsz->d_val); 3858 } 3859 } 3860 return std::nullopt; 3861 } 3862 3863 std::optional<lldb_private::DataExtractor> ObjectFileELF::GetDynamicData() { 3864 DataExtractor data; 3865 // The PT_DYNAMIC program header describes where the .dynamic section is and 3866 // doesn't require parsing section headers. The PT_DYNAMIC is required by 3867 // executables and shared libraries so it will always be available. 3868 for (const ELFProgramHeader &H : ProgramHeaders()) { 3869 if (H.p_type == llvm::ELF::PT_DYNAMIC) { 3870 data = GetSegmentData(H); 3871 if (data.GetByteSize() > 0) { 3872 m_dynamic_base_addr = H.p_vaddr; 3873 return data; 3874 } 3875 } 3876 } 3877 // Fall back to using section headers. 3878 if (SectionList *section_list = GetSectionList()) { 3879 // Find the SHT_DYNAMIC section. 3880 if (Section *dynamic = 3881 section_list 3882 ->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true) 3883 .get()) { 3884 assert(dynamic->GetObjectFile() == this); 3885 if (ReadSectionData(dynamic, data)) { 3886 m_dynamic_base_addr = dynamic->GetFileAddress(); 3887 return data; 3888 } 3889 } 3890 } 3891 return std::nullopt; 3892 } 3893