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 = 1072 Status::FromErrorString("failed to read FreeBSD ABI note payload"); 1073 return error; 1074 } 1075 1076 // Convert the version info into a major/minor number. 1077 const uint32_t version_major = version_info / 100000; 1078 const uint32_t version_minor = (version_info / 1000) % 100; 1079 1080 char os_name[32]; 1081 snprintf(os_name, sizeof(os_name), "freebsd%" PRIu32 ".%" PRIu32, 1082 version_major, version_minor); 1083 1084 // Set the elf OS version to FreeBSD. Also clear the vendor. 1085 arch_spec.GetTriple().setOSName(os_name); 1086 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1087 1088 LLDB_LOGF(log, 1089 "ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32 1090 ".%" PRIu32, 1091 __FUNCTION__, version_major, version_minor, 1092 static_cast<uint32_t>(version_info % 1000)); 1093 } 1094 // Process GNU ELF notes. 1095 else if (note.n_name == LLDB_NT_OWNER_GNU) { 1096 switch (note.n_type) { 1097 case LLDB_NT_GNU_ABI_TAG: 1098 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE) { 1099 // Pull out the min OS version supporting the ABI. 1100 uint32_t version_info[4]; 1101 if (data.GetU32(&offset, &version_info[0], note.n_descsz / 4) == 1102 nullptr) { 1103 error = 1104 Status::FromErrorString("failed to read GNU ABI note payload"); 1105 return error; 1106 } 1107 1108 // Set the OS per the OS field. 1109 switch (version_info[0]) { 1110 case LLDB_NT_GNU_ABI_OS_LINUX: 1111 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1112 arch_spec.GetTriple().setVendor( 1113 llvm::Triple::VendorType::UnknownVendor); 1114 LLDB_LOGF(log, 1115 "ObjectFileELF::%s detected Linux, min version %" PRIu32 1116 ".%" PRIu32 ".%" PRIu32, 1117 __FUNCTION__, version_info[1], version_info[2], 1118 version_info[3]); 1119 // FIXME we have the minimal version number, we could be propagating 1120 // that. version_info[1] = OS Major, version_info[2] = OS Minor, 1121 // version_info[3] = Revision. 1122 break; 1123 case LLDB_NT_GNU_ABI_OS_HURD: 1124 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS); 1125 arch_spec.GetTriple().setVendor( 1126 llvm::Triple::VendorType::UnknownVendor); 1127 LLDB_LOGF(log, 1128 "ObjectFileELF::%s detected Hurd (unsupported), min " 1129 "version %" PRIu32 ".%" PRIu32 ".%" PRIu32, 1130 __FUNCTION__, version_info[1], version_info[2], 1131 version_info[3]); 1132 break; 1133 case LLDB_NT_GNU_ABI_OS_SOLARIS: 1134 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Solaris); 1135 arch_spec.GetTriple().setVendor( 1136 llvm::Triple::VendorType::UnknownVendor); 1137 LLDB_LOGF(log, 1138 "ObjectFileELF::%s detected Solaris, min version %" PRIu32 1139 ".%" PRIu32 ".%" PRIu32, 1140 __FUNCTION__, version_info[1], version_info[2], 1141 version_info[3]); 1142 break; 1143 default: 1144 LLDB_LOGF(log, 1145 "ObjectFileELF::%s unrecognized OS in note, id %" PRIu32 1146 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, 1147 __FUNCTION__, version_info[0], version_info[1], 1148 version_info[2], version_info[3]); 1149 break; 1150 } 1151 } 1152 break; 1153 1154 case LLDB_NT_GNU_BUILD_ID_TAG: 1155 // Only bother processing this if we don't already have the uuid set. 1156 if (!uuid.IsValid()) { 1157 // 16 bytes is UUID|MD5, 20 bytes is SHA1. Other linkers may produce a 1158 // build-id of a different length. Accept it as long as it's at least 1159 // 4 bytes as it will be better than our own crc32. 1160 if (note.n_descsz >= 4) { 1161 if (const uint8_t *buf = data.PeekData(offset, note.n_descsz)) { 1162 // Save the build id as the UUID for the module. 1163 uuid = UUID(buf, note.n_descsz); 1164 } else { 1165 error = Status::FromErrorString( 1166 "failed to read GNU_BUILD_ID note payload"); 1167 return error; 1168 } 1169 } 1170 } 1171 break; 1172 } 1173 if (arch_spec.IsMIPS() && 1174 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) 1175 // The note.n_name == LLDB_NT_OWNER_GNU is valid for Linux platform 1176 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1177 } 1178 // Process NetBSD ELF executables and shared libraries 1179 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) && 1180 (note.n_type == LLDB_NT_NETBSD_IDENT_TAG) && 1181 (note.n_descsz == LLDB_NT_NETBSD_IDENT_DESCSZ) && 1182 (note.n_namesz == LLDB_NT_NETBSD_IDENT_NAMESZ)) { 1183 // Pull out the version info. 1184 uint32_t version_info; 1185 if (data.GetU32(&offset, &version_info, 1) == nullptr) { 1186 error = 1187 Status::FromErrorString("failed to read NetBSD ABI note payload"); 1188 return error; 1189 } 1190 // Convert the version info into a major/minor/patch number. 1191 // #define __NetBSD_Version__ MMmmrrpp00 1192 // 1193 // M = major version 1194 // m = minor version; a minor number of 99 indicates current. 1195 // r = 0 (since NetBSD 3.0 not used) 1196 // p = patchlevel 1197 const uint32_t version_major = version_info / 100000000; 1198 const uint32_t version_minor = (version_info % 100000000) / 1000000; 1199 const uint32_t version_patch = (version_info % 10000) / 100; 1200 // Set the elf OS version to NetBSD. Also clear the vendor. 1201 arch_spec.GetTriple().setOSName( 1202 llvm::formatv("netbsd{0}.{1}.{2}", version_major, version_minor, 1203 version_patch).str()); 1204 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1205 } 1206 // Process NetBSD ELF core(5) notes 1207 else if ((note.n_name == LLDB_NT_OWNER_NETBSDCORE) && 1208 (note.n_type == LLDB_NT_NETBSD_PROCINFO)) { 1209 // Set the elf OS version to NetBSD. Also clear the vendor. 1210 arch_spec.GetTriple().setOS(llvm::Triple::OSType::NetBSD); 1211 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1212 } 1213 // Process OpenBSD ELF notes. 1214 else if (note.n_name == LLDB_NT_OWNER_OPENBSD) { 1215 // Set the elf OS version to OpenBSD. Also clear the vendor. 1216 arch_spec.GetTriple().setOS(llvm::Triple::OSType::OpenBSD); 1217 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1218 } else if (note.n_name == LLDB_NT_OWNER_ANDROID) { 1219 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1220 arch_spec.GetTriple().setEnvironment( 1221 llvm::Triple::EnvironmentType::Android); 1222 } else if (note.n_name == LLDB_NT_OWNER_LINUX) { 1223 // This is sometimes found in core files and usually contains extended 1224 // register info 1225 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1226 } else if (note.n_name == LLDB_NT_OWNER_CORE) { 1227 // Parse the NT_FILE to look for stuff in paths to shared libraries 1228 // The contents look like this in a 64 bit ELF core file: 1229 // 1230 // count = 0x000000000000000a (10) 1231 // page_size = 0x0000000000001000 (4096) 1232 // Index start end file_ofs path 1233 // ===== ------------------ ------------------ ------------------ ------------------------------------- 1234 // [ 0] 0x0000000000401000 0x0000000000000000 /tmp/a.out 1235 // [ 1] 0x0000000000600000 0x0000000000601000 0x0000000000000000 /tmp/a.out 1236 // [ 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001 /tmp/a.out 1237 // [ 3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000 /lib/x86_64-linux-gnu/libc-2.19.so 1238 // [ 4] 0x00007fa79cba8000 0x00007fa79cda7000 0x00000000000001bb /lib/x86_64-linux-gnu/libc-2.19.so 1239 // [ 5] 0x00007fa79cda7000 0x00007fa79cdab000 0x00000000000001ba /lib/x86_64-linux-gnu/libc-2.19.so 1240 // [ 6] 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be /lib/x86_64-linux-gnu/libc-2.19.so 1241 // [ 7] 0x00007fa79cdb2000 0x00007fa79cdd5000 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.19.so 1242 // [ 8] 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022 /lib/x86_64-linux-gnu/ld-2.19.so 1243 // [ 9] 0x00007fa79cfd5000 0x00007fa79cfd6000 0x0000000000000023 /lib/x86_64-linux-gnu/ld-2.19.so 1244 // 1245 // In the 32 bit ELFs the count, page_size, start, end, file_ofs are 1246 // uint32_t. 1247 // 1248 // For reference: see readelf source code (in binutils). 1249 if (note.n_type == NT_FILE) { 1250 uint64_t count = data.GetAddress(&offset); 1251 const char *cstr; 1252 data.GetAddress(&offset); // Skip page size 1253 offset += count * 3 * 1254 data.GetAddressByteSize(); // Skip all start/end/file_ofs 1255 for (size_t i = 0; i < count; ++i) { 1256 cstr = data.GetCStr(&offset); 1257 if (cstr == nullptr) { 1258 error = Status::FromErrorStringWithFormat( 1259 "ObjectFileELF::%s trying to read " 1260 "at an offset after the end " 1261 "(GetCStr returned nullptr)", 1262 __FUNCTION__); 1263 return error; 1264 } 1265 llvm::StringRef path(cstr); 1266 if (path.contains("/lib/x86_64-linux-gnu") || path.contains("/lib/i386-linux-gnu")) { 1267 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1268 break; 1269 } 1270 } 1271 if (arch_spec.IsMIPS() && 1272 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) 1273 // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing for some 1274 // cases (e.g. compile with -nostdlib) Hence set OS to Linux 1275 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1276 } 1277 } 1278 1279 // Calculate the offset of the next note just in case "offset" has been 1280 // used to poke at the contents of the note data 1281 offset = note_offset + note.GetByteSize(); 1282 } 1283 1284 return error; 1285 } 1286 1287 void ObjectFileELF::ParseARMAttributes(DataExtractor &data, uint64_t length, 1288 ArchSpec &arch_spec) { 1289 lldb::offset_t Offset = 0; 1290 1291 uint8_t FormatVersion = data.GetU8(&Offset); 1292 if (FormatVersion != llvm::ELFAttrs::Format_Version) 1293 return; 1294 1295 Offset = Offset + sizeof(uint32_t); // Section Length 1296 llvm::StringRef VendorName = data.GetCStr(&Offset); 1297 1298 if (VendorName != "aeabi") 1299 return; 1300 1301 if (arch_spec.GetTriple().getEnvironment() == 1302 llvm::Triple::UnknownEnvironment) 1303 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI); 1304 1305 while (Offset < length) { 1306 uint8_t Tag = data.GetU8(&Offset); 1307 uint32_t Size = data.GetU32(&Offset); 1308 1309 if (Tag != llvm::ARMBuildAttrs::File || Size == 0) 1310 continue; 1311 1312 while (Offset < length) { 1313 uint64_t Tag = data.GetULEB128(&Offset); 1314 switch (Tag) { 1315 default: 1316 if (Tag < 32) 1317 data.GetULEB128(&Offset); 1318 else if (Tag % 2 == 0) 1319 data.GetULEB128(&Offset); 1320 else 1321 data.GetCStr(&Offset); 1322 1323 break; 1324 1325 case llvm::ARMBuildAttrs::CPU_raw_name: 1326 case llvm::ARMBuildAttrs::CPU_name: 1327 data.GetCStr(&Offset); 1328 1329 break; 1330 1331 case llvm::ARMBuildAttrs::ABI_VFP_args: { 1332 uint64_t VFPArgs = data.GetULEB128(&Offset); 1333 1334 if (VFPArgs == llvm::ARMBuildAttrs::BaseAAPCS) { 1335 if (arch_spec.GetTriple().getEnvironment() == 1336 llvm::Triple::UnknownEnvironment || 1337 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABIHF) 1338 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI); 1339 1340 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float); 1341 } else if (VFPArgs == llvm::ARMBuildAttrs::HardFPAAPCS) { 1342 if (arch_spec.GetTriple().getEnvironment() == 1343 llvm::Triple::UnknownEnvironment || 1344 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABI) 1345 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABIHF); 1346 1347 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float); 1348 } 1349 1350 break; 1351 } 1352 } 1353 } 1354 } 1355 } 1356 1357 // GetSectionHeaderInfo 1358 size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_headers, 1359 DataExtractor &object_data, 1360 const elf::ELFHeader &header, 1361 lldb_private::UUID &uuid, 1362 std::string &gnu_debuglink_file, 1363 uint32_t &gnu_debuglink_crc, 1364 ArchSpec &arch_spec) { 1365 // Don't reparse the section headers if we already did that. 1366 if (!section_headers.empty()) 1367 return section_headers.size(); 1368 1369 // Only initialize the arch_spec to okay defaults if they're not already set. 1370 // We'll refine this with note data as we parse the notes. 1371 if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) { 1372 llvm::Triple::OSType ostype; 1373 llvm::Triple::OSType spec_ostype; 1374 const uint32_t sub_type = subTypeFromElfHeader(header); 1375 arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type, 1376 header.e_ident[EI_OSABI]); 1377 1378 // Validate if it is ok to remove GetOsFromOSABI. Note, that now the OS is 1379 // determined based on EI_OSABI flag and the info extracted from ELF notes 1380 // (see RefineModuleDetailsFromNote). However in some cases that still 1381 // might be not enough: for example a shared library might not have any 1382 // notes at all and have EI_OSABI flag set to System V, as result the OS 1383 // will be set to UnknownOS. 1384 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype); 1385 spec_ostype = arch_spec.GetTriple().getOS(); 1386 assert(spec_ostype == ostype); 1387 UNUSED_IF_ASSERT_DISABLED(spec_ostype); 1388 } 1389 1390 if (arch_spec.GetMachine() == llvm::Triple::mips || 1391 arch_spec.GetMachine() == llvm::Triple::mipsel || 1392 arch_spec.GetMachine() == llvm::Triple::mips64 || 1393 arch_spec.GetMachine() == llvm::Triple::mips64el) { 1394 switch (header.e_flags & llvm::ELF::EF_MIPS_ARCH_ASE) { 1395 case llvm::ELF::EF_MIPS_MICROMIPS: 1396 arch_spec.SetFlags(ArchSpec::eMIPSAse_micromips); 1397 break; 1398 case llvm::ELF::EF_MIPS_ARCH_ASE_M16: 1399 arch_spec.SetFlags(ArchSpec::eMIPSAse_mips16); 1400 break; 1401 case llvm::ELF::EF_MIPS_ARCH_ASE_MDMX: 1402 arch_spec.SetFlags(ArchSpec::eMIPSAse_mdmx); 1403 break; 1404 default: 1405 break; 1406 } 1407 } 1408 1409 if (arch_spec.GetMachine() == llvm::Triple::arm || 1410 arch_spec.GetMachine() == llvm::Triple::thumb) { 1411 if (header.e_flags & llvm::ELF::EF_ARM_SOFT_FLOAT) 1412 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float); 1413 else if (header.e_flags & llvm::ELF::EF_ARM_VFP_FLOAT) 1414 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float); 1415 } 1416 1417 if (arch_spec.GetMachine() == llvm::Triple::riscv32 || 1418 arch_spec.GetMachine() == llvm::Triple::riscv64) { 1419 uint32_t flags = arch_spec.GetFlags(); 1420 1421 if (header.e_flags & llvm::ELF::EF_RISCV_RVC) 1422 flags |= ArchSpec::eRISCV_rvc; 1423 if (header.e_flags & llvm::ELF::EF_RISCV_RVE) 1424 flags |= ArchSpec::eRISCV_rve; 1425 1426 if ((header.e_flags & llvm::ELF::EF_RISCV_FLOAT_ABI_SINGLE) == 1427 llvm::ELF::EF_RISCV_FLOAT_ABI_SINGLE) 1428 flags |= ArchSpec::eRISCV_float_abi_single; 1429 else if ((header.e_flags & llvm::ELF::EF_RISCV_FLOAT_ABI_DOUBLE) == 1430 llvm::ELF::EF_RISCV_FLOAT_ABI_DOUBLE) 1431 flags |= ArchSpec::eRISCV_float_abi_double; 1432 else if ((header.e_flags & llvm::ELF::EF_RISCV_FLOAT_ABI_QUAD) == 1433 llvm::ELF::EF_RISCV_FLOAT_ABI_QUAD) 1434 flags |= ArchSpec::eRISCV_float_abi_quad; 1435 1436 arch_spec.SetFlags(flags); 1437 } 1438 1439 // If there are no section headers we are done. 1440 if (header.e_shnum == 0) 1441 return 0; 1442 1443 Log *log = GetLog(LLDBLog::Modules); 1444 1445 section_headers.resize(header.e_shnum); 1446 if (section_headers.size() != header.e_shnum) 1447 return 0; 1448 1449 const size_t sh_size = header.e_shnum * header.e_shentsize; 1450 const elf_off sh_offset = header.e_shoff; 1451 DataExtractor sh_data; 1452 if (sh_data.SetData(object_data, sh_offset, sh_size) != sh_size) 1453 return 0; 1454 1455 uint32_t idx; 1456 lldb::offset_t offset; 1457 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) { 1458 if (!section_headers[idx].Parse(sh_data, &offset)) 1459 break; 1460 } 1461 if (idx < section_headers.size()) 1462 section_headers.resize(idx); 1463 1464 const unsigned strtab_idx = header.e_shstrndx; 1465 if (strtab_idx && strtab_idx < section_headers.size()) { 1466 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx]; 1467 const size_t byte_size = sheader.sh_size; 1468 const Elf64_Off offset = sheader.sh_offset; 1469 lldb_private::DataExtractor shstr_data; 1470 1471 if (shstr_data.SetData(object_data, offset, byte_size) == byte_size) { 1472 for (SectionHeaderCollIter I = section_headers.begin(); 1473 I != section_headers.end(); ++I) { 1474 static ConstString g_sect_name_gnu_debuglink(".gnu_debuglink"); 1475 const ELFSectionHeaderInfo &sheader = *I; 1476 const uint64_t section_size = 1477 sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size; 1478 ConstString name(shstr_data.PeekCStr(I->sh_name)); 1479 1480 I->section_name = name; 1481 1482 if (arch_spec.IsMIPS()) { 1483 uint32_t arch_flags = arch_spec.GetFlags(); 1484 DataExtractor data; 1485 if (sheader.sh_type == SHT_MIPS_ABIFLAGS) { 1486 1487 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1488 section_size) == section_size)) { 1489 // MIPS ASE Mask is at offset 12 in MIPS.abiflags section 1490 lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0 1491 arch_flags |= data.GetU32(&offset); 1492 1493 // The floating point ABI is at offset 7 1494 offset = 7; 1495 switch (data.GetU8(&offset)) { 1496 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY: 1497 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY; 1498 break; 1499 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE: 1500 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE; 1501 break; 1502 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE: 1503 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE; 1504 break; 1505 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT: 1506 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT; 1507 break; 1508 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64: 1509 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64; 1510 break; 1511 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX: 1512 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX; 1513 break; 1514 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64: 1515 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64; 1516 break; 1517 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A: 1518 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A; 1519 break; 1520 } 1521 } 1522 } 1523 // Settings appropriate ArchSpec ABI Flags 1524 switch (header.e_flags & llvm::ELF::EF_MIPS_ABI) { 1525 case llvm::ELF::EF_MIPS_ABI_O32: 1526 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32; 1527 break; 1528 case EF_MIPS_ABI_O64: 1529 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64; 1530 break; 1531 case EF_MIPS_ABI_EABI32: 1532 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32; 1533 break; 1534 case EF_MIPS_ABI_EABI64: 1535 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64; 1536 break; 1537 default: 1538 // ABI Mask doesn't cover N32 and N64 ABI. 1539 if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64) 1540 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64; 1541 else if (header.e_flags & llvm::ELF::EF_MIPS_ABI2) 1542 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32; 1543 break; 1544 } 1545 arch_spec.SetFlags(arch_flags); 1546 } 1547 1548 if (arch_spec.GetMachine() == llvm::Triple::arm || 1549 arch_spec.GetMachine() == llvm::Triple::thumb) { 1550 DataExtractor data; 1551 1552 if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 && 1553 data.SetData(object_data, sheader.sh_offset, section_size) == section_size) 1554 ParseARMAttributes(data, section_size, arch_spec); 1555 } 1556 1557 if (name == g_sect_name_gnu_debuglink) { 1558 DataExtractor data; 1559 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1560 section_size) == section_size)) { 1561 lldb::offset_t gnu_debuglink_offset = 0; 1562 gnu_debuglink_file = data.GetCStr(&gnu_debuglink_offset); 1563 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4); 1564 data.GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1); 1565 } 1566 } 1567 1568 // Process ELF note section entries. 1569 bool is_note_header = (sheader.sh_type == SHT_NOTE); 1570 1571 // The section header ".note.android.ident" is stored as a 1572 // PROGBITS type header but it is actually a note header. 1573 static ConstString g_sect_name_android_ident(".note.android.ident"); 1574 if (!is_note_header && name == g_sect_name_android_ident) 1575 is_note_header = true; 1576 1577 if (is_note_header) { 1578 // Allow notes to refine module info. 1579 DataExtractor data; 1580 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1581 section_size) == section_size)) { 1582 Status error = RefineModuleDetailsFromNote(data, arch_spec, uuid); 1583 if (error.Fail()) { 1584 LLDB_LOGF(log, "ObjectFileELF::%s ELF note processing failed: %s", 1585 __FUNCTION__, error.AsCString()); 1586 } 1587 } 1588 } 1589 } 1590 1591 // Make any unknown triple components to be unspecified unknowns. 1592 if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor) 1593 arch_spec.GetTriple().setVendorName(llvm::StringRef()); 1594 if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS) 1595 arch_spec.GetTriple().setOSName(llvm::StringRef()); 1596 1597 return section_headers.size(); 1598 } 1599 } 1600 1601 section_headers.clear(); 1602 return 0; 1603 } 1604 1605 llvm::StringRef 1606 ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const { 1607 size_t pos = symbol_name.find('@'); 1608 return symbol_name.substr(0, pos); 1609 } 1610 1611 // ParseSectionHeaders 1612 size_t ObjectFileELF::ParseSectionHeaders() { 1613 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, 1614 m_gnu_debuglink_file, m_gnu_debuglink_crc, 1615 m_arch_spec); 1616 } 1617 1618 const ObjectFileELF::ELFSectionHeaderInfo * 1619 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) { 1620 if (!ParseSectionHeaders()) 1621 return nullptr; 1622 1623 if (id < m_section_headers.size()) 1624 return &m_section_headers[id]; 1625 1626 return nullptr; 1627 } 1628 1629 lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) { 1630 if (!name || !name[0] || !ParseSectionHeaders()) 1631 return 0; 1632 for (size_t i = 1; i < m_section_headers.size(); ++i) 1633 if (m_section_headers[i].section_name == ConstString(name)) 1634 return i; 1635 return 0; 1636 } 1637 1638 static SectionType GetSectionTypeFromName(llvm::StringRef Name) { 1639 if (Name.consume_front(".debug_")) { 1640 return llvm::StringSwitch<SectionType>(Name) 1641 .Case("abbrev", eSectionTypeDWARFDebugAbbrev) 1642 .Case("abbrev.dwo", eSectionTypeDWARFDebugAbbrevDwo) 1643 .Case("addr", eSectionTypeDWARFDebugAddr) 1644 .Case("aranges", eSectionTypeDWARFDebugAranges) 1645 .Case("cu_index", eSectionTypeDWARFDebugCuIndex) 1646 .Case("frame", eSectionTypeDWARFDebugFrame) 1647 .Case("info", eSectionTypeDWARFDebugInfo) 1648 .Case("info.dwo", eSectionTypeDWARFDebugInfoDwo) 1649 .Cases("line", "line.dwo", eSectionTypeDWARFDebugLine) 1650 .Cases("line_str", "line_str.dwo", eSectionTypeDWARFDebugLineStr) 1651 .Case("loc", eSectionTypeDWARFDebugLoc) 1652 .Case("loc.dwo", eSectionTypeDWARFDebugLocDwo) 1653 .Case("loclists", eSectionTypeDWARFDebugLocLists) 1654 .Case("loclists.dwo", eSectionTypeDWARFDebugLocListsDwo) 1655 .Case("macinfo", eSectionTypeDWARFDebugMacInfo) 1656 .Cases("macro", "macro.dwo", eSectionTypeDWARFDebugMacro) 1657 .Case("names", eSectionTypeDWARFDebugNames) 1658 .Case("pubnames", eSectionTypeDWARFDebugPubNames) 1659 .Case("pubtypes", eSectionTypeDWARFDebugPubTypes) 1660 .Case("ranges", eSectionTypeDWARFDebugRanges) 1661 .Case("rnglists", eSectionTypeDWARFDebugRngLists) 1662 .Case("rnglists.dwo", eSectionTypeDWARFDebugRngListsDwo) 1663 .Case("str", eSectionTypeDWARFDebugStr) 1664 .Case("str.dwo", eSectionTypeDWARFDebugStrDwo) 1665 .Case("str_offsets", eSectionTypeDWARFDebugStrOffsets) 1666 .Case("str_offsets.dwo", eSectionTypeDWARFDebugStrOffsetsDwo) 1667 .Case("tu_index", eSectionTypeDWARFDebugTuIndex) 1668 .Case("types", eSectionTypeDWARFDebugTypes) 1669 .Case("types.dwo", eSectionTypeDWARFDebugTypesDwo) 1670 .Default(eSectionTypeOther); 1671 } 1672 return llvm::StringSwitch<SectionType>(Name) 1673 .Case(".ARM.exidx", eSectionTypeARMexidx) 1674 .Case(".ARM.extab", eSectionTypeARMextab) 1675 .Case(".ctf", eSectionTypeDebug) 1676 .Cases(".data", ".tdata", eSectionTypeData) 1677 .Case(".eh_frame", eSectionTypeEHFrame) 1678 .Case(".gnu_debugaltlink", eSectionTypeDWARFGNUDebugAltLink) 1679 .Case(".gosymtab", eSectionTypeGoSymtab) 1680 .Case(".text", eSectionTypeCode) 1681 .Case(".swift_ast", eSectionTypeSwiftModules) 1682 .Default(eSectionTypeOther); 1683 } 1684 1685 SectionType ObjectFileELF::GetSectionType(const ELFSectionHeaderInfo &H) const { 1686 switch (H.sh_type) { 1687 case SHT_PROGBITS: 1688 if (H.sh_flags & SHF_EXECINSTR) 1689 return eSectionTypeCode; 1690 break; 1691 case SHT_NOBITS: 1692 if (H.sh_flags & SHF_ALLOC) 1693 return eSectionTypeZeroFill; 1694 break; 1695 case SHT_SYMTAB: 1696 return eSectionTypeELFSymbolTable; 1697 case SHT_DYNSYM: 1698 return eSectionTypeELFDynamicSymbols; 1699 case SHT_RELA: 1700 case SHT_REL: 1701 return eSectionTypeELFRelocationEntries; 1702 case SHT_DYNAMIC: 1703 return eSectionTypeELFDynamicLinkInfo; 1704 } 1705 return GetSectionTypeFromName(H.section_name.GetStringRef()); 1706 } 1707 1708 static uint32_t GetTargetByteSize(SectionType Type, const ArchSpec &arch) { 1709 switch (Type) { 1710 case eSectionTypeData: 1711 case eSectionTypeZeroFill: 1712 return arch.GetDataByteSize(); 1713 case eSectionTypeCode: 1714 return arch.GetCodeByteSize(); 1715 default: 1716 return 1; 1717 } 1718 } 1719 1720 static Permissions GetPermissions(const ELFSectionHeader &H) { 1721 Permissions Perm = Permissions(0); 1722 if (H.sh_flags & SHF_ALLOC) 1723 Perm |= ePermissionsReadable; 1724 if (H.sh_flags & SHF_WRITE) 1725 Perm |= ePermissionsWritable; 1726 if (H.sh_flags & SHF_EXECINSTR) 1727 Perm |= ePermissionsExecutable; 1728 return Perm; 1729 } 1730 1731 static Permissions GetPermissions(const ELFProgramHeader &H) { 1732 Permissions Perm = Permissions(0); 1733 if (H.p_flags & PF_R) 1734 Perm |= ePermissionsReadable; 1735 if (H.p_flags & PF_W) 1736 Perm |= ePermissionsWritable; 1737 if (H.p_flags & PF_X) 1738 Perm |= ePermissionsExecutable; 1739 return Perm; 1740 } 1741 1742 namespace { 1743 1744 using VMRange = lldb_private::Range<addr_t, addr_t>; 1745 1746 struct SectionAddressInfo { 1747 SectionSP Segment; 1748 VMRange Range; 1749 }; 1750 1751 // (Unlinked) ELF object files usually have 0 for every section address, meaning 1752 // we need to compute synthetic addresses in order for "file addresses" from 1753 // different sections to not overlap. This class handles that logic. 1754 class VMAddressProvider { 1755 using VMMap = llvm::IntervalMap<addr_t, SectionSP, 4, 1756 llvm::IntervalMapHalfOpenInfo<addr_t>>; 1757 1758 ObjectFile::Type ObjectType; 1759 addr_t NextVMAddress = 0; 1760 VMMap::Allocator Alloc; 1761 VMMap Segments{Alloc}; 1762 VMMap Sections{Alloc}; 1763 lldb_private::Log *Log = GetLog(LLDBLog::Modules); 1764 size_t SegmentCount = 0; 1765 std::string SegmentName; 1766 1767 VMRange GetVMRange(const ELFSectionHeader &H) { 1768 addr_t Address = H.sh_addr; 1769 addr_t Size = H.sh_flags & SHF_ALLOC ? H.sh_size : 0; 1770 1771 // When this is a debug file for relocatable file, the address is all zero 1772 // and thus needs to use accumulate method 1773 if ((ObjectType == ObjectFile::Type::eTypeObjectFile || 1774 (ObjectType == ObjectFile::Type::eTypeDebugInfo && H.sh_addr == 0)) && 1775 Segments.empty() && (H.sh_flags & SHF_ALLOC)) { 1776 NextVMAddress = 1777 llvm::alignTo(NextVMAddress, std::max<addr_t>(H.sh_addralign, 1)); 1778 Address = NextVMAddress; 1779 NextVMAddress += Size; 1780 } 1781 return VMRange(Address, Size); 1782 } 1783 1784 public: 1785 VMAddressProvider(ObjectFile::Type Type, llvm::StringRef SegmentName) 1786 : ObjectType(Type), SegmentName(std::string(SegmentName)) {} 1787 1788 std::string GetNextSegmentName() const { 1789 return llvm::formatv("{0}[{1}]", SegmentName, SegmentCount).str(); 1790 } 1791 1792 std::optional<VMRange> GetAddressInfo(const ELFProgramHeader &H) { 1793 if (H.p_memsz == 0) { 1794 LLDB_LOG(Log, "Ignoring zero-sized {0} segment. Corrupt object file?", 1795 SegmentName); 1796 return std::nullopt; 1797 } 1798 1799 if (Segments.overlaps(H.p_vaddr, H.p_vaddr + H.p_memsz)) { 1800 LLDB_LOG(Log, "Ignoring overlapping {0} segment. Corrupt object file?", 1801 SegmentName); 1802 return std::nullopt; 1803 } 1804 return VMRange(H.p_vaddr, H.p_memsz); 1805 } 1806 1807 std::optional<SectionAddressInfo> GetAddressInfo(const ELFSectionHeader &H) { 1808 VMRange Range = GetVMRange(H); 1809 SectionSP Segment; 1810 auto It = Segments.find(Range.GetRangeBase()); 1811 if ((H.sh_flags & SHF_ALLOC) && It.valid()) { 1812 addr_t MaxSize; 1813 if (It.start() <= Range.GetRangeBase()) { 1814 MaxSize = It.stop() - Range.GetRangeBase(); 1815 Segment = *It; 1816 } else 1817 MaxSize = It.start() - Range.GetRangeBase(); 1818 if (Range.GetByteSize() > MaxSize) { 1819 LLDB_LOG(Log, "Shortening section crossing segment boundaries. " 1820 "Corrupt object file?"); 1821 Range.SetByteSize(MaxSize); 1822 } 1823 } 1824 if (Range.GetByteSize() > 0 && 1825 Sections.overlaps(Range.GetRangeBase(), Range.GetRangeEnd())) { 1826 LLDB_LOG(Log, "Ignoring overlapping section. Corrupt object file?"); 1827 return std::nullopt; 1828 } 1829 if (Segment) 1830 Range.Slide(-Segment->GetFileAddress()); 1831 return SectionAddressInfo{Segment, Range}; 1832 } 1833 1834 void AddSegment(const VMRange &Range, SectionSP Seg) { 1835 Segments.insert(Range.GetRangeBase(), Range.GetRangeEnd(), std::move(Seg)); 1836 ++SegmentCount; 1837 } 1838 1839 void AddSection(SectionAddressInfo Info, SectionSP Sect) { 1840 if (Info.Range.GetByteSize() == 0) 1841 return; 1842 if (Info.Segment) 1843 Info.Range.Slide(Info.Segment->GetFileAddress()); 1844 Sections.insert(Info.Range.GetRangeBase(), Info.Range.GetRangeEnd(), 1845 std::move(Sect)); 1846 } 1847 }; 1848 } 1849 1850 // We have to do this because ELF doesn't have section IDs, and also 1851 // doesn't require section names to be unique. (We use the section index 1852 // for section IDs, but that isn't guaranteed to be the same in separate 1853 // debug images.) 1854 static SectionSP FindMatchingSection(const SectionList §ion_list, 1855 SectionSP section) { 1856 SectionSP sect_sp; 1857 1858 addr_t vm_addr = section->GetFileAddress(); 1859 ConstString name = section->GetName(); 1860 offset_t byte_size = section->GetByteSize(); 1861 bool thread_specific = section->IsThreadSpecific(); 1862 uint32_t permissions = section->GetPermissions(); 1863 uint32_t alignment = section->GetLog2Align(); 1864 1865 for (auto sect : section_list) { 1866 if (sect->GetName() == name && 1867 sect->IsThreadSpecific() == thread_specific && 1868 sect->GetPermissions() == permissions && 1869 sect->GetByteSize() == byte_size && sect->GetFileAddress() == vm_addr && 1870 sect->GetLog2Align() == alignment) { 1871 sect_sp = sect; 1872 break; 1873 } else { 1874 sect_sp = FindMatchingSection(sect->GetChildren(), section); 1875 if (sect_sp) 1876 break; 1877 } 1878 } 1879 1880 return sect_sp; 1881 } 1882 1883 void ObjectFileELF::CreateSections(SectionList &unified_section_list) { 1884 if (m_sections_up) 1885 return; 1886 1887 m_sections_up = std::make_unique<SectionList>(); 1888 VMAddressProvider regular_provider(GetType(), "PT_LOAD"); 1889 VMAddressProvider tls_provider(GetType(), "PT_TLS"); 1890 1891 for (const auto &EnumPHdr : llvm::enumerate(ProgramHeaders())) { 1892 const ELFProgramHeader &PHdr = EnumPHdr.value(); 1893 if (PHdr.p_type != PT_LOAD && PHdr.p_type != PT_TLS) 1894 continue; 1895 1896 VMAddressProvider &provider = 1897 PHdr.p_type == PT_TLS ? tls_provider : regular_provider; 1898 auto InfoOr = provider.GetAddressInfo(PHdr); 1899 if (!InfoOr) 1900 continue; 1901 1902 uint32_t Log2Align = llvm::Log2_64(std::max<elf_xword>(PHdr.p_align, 1)); 1903 SectionSP Segment = std::make_shared<Section>( 1904 GetModule(), this, SegmentID(EnumPHdr.index()), 1905 ConstString(provider.GetNextSegmentName()), eSectionTypeContainer, 1906 InfoOr->GetRangeBase(), InfoOr->GetByteSize(), PHdr.p_offset, 1907 PHdr.p_filesz, Log2Align, /*flags*/ 0); 1908 Segment->SetPermissions(GetPermissions(PHdr)); 1909 Segment->SetIsThreadSpecific(PHdr.p_type == PT_TLS); 1910 m_sections_up->AddSection(Segment); 1911 1912 provider.AddSegment(*InfoOr, std::move(Segment)); 1913 } 1914 1915 ParseSectionHeaders(); 1916 if (m_section_headers.empty()) 1917 return; 1918 1919 for (SectionHeaderCollIter I = std::next(m_section_headers.begin()); 1920 I != m_section_headers.end(); ++I) { 1921 const ELFSectionHeaderInfo &header = *I; 1922 1923 ConstString &name = I->section_name; 1924 const uint64_t file_size = 1925 header.sh_type == SHT_NOBITS ? 0 : header.sh_size; 1926 1927 VMAddressProvider &provider = 1928 header.sh_flags & SHF_TLS ? tls_provider : regular_provider; 1929 auto InfoOr = provider.GetAddressInfo(header); 1930 if (!InfoOr) 1931 continue; 1932 1933 SectionType sect_type = GetSectionType(header); 1934 1935 const uint32_t target_bytes_size = 1936 GetTargetByteSize(sect_type, m_arch_spec); 1937 1938 elf::elf_xword log2align = 1939 (header.sh_addralign == 0) ? 0 : llvm::Log2_64(header.sh_addralign); 1940 1941 SectionSP section_sp(new Section( 1942 InfoOr->Segment, GetModule(), // Module to which this section belongs. 1943 this, // ObjectFile to which this section belongs and should 1944 // read section data from. 1945 SectionIndex(I), // Section ID. 1946 name, // Section name. 1947 sect_type, // Section type. 1948 InfoOr->Range.GetRangeBase(), // VM address. 1949 InfoOr->Range.GetByteSize(), // VM size in bytes of this section. 1950 header.sh_offset, // Offset of this section in the file. 1951 file_size, // Size of the section as found in the file. 1952 log2align, // Alignment of the section 1953 header.sh_flags, // Flags for this section. 1954 target_bytes_size)); // Number of host bytes per target byte 1955 1956 section_sp->SetPermissions(GetPermissions(header)); 1957 section_sp->SetIsThreadSpecific(header.sh_flags & SHF_TLS); 1958 (InfoOr->Segment ? InfoOr->Segment->GetChildren() : *m_sections_up) 1959 .AddSection(section_sp); 1960 provider.AddSection(std::move(*InfoOr), std::move(section_sp)); 1961 } 1962 1963 // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the 1964 // unified section list. 1965 if (GetType() != eTypeDebugInfo) 1966 unified_section_list = *m_sections_up; 1967 1968 // If there's a .gnu_debugdata section, we'll try to read the .symtab that's 1969 // embedded in there and replace the one in the original object file (if any). 1970 // If there's none in the orignal object file, we add it to it. 1971 if (auto gdd_obj_file = GetGnuDebugDataObjectFile()) { 1972 if (auto gdd_objfile_section_list = gdd_obj_file->GetSectionList()) { 1973 if (SectionSP symtab_section_sp = 1974 gdd_objfile_section_list->FindSectionByType( 1975 eSectionTypeELFSymbolTable, true)) { 1976 SectionSP module_section_sp = unified_section_list.FindSectionByType( 1977 eSectionTypeELFSymbolTable, true); 1978 if (module_section_sp) 1979 unified_section_list.ReplaceSection(module_section_sp->GetID(), 1980 symtab_section_sp); 1981 else 1982 unified_section_list.AddSection(symtab_section_sp); 1983 } 1984 } 1985 } 1986 } 1987 1988 std::shared_ptr<ObjectFileELF> ObjectFileELF::GetGnuDebugDataObjectFile() { 1989 if (m_gnu_debug_data_object_file != nullptr) 1990 return m_gnu_debug_data_object_file; 1991 1992 SectionSP section = 1993 GetSectionList()->FindSectionByName(ConstString(".gnu_debugdata")); 1994 if (!section) 1995 return nullptr; 1996 1997 if (!lldb_private::lzma::isAvailable()) { 1998 GetModule()->ReportWarning( 1999 "No LZMA support found for reading .gnu_debugdata section"); 2000 return nullptr; 2001 } 2002 2003 // Uncompress the data 2004 DataExtractor data; 2005 section->GetSectionData(data); 2006 llvm::SmallVector<uint8_t, 0> uncompressedData; 2007 auto err = lldb_private::lzma::uncompress(data.GetData(), uncompressedData); 2008 if (err) { 2009 GetModule()->ReportWarning( 2010 "An error occurred while decompression the section {0}: {1}", 2011 section->GetName().AsCString(), llvm::toString(std::move(err)).c_str()); 2012 return nullptr; 2013 } 2014 2015 // Construct ObjectFileELF object from decompressed buffer 2016 DataBufferSP gdd_data_buf( 2017 new DataBufferHeap(uncompressedData.data(), uncompressedData.size())); 2018 auto fspec = GetFileSpec().CopyByAppendingPathComponent( 2019 llvm::StringRef("gnu_debugdata")); 2020 m_gnu_debug_data_object_file.reset(new ObjectFileELF( 2021 GetModule(), gdd_data_buf, 0, &fspec, 0, gdd_data_buf->GetByteSize())); 2022 2023 // This line is essential; otherwise a breakpoint can be set but not hit. 2024 m_gnu_debug_data_object_file->SetType(ObjectFile::eTypeDebugInfo); 2025 2026 ArchSpec spec = m_gnu_debug_data_object_file->GetArchitecture(); 2027 if (spec && m_gnu_debug_data_object_file->SetModulesArchitecture(spec)) 2028 return m_gnu_debug_data_object_file; 2029 2030 return nullptr; 2031 } 2032 2033 // Find the arm/aarch64 mapping symbol character in the given symbol name. 2034 // Mapping symbols have the form of "$<char>[.<any>]*". Additionally we 2035 // recognize cases when the mapping symbol prefixed by an arbitrary string 2036 // because if a symbol prefix added to each symbol in the object file with 2037 // objcopy then the mapping symbols are also prefixed. 2038 static char FindArmAarch64MappingSymbol(const char *symbol_name) { 2039 if (!symbol_name) 2040 return '\0'; 2041 2042 const char *dollar_pos = ::strchr(symbol_name, '$'); 2043 if (!dollar_pos || dollar_pos[1] == '\0') 2044 return '\0'; 2045 2046 if (dollar_pos[2] == '\0' || dollar_pos[2] == '.') 2047 return dollar_pos[1]; 2048 return '\0'; 2049 } 2050 2051 #define STO_MIPS_ISA (3 << 6) 2052 #define STO_MICROMIPS (2 << 6) 2053 #define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS) 2054 2055 // private 2056 std::pair<unsigned, ObjectFileELF::FileAddressToAddressClassMap> 2057 ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, 2058 SectionList *section_list, const size_t num_symbols, 2059 const DataExtractor &symtab_data, 2060 const DataExtractor &strtab_data) { 2061 ELFSymbol symbol; 2062 lldb::offset_t offset = 0; 2063 // The changes these symbols would make to the class map. We will also update 2064 // m_address_class_map but need to tell the caller what changed because the 2065 // caller may be another object file. 2066 FileAddressToAddressClassMap address_class_map; 2067 2068 static ConstString text_section_name(".text"); 2069 static ConstString init_section_name(".init"); 2070 static ConstString fini_section_name(".fini"); 2071 static ConstString ctors_section_name(".ctors"); 2072 static ConstString dtors_section_name(".dtors"); 2073 2074 static ConstString data_section_name(".data"); 2075 static ConstString rodata_section_name(".rodata"); 2076 static ConstString rodata1_section_name(".rodata1"); 2077 static ConstString data2_section_name(".data1"); 2078 static ConstString bss_section_name(".bss"); 2079 static ConstString opd_section_name(".opd"); // For ppc64 2080 2081 // On Android the oatdata and the oatexec symbols in the oat and odex files 2082 // covers the full .text section what causes issues with displaying unusable 2083 // symbol name to the user and very slow unwinding speed because the 2084 // instruction emulation based unwind plans try to emulate all instructions 2085 // in these symbols. Don't add these symbols to the symbol list as they have 2086 // no use for the debugger and they are causing a lot of trouble. Filtering 2087 // can't be restricted to Android because this special object file don't 2088 // contain the note section specifying the environment to Android but the 2089 // custom extension and file name makes it highly unlikely that this will 2090 // collide with anything else. 2091 llvm::StringRef file_extension = m_file.GetFileNameExtension(); 2092 bool skip_oatdata_oatexec = 2093 file_extension == ".oat" || file_extension == ".odex"; 2094 2095 ArchSpec arch = GetArchitecture(); 2096 ModuleSP module_sp(GetModule()); 2097 SectionList *module_section_list = 2098 module_sp ? module_sp->GetSectionList() : nullptr; 2099 2100 // We might have debug information in a separate object, in which case 2101 // we need to map the sections from that object to the sections in the 2102 // main object during symbol lookup. If we had to compare the sections 2103 // for every single symbol, that would be expensive, so this map is 2104 // used to accelerate the process. 2105 std::unordered_map<lldb::SectionSP, lldb::SectionSP> section_map; 2106 2107 unsigned i; 2108 for (i = 0; i < num_symbols; ++i) { 2109 if (!symbol.Parse(symtab_data, &offset)) 2110 break; 2111 2112 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 2113 if (!symbol_name) 2114 symbol_name = ""; 2115 2116 // No need to add non-section symbols that have no names 2117 if (symbol.getType() != STT_SECTION && 2118 (symbol_name == nullptr || symbol_name[0] == '\0')) 2119 continue; 2120 2121 // Skipping oatdata and oatexec sections if it is requested. See details 2122 // above the definition of skip_oatdata_oatexec for the reasons. 2123 if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 || 2124 ::strcmp(symbol_name, "oatexec") == 0)) 2125 continue; 2126 2127 SectionSP symbol_section_sp; 2128 SymbolType symbol_type = eSymbolTypeInvalid; 2129 Elf64_Half shndx = symbol.st_shndx; 2130 2131 switch (shndx) { 2132 case SHN_ABS: 2133 symbol_type = eSymbolTypeAbsolute; 2134 break; 2135 case SHN_UNDEF: 2136 symbol_type = eSymbolTypeUndefined; 2137 break; 2138 default: 2139 symbol_section_sp = section_list->FindSectionByID(shndx); 2140 break; 2141 } 2142 2143 // If a symbol is undefined do not process it further even if it has a STT 2144 // type 2145 if (symbol_type != eSymbolTypeUndefined) { 2146 switch (symbol.getType()) { 2147 default: 2148 case STT_NOTYPE: 2149 // The symbol's type is not specified. 2150 break; 2151 2152 case STT_OBJECT: 2153 // The symbol is associated with a data object, such as a variable, an 2154 // array, etc. 2155 symbol_type = eSymbolTypeData; 2156 break; 2157 2158 case STT_FUNC: 2159 // The symbol is associated with a function or other executable code. 2160 symbol_type = eSymbolTypeCode; 2161 break; 2162 2163 case STT_SECTION: 2164 // The symbol is associated with a section. Symbol table entries of 2165 // this type exist primarily for relocation and normally have STB_LOCAL 2166 // binding. 2167 break; 2168 2169 case STT_FILE: 2170 // Conventionally, the symbol's name gives the name of the source file 2171 // associated with the object file. A file symbol has STB_LOCAL 2172 // binding, its section index is SHN_ABS, and it precedes the other 2173 // STB_LOCAL symbols for the file, if it is present. 2174 symbol_type = eSymbolTypeSourceFile; 2175 break; 2176 2177 case STT_GNU_IFUNC: 2178 // The symbol is associated with an indirect function. The actual 2179 // function will be resolved if it is referenced. 2180 symbol_type = eSymbolTypeResolver; 2181 break; 2182 } 2183 } 2184 2185 if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION) { 2186 if (symbol_section_sp) { 2187 ConstString sect_name = symbol_section_sp->GetName(); 2188 if (sect_name == text_section_name || sect_name == init_section_name || 2189 sect_name == fini_section_name || sect_name == ctors_section_name || 2190 sect_name == dtors_section_name) { 2191 symbol_type = eSymbolTypeCode; 2192 } else if (sect_name == data_section_name || 2193 sect_name == data2_section_name || 2194 sect_name == rodata_section_name || 2195 sect_name == rodata1_section_name || 2196 sect_name == bss_section_name) { 2197 symbol_type = eSymbolTypeData; 2198 } 2199 } 2200 } 2201 2202 int64_t symbol_value_offset = 0; 2203 uint32_t additional_flags = 0; 2204 2205 if (arch.IsValid()) { 2206 if (arch.GetMachine() == llvm::Triple::arm) { 2207 if (symbol.getBinding() == STB_LOCAL) { 2208 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); 2209 if (symbol_type == eSymbolTypeCode) { 2210 switch (mapping_symbol) { 2211 case 'a': 2212 // $a[.<any>]* - marks an ARM instruction sequence 2213 address_class_map[symbol.st_value] = AddressClass::eCode; 2214 break; 2215 case 'b': 2216 case 't': 2217 // $b[.<any>]* - marks a THUMB BL instruction sequence 2218 // $t[.<any>]* - marks a THUMB instruction sequence 2219 address_class_map[symbol.st_value] = 2220 AddressClass::eCodeAlternateISA; 2221 break; 2222 case 'd': 2223 // $d[.<any>]* - marks a data item sequence (e.g. lit pool) 2224 address_class_map[symbol.st_value] = AddressClass::eData; 2225 break; 2226 } 2227 } 2228 if (mapping_symbol) 2229 continue; 2230 } 2231 } else if (arch.GetMachine() == llvm::Triple::aarch64) { 2232 if (symbol.getBinding() == STB_LOCAL) { 2233 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); 2234 if (symbol_type == eSymbolTypeCode) { 2235 switch (mapping_symbol) { 2236 case 'x': 2237 // $x[.<any>]* - marks an A64 instruction sequence 2238 address_class_map[symbol.st_value] = AddressClass::eCode; 2239 break; 2240 case 'd': 2241 // $d[.<any>]* - marks a data item sequence (e.g. lit pool) 2242 address_class_map[symbol.st_value] = AddressClass::eData; 2243 break; 2244 } 2245 } 2246 if (mapping_symbol) 2247 continue; 2248 } 2249 } 2250 2251 if (arch.GetMachine() == llvm::Triple::arm) { 2252 if (symbol_type == eSymbolTypeCode) { 2253 if (symbol.st_value & 1) { 2254 // Subtracting 1 from the address effectively unsets the low order 2255 // bit, which results in the address actually pointing to the 2256 // beginning of the symbol. This delta will be used below in 2257 // conjunction with symbol.st_value to produce the final 2258 // symbol_value that we store in the symtab. 2259 symbol_value_offset = -1; 2260 address_class_map[symbol.st_value ^ 1] = 2261 AddressClass::eCodeAlternateISA; 2262 } else { 2263 // This address is ARM 2264 address_class_map[symbol.st_value] = AddressClass::eCode; 2265 } 2266 } 2267 } 2268 2269 /* 2270 * MIPS: 2271 * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for 2272 * MIPS). 2273 * This allows processor to switch between microMIPS and MIPS without any 2274 * need 2275 * for special mode-control register. However, apart from .debug_line, 2276 * none of 2277 * the ELF/DWARF sections set the ISA bit (for symbol or section). Use 2278 * st_other 2279 * flag to check whether the symbol is microMIPS and then set the address 2280 * class 2281 * accordingly. 2282 */ 2283 if (arch.IsMIPS()) { 2284 if (IS_MICROMIPS(symbol.st_other)) 2285 address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA; 2286 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) { 2287 symbol.st_value = symbol.st_value & (~1ull); 2288 address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA; 2289 } else { 2290 if (symbol_type == eSymbolTypeCode) 2291 address_class_map[symbol.st_value] = AddressClass::eCode; 2292 else if (symbol_type == eSymbolTypeData) 2293 address_class_map[symbol.st_value] = AddressClass::eData; 2294 else 2295 address_class_map[symbol.st_value] = AddressClass::eUnknown; 2296 } 2297 } 2298 } 2299 2300 // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB 2301 // symbols. See above for more details. 2302 uint64_t symbol_value = symbol.st_value + symbol_value_offset; 2303 2304 if (symbol_section_sp && 2305 CalculateType() != ObjectFile::Type::eTypeObjectFile) 2306 symbol_value -= symbol_section_sp->GetFileAddress(); 2307 2308 if (symbol_section_sp && module_section_list && 2309 module_section_list != section_list) { 2310 auto section_it = section_map.find(symbol_section_sp); 2311 if (section_it == section_map.end()) { 2312 section_it = section_map 2313 .emplace(symbol_section_sp, 2314 FindMatchingSection(*module_section_list, 2315 symbol_section_sp)) 2316 .first; 2317 } 2318 if (section_it->second) 2319 symbol_section_sp = section_it->second; 2320 } 2321 2322 bool is_global = symbol.getBinding() == STB_GLOBAL; 2323 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags; 2324 llvm::StringRef symbol_ref(symbol_name); 2325 2326 // Symbol names may contain @VERSION suffixes. Find those and strip them 2327 // temporarily. 2328 size_t version_pos = symbol_ref.find('@'); 2329 bool has_suffix = version_pos != llvm::StringRef::npos; 2330 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos); 2331 Mangled mangled(symbol_bare); 2332 2333 // Now append the suffix back to mangled and unmangled names. Only do it if 2334 // the demangling was successful (string is not empty). 2335 if (has_suffix) { 2336 llvm::StringRef suffix = symbol_ref.substr(version_pos); 2337 2338 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef(); 2339 if (!mangled_name.empty()) 2340 mangled.SetMangledName(ConstString((mangled_name + suffix).str())); 2341 2342 ConstString demangled = mangled.GetDemangledName(); 2343 llvm::StringRef demangled_name = demangled.GetStringRef(); 2344 if (!demangled_name.empty()) 2345 mangled.SetDemangledName(ConstString((demangled_name + suffix).str())); 2346 } 2347 2348 // In ELF all symbol should have a valid size but it is not true for some 2349 // function symbols coming from hand written assembly. As none of the 2350 // function symbol should have 0 size we try to calculate the size for 2351 // these symbols in the symtab with saying that their original size is not 2352 // valid. 2353 bool symbol_size_valid = 2354 symbol.st_size != 0 || symbol.getType() != STT_FUNC; 2355 2356 bool is_trampoline = false; 2357 if (arch.IsValid() && (arch.GetMachine() == llvm::Triple::aarch64)) { 2358 // On AArch64, trampolines are registered as code. 2359 // If we detect a trampoline (which starts with __AArch64ADRPThunk_ or 2360 // __AArch64AbsLongThunk_) we register the symbol as a trampoline. This 2361 // way we will be able to detect the trampoline when we step in a function 2362 // and step through the trampoline. 2363 if (symbol_type == eSymbolTypeCode) { 2364 llvm::StringRef trampoline_name = mangled.GetName().GetStringRef(); 2365 if (trampoline_name.starts_with("__AArch64ADRPThunk_") || 2366 trampoline_name.starts_with("__AArch64AbsLongThunk_")) { 2367 symbol_type = eSymbolTypeTrampoline; 2368 is_trampoline = true; 2369 } 2370 } 2371 } 2372 2373 Symbol dc_symbol( 2374 i + start_id, // ID is the original symbol table index. 2375 mangled, 2376 symbol_type, // Type of this symbol 2377 is_global, // Is this globally visible? 2378 false, // Is this symbol debug info? 2379 is_trampoline, // Is this symbol a trampoline? 2380 false, // Is this symbol artificial? 2381 AddressRange(symbol_section_sp, // Section in which this symbol is 2382 // defined or null. 2383 symbol_value, // Offset in section or symbol value. 2384 symbol.st_size), // Size in bytes of this symbol. 2385 symbol_size_valid, // Symbol size is valid 2386 has_suffix, // Contains linker annotations? 2387 flags); // Symbol flags. 2388 if (symbol.getBinding() == STB_WEAK) 2389 dc_symbol.SetIsWeak(true); 2390 symtab->AddSymbol(dc_symbol); 2391 } 2392 2393 m_address_class_map.merge(address_class_map); 2394 return {i, address_class_map}; 2395 } 2396 2397 std::pair<unsigned, ObjectFileELF::FileAddressToAddressClassMap> 2398 ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, 2399 lldb_private::Section *symtab) { 2400 if (symtab->GetObjectFile() != this) { 2401 // If the symbol table section is owned by a different object file, have it 2402 // do the parsing. 2403 ObjectFileELF *obj_file_elf = 2404 static_cast<ObjectFileELF *>(symtab->GetObjectFile()); 2405 auto [num_symbols, address_class_map] = 2406 obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab); 2407 2408 // The other object file returned the changes it made to its address 2409 // class map, make the same changes to ours. 2410 m_address_class_map.merge(address_class_map); 2411 2412 return {num_symbols, address_class_map}; 2413 } 2414 2415 // Get section list for this object file. 2416 SectionList *section_list = m_sections_up.get(); 2417 if (!section_list) 2418 return {}; 2419 2420 user_id_t symtab_id = symtab->GetID(); 2421 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id); 2422 assert(symtab_hdr->sh_type == SHT_SYMTAB || 2423 symtab_hdr->sh_type == SHT_DYNSYM); 2424 2425 // sh_link: section header index of associated string table. 2426 user_id_t strtab_id = symtab_hdr->sh_link; 2427 Section *strtab = section_list->FindSectionByID(strtab_id).get(); 2428 2429 if (symtab && strtab) { 2430 assert(symtab->GetObjectFile() == this); 2431 assert(strtab->GetObjectFile() == this); 2432 2433 DataExtractor symtab_data; 2434 DataExtractor strtab_data; 2435 if (ReadSectionData(symtab, symtab_data) && 2436 ReadSectionData(strtab, strtab_data)) { 2437 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize; 2438 2439 return ParseSymbols(symbol_table, start_id, section_list, num_symbols, 2440 symtab_data, strtab_data); 2441 } 2442 } 2443 2444 return {0, {}}; 2445 } 2446 2447 size_t ObjectFileELF::ParseDynamicSymbols() { 2448 if (m_dynamic_symbols.size()) 2449 return m_dynamic_symbols.size(); 2450 2451 std::optional<DataExtractor> dynamic_data = GetDynamicData(); 2452 if (!dynamic_data) 2453 return 0; 2454 2455 ELFDynamicWithName e; 2456 lldb::offset_t cursor = 0; 2457 while (e.symbol.Parse(*dynamic_data, &cursor)) { 2458 m_dynamic_symbols.push_back(e); 2459 if (e.symbol.d_tag == DT_NULL) 2460 break; 2461 } 2462 if (std::optional<DataExtractor> dynstr_data = GetDynstrData()) { 2463 for (ELFDynamicWithName &entry : m_dynamic_symbols) { 2464 switch (entry.symbol.d_tag) { 2465 case DT_NEEDED: 2466 case DT_SONAME: 2467 case DT_RPATH: 2468 case DT_RUNPATH: 2469 case DT_AUXILIARY: 2470 case DT_FILTER: { 2471 lldb::offset_t cursor = entry.symbol.d_val; 2472 const char *name = dynstr_data->GetCStr(&cursor); 2473 if (name) 2474 entry.name = std::string(name); 2475 break; 2476 } 2477 default: 2478 break; 2479 } 2480 } 2481 } 2482 return m_dynamic_symbols.size(); 2483 } 2484 2485 const ELFDynamic *ObjectFileELF::FindDynamicSymbol(unsigned tag) { 2486 if (!ParseDynamicSymbols()) 2487 return nullptr; 2488 for (const auto &entry : m_dynamic_symbols) { 2489 if (entry.symbol.d_tag == tag) 2490 return &entry.symbol; 2491 } 2492 return nullptr; 2493 } 2494 2495 unsigned ObjectFileELF::PLTRelocationType() { 2496 // DT_PLTREL 2497 // This member specifies the type of relocation entry to which the 2498 // procedure linkage table refers. The d_val member holds DT_REL or 2499 // DT_RELA, as appropriate. All relocations in a procedure linkage table 2500 // must use the same relocation. 2501 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL); 2502 2503 if (symbol) 2504 return symbol->d_val; 2505 2506 return 0; 2507 } 2508 2509 // Returns the size of the normal plt entries and the offset of the first 2510 // normal plt entry. The 0th entry in the plt table is usually a resolution 2511 // entry which have different size in some architectures then the rest of the 2512 // plt entries. 2513 static std::pair<uint64_t, uint64_t> 2514 GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr, 2515 const ELFSectionHeader *plt_hdr) { 2516 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2517 2518 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 2519 // 16 bytes. So round the entsize up by the alignment if addralign is set. 2520 elf_xword plt_entsize = 2521 plt_hdr->sh_addralign 2522 ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign) 2523 : plt_hdr->sh_entsize; 2524 2525 // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly. 2526 // PLT entries relocation code in general requires multiple instruction and 2527 // should be greater than 4 bytes in most cases. Try to guess correct size 2528 // just in case. 2529 if (plt_entsize <= 4) { 2530 // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the 2531 // size of the plt entries based on the number of entries and the size of 2532 // the plt section with the assumption that the size of the 0th entry is at 2533 // least as big as the size of the normal entries and it isn't much bigger 2534 // then that. 2535 if (plt_hdr->sh_addralign) 2536 plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign / 2537 (num_relocations + 1) * plt_hdr->sh_addralign; 2538 else 2539 plt_entsize = plt_hdr->sh_size / (num_relocations + 1); 2540 } 2541 2542 elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize; 2543 2544 return std::make_pair(plt_entsize, plt_offset); 2545 } 2546 2547 static unsigned ParsePLTRelocations( 2548 Symtab *symbol_table, user_id_t start_id, unsigned rel_type, 2549 const ELFHeader *hdr, const ELFSectionHeader *rel_hdr, 2550 const ELFSectionHeader *plt_hdr, const ELFSectionHeader *sym_hdr, 2551 const lldb::SectionSP &plt_section_sp, DataExtractor &rel_data, 2552 DataExtractor &symtab_data, DataExtractor &strtab_data) { 2553 ELFRelocation rel(rel_type); 2554 ELFSymbol symbol; 2555 lldb::offset_t offset = 0; 2556 2557 uint64_t plt_offset, plt_entsize; 2558 std::tie(plt_entsize, plt_offset) = 2559 GetPltEntrySizeAndOffset(rel_hdr, plt_hdr); 2560 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2561 2562 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); 2563 reloc_info_fn reloc_type; 2564 reloc_info_fn reloc_symbol; 2565 2566 if (hdr->Is32Bit()) { 2567 reloc_type = ELFRelocation::RelocType32; 2568 reloc_symbol = ELFRelocation::RelocSymbol32; 2569 } else { 2570 reloc_type = ELFRelocation::RelocType64; 2571 reloc_symbol = ELFRelocation::RelocSymbol64; 2572 } 2573 2574 unsigned slot_type = hdr->GetRelocationJumpSlotType(); 2575 unsigned i; 2576 for (i = 0; i < num_relocations; ++i) { 2577 if (!rel.Parse(rel_data, &offset)) 2578 break; 2579 2580 if (reloc_type(rel) != slot_type) 2581 continue; 2582 2583 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize; 2584 if (!symbol.Parse(symtab_data, &symbol_offset)) 2585 break; 2586 2587 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 2588 uint64_t plt_index = plt_offset + i * plt_entsize; 2589 2590 Symbol jump_symbol( 2591 i + start_id, // Symbol table index 2592 symbol_name, // symbol name. 2593 eSymbolTypeTrampoline, // Type of this symbol 2594 false, // Is this globally visible? 2595 false, // Is this symbol debug info? 2596 true, // Is this symbol a trampoline? 2597 true, // Is this symbol artificial? 2598 plt_section_sp, // Section in which this symbol is defined or null. 2599 plt_index, // Offset in section or symbol value. 2600 plt_entsize, // Size in bytes of this symbol. 2601 true, // Size is valid 2602 false, // Contains linker annotations? 2603 0); // Symbol flags. 2604 2605 symbol_table->AddSymbol(jump_symbol); 2606 } 2607 2608 return i; 2609 } 2610 2611 unsigned 2612 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, user_id_t start_id, 2613 const ELFSectionHeaderInfo *rel_hdr, 2614 user_id_t rel_id) { 2615 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL); 2616 2617 // The link field points to the associated symbol table. 2618 user_id_t symtab_id = rel_hdr->sh_link; 2619 2620 // If the link field doesn't point to the appropriate symbol name table then 2621 // try to find it by name as some compiler don't fill in the link fields. 2622 if (!symtab_id) 2623 symtab_id = GetSectionIndexByName(".dynsym"); 2624 2625 // Get PLT section. We cannot use rel_hdr->sh_info, since current linkers 2626 // point that to the .got.plt or .got section instead of .plt. 2627 user_id_t plt_id = GetSectionIndexByName(".plt"); 2628 2629 if (!symtab_id || !plt_id) 2630 return 0; 2631 2632 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id); 2633 if (!plt_hdr) 2634 return 0; 2635 2636 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id); 2637 if (!sym_hdr) 2638 return 0; 2639 2640 SectionList *section_list = m_sections_up.get(); 2641 if (!section_list) 2642 return 0; 2643 2644 Section *rel_section = section_list->FindSectionByID(rel_id).get(); 2645 if (!rel_section) 2646 return 0; 2647 2648 SectionSP plt_section_sp(section_list->FindSectionByID(plt_id)); 2649 if (!plt_section_sp) 2650 return 0; 2651 2652 Section *symtab = section_list->FindSectionByID(symtab_id).get(); 2653 if (!symtab) 2654 return 0; 2655 2656 // sh_link points to associated string table. 2657 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link).get(); 2658 if (!strtab) 2659 return 0; 2660 2661 DataExtractor rel_data; 2662 if (!ReadSectionData(rel_section, rel_data)) 2663 return 0; 2664 2665 DataExtractor symtab_data; 2666 if (!ReadSectionData(symtab, symtab_data)) 2667 return 0; 2668 2669 DataExtractor strtab_data; 2670 if (!ReadSectionData(strtab, strtab_data)) 2671 return 0; 2672 2673 unsigned rel_type = PLTRelocationType(); 2674 if (!rel_type) 2675 return 0; 2676 2677 return ParsePLTRelocations(symbol_table, start_id, rel_type, &m_header, 2678 rel_hdr, plt_hdr, sym_hdr, plt_section_sp, 2679 rel_data, symtab_data, strtab_data); 2680 } 2681 2682 static void ApplyELF64ABS64Relocation(Symtab *symtab, ELFRelocation &rel, 2683 DataExtractor &debug_data, 2684 Section *rel_section) { 2685 Symbol *symbol = symtab->FindSymbolByID(ELFRelocation::RelocSymbol64(rel)); 2686 if (symbol) { 2687 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2688 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2689 // ObjectFileELF creates a WritableDataBuffer in CreateInstance. 2690 WritableDataBuffer *data_buffer = 2691 llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); 2692 uint64_t *dst = reinterpret_cast<uint64_t *>( 2693 data_buffer->GetBytes() + rel_section->GetFileOffset() + 2694 ELFRelocation::RelocOffset64(rel)); 2695 uint64_t val_offset = value + ELFRelocation::RelocAddend64(rel); 2696 memcpy(dst, &val_offset, sizeof(uint64_t)); 2697 } 2698 } 2699 2700 static void ApplyELF64ABS32Relocation(Symtab *symtab, ELFRelocation &rel, 2701 DataExtractor &debug_data, 2702 Section *rel_section, bool is_signed) { 2703 Symbol *symbol = symtab->FindSymbolByID(ELFRelocation::RelocSymbol64(rel)); 2704 if (symbol) { 2705 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2706 value += ELFRelocation::RelocAddend32(rel); 2707 if ((!is_signed && (value > UINT32_MAX)) || 2708 (is_signed && 2709 ((int64_t)value > INT32_MAX || (int64_t)value < INT32_MIN))) { 2710 Log *log = GetLog(LLDBLog::Modules); 2711 LLDB_LOGF(log, "Failed to apply debug info relocations"); 2712 return; 2713 } 2714 uint32_t truncated_addr = (value & 0xFFFFFFFF); 2715 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2716 // ObjectFileELF creates a WritableDataBuffer in CreateInstance. 2717 WritableDataBuffer *data_buffer = 2718 llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); 2719 uint32_t *dst = reinterpret_cast<uint32_t *>( 2720 data_buffer->GetBytes() + rel_section->GetFileOffset() + 2721 ELFRelocation::RelocOffset32(rel)); 2722 memcpy(dst, &truncated_addr, sizeof(uint32_t)); 2723 } 2724 } 2725 2726 static void ApplyELF32ABS32RelRelocation(Symtab *symtab, ELFRelocation &rel, 2727 DataExtractor &debug_data, 2728 Section *rel_section) { 2729 Log *log = GetLog(LLDBLog::Modules); 2730 Symbol *symbol = symtab->FindSymbolByID(ELFRelocation::RelocSymbol32(rel)); 2731 if (symbol) { 2732 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2733 if (value == LLDB_INVALID_ADDRESS) { 2734 const char *name = symbol->GetName().GetCString(); 2735 LLDB_LOGF(log, "Debug info symbol invalid: %s", name); 2736 return; 2737 } 2738 assert(llvm::isUInt<32>(value) && "Valid addresses are 32-bit"); 2739 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2740 // ObjectFileELF creates a WritableDataBuffer in CreateInstance. 2741 WritableDataBuffer *data_buffer = 2742 llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); 2743 uint8_t *dst = data_buffer->GetBytes() + rel_section->GetFileOffset() + 2744 ELFRelocation::RelocOffset32(rel); 2745 // Implicit addend is stored inline as a signed value. 2746 int32_t addend; 2747 memcpy(&addend, dst, sizeof(int32_t)); 2748 // The sum must be positive. This extra check prevents UB from overflow in 2749 // the actual range check below. 2750 if (addend < 0 && static_cast<uint32_t>(-addend) > value) { 2751 LLDB_LOGF(log, "Debug info relocation overflow: 0x%" PRIx64, 2752 static_cast<int64_t>(value) + addend); 2753 return; 2754 } 2755 if (!llvm::isUInt<32>(value + addend)) { 2756 LLDB_LOGF(log, "Debug info relocation out of range: 0x%" PRIx64, value); 2757 return; 2758 } 2759 uint32_t addr = value + addend; 2760 memcpy(dst, &addr, sizeof(uint32_t)); 2761 } 2762 } 2763 2764 unsigned ObjectFileELF::ApplyRelocations( 2765 Symtab *symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr, 2766 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr, 2767 DataExtractor &rel_data, DataExtractor &symtab_data, 2768 DataExtractor &debug_data, Section *rel_section) { 2769 ELFRelocation rel(rel_hdr->sh_type); 2770 lldb::addr_t offset = 0; 2771 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2772 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); 2773 reloc_info_fn reloc_type; 2774 reloc_info_fn reloc_symbol; 2775 2776 if (hdr->Is32Bit()) { 2777 reloc_type = ELFRelocation::RelocType32; 2778 reloc_symbol = ELFRelocation::RelocSymbol32; 2779 } else { 2780 reloc_type = ELFRelocation::RelocType64; 2781 reloc_symbol = ELFRelocation::RelocSymbol64; 2782 } 2783 2784 for (unsigned i = 0; i < num_relocations; ++i) { 2785 if (!rel.Parse(rel_data, &offset)) { 2786 GetModule()->ReportError(".rel{0}[{1:d}] failed to parse relocation", 2787 rel_section->GetName().AsCString(), i); 2788 break; 2789 } 2790 Symbol *symbol = nullptr; 2791 2792 if (hdr->Is32Bit()) { 2793 switch (hdr->e_machine) { 2794 case llvm::ELF::EM_ARM: 2795 switch (reloc_type(rel)) { 2796 case R_ARM_ABS32: 2797 ApplyELF32ABS32RelRelocation(symtab, rel, debug_data, rel_section); 2798 break; 2799 case R_ARM_REL32: 2800 GetModule()->ReportError("unsupported AArch32 relocation:" 2801 " .rel{0}[{1}], type {2}", 2802 rel_section->GetName().AsCString(), i, 2803 reloc_type(rel)); 2804 break; 2805 default: 2806 assert(false && "unexpected relocation type"); 2807 } 2808 break; 2809 case llvm::ELF::EM_386: 2810 switch (reloc_type(rel)) { 2811 case R_386_32: 2812 symbol = symtab->FindSymbolByID(reloc_symbol(rel)); 2813 if (symbol) { 2814 addr_t f_offset = 2815 rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel); 2816 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2817 // ObjectFileELF creates a WritableDataBuffer in CreateInstance. 2818 WritableDataBuffer *data_buffer = 2819 llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); 2820 uint32_t *dst = reinterpret_cast<uint32_t *>( 2821 data_buffer->GetBytes() + f_offset); 2822 2823 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2824 if (rel.IsRela()) { 2825 value += ELFRelocation::RelocAddend32(rel); 2826 } else { 2827 value += *dst; 2828 } 2829 *dst = value; 2830 } else { 2831 GetModule()->ReportError(".rel{0}[{1}] unknown symbol id: {2:d}", 2832 rel_section->GetName().AsCString(), i, 2833 reloc_symbol(rel)); 2834 } 2835 break; 2836 case R_386_NONE: 2837 case R_386_PC32: 2838 GetModule()->ReportError("unsupported i386 relocation:" 2839 " .rel{0}[{1}], type {2}", 2840 rel_section->GetName().AsCString(), i, 2841 reloc_type(rel)); 2842 break; 2843 default: 2844 assert(false && "unexpected relocation type"); 2845 break; 2846 } 2847 break; 2848 default: 2849 GetModule()->ReportError("unsupported 32-bit ELF machine arch: {0}", hdr->e_machine); 2850 break; 2851 } 2852 } else { 2853 switch (hdr->e_machine) { 2854 case llvm::ELF::EM_AARCH64: 2855 switch (reloc_type(rel)) { 2856 case R_AARCH64_ABS64: 2857 ApplyELF64ABS64Relocation(symtab, rel, debug_data, rel_section); 2858 break; 2859 case R_AARCH64_ABS32: 2860 ApplyELF64ABS32Relocation(symtab, rel, debug_data, rel_section, true); 2861 break; 2862 default: 2863 assert(false && "unexpected relocation type"); 2864 } 2865 break; 2866 case llvm::ELF::EM_LOONGARCH: 2867 switch (reloc_type(rel)) { 2868 case R_LARCH_64: 2869 ApplyELF64ABS64Relocation(symtab, rel, debug_data, rel_section); 2870 break; 2871 case R_LARCH_32: 2872 ApplyELF64ABS32Relocation(symtab, rel, debug_data, rel_section, true); 2873 break; 2874 default: 2875 assert(false && "unexpected relocation type"); 2876 } 2877 break; 2878 case llvm::ELF::EM_X86_64: 2879 switch (reloc_type(rel)) { 2880 case R_X86_64_64: 2881 ApplyELF64ABS64Relocation(symtab, rel, debug_data, rel_section); 2882 break; 2883 case R_X86_64_32: 2884 ApplyELF64ABS32Relocation(symtab, rel, debug_data, rel_section, 2885 false); 2886 break; 2887 case R_X86_64_32S: 2888 ApplyELF64ABS32Relocation(symtab, rel, debug_data, rel_section, true); 2889 break; 2890 case R_X86_64_PC32: 2891 default: 2892 assert(false && "unexpected relocation type"); 2893 } 2894 break; 2895 default: 2896 GetModule()->ReportError("unsupported 64-bit ELF machine arch: {0}", hdr->e_machine); 2897 break; 2898 } 2899 } 2900 } 2901 2902 return 0; 2903 } 2904 2905 unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, 2906 user_id_t rel_id, 2907 lldb_private::Symtab *thetab) { 2908 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL); 2909 2910 // Parse in the section list if needed. 2911 SectionList *section_list = GetSectionList(); 2912 if (!section_list) 2913 return 0; 2914 2915 user_id_t symtab_id = rel_hdr->sh_link; 2916 user_id_t debug_id = rel_hdr->sh_info; 2917 2918 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id); 2919 if (!symtab_hdr) 2920 return 0; 2921 2922 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id); 2923 if (!debug_hdr) 2924 return 0; 2925 2926 Section *rel = section_list->FindSectionByID(rel_id).get(); 2927 if (!rel) 2928 return 0; 2929 2930 Section *symtab = section_list->FindSectionByID(symtab_id).get(); 2931 if (!symtab) 2932 return 0; 2933 2934 Section *debug = section_list->FindSectionByID(debug_id).get(); 2935 if (!debug) 2936 return 0; 2937 2938 DataExtractor rel_data; 2939 DataExtractor symtab_data; 2940 DataExtractor debug_data; 2941 2942 if (GetData(rel->GetFileOffset(), rel->GetFileSize(), rel_data) && 2943 GetData(symtab->GetFileOffset(), symtab->GetFileSize(), symtab_data) && 2944 GetData(debug->GetFileOffset(), debug->GetFileSize(), debug_data)) { 2945 ApplyRelocations(thetab, &m_header, rel_hdr, symtab_hdr, debug_hdr, 2946 rel_data, symtab_data, debug_data, debug); 2947 } 2948 2949 return 0; 2950 } 2951 2952 void ObjectFileELF::ParseSymtab(Symtab &lldb_symtab) { 2953 ModuleSP module_sp(GetModule()); 2954 if (!module_sp) 2955 return; 2956 2957 Progress progress("Parsing symbol table", 2958 m_file.GetFilename().AsCString("<Unknown>")); 2959 ElapsedTime elapsed(module_sp->GetSymtabParseTime()); 2960 2961 // We always want to use the main object file so we (hopefully) only have one 2962 // cached copy of our symtab, dynamic sections, etc. 2963 ObjectFile *module_obj_file = module_sp->GetObjectFile(); 2964 if (module_obj_file && module_obj_file != this) 2965 return module_obj_file->ParseSymtab(lldb_symtab); 2966 2967 SectionList *section_list = module_sp->GetSectionList(); 2968 if (!section_list) 2969 return; 2970 2971 uint64_t symbol_id = 0; 2972 2973 // Sharable objects and dynamic executables usually have 2 distinct symbol 2974 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a 2975 // smaller version of the symtab that only contains global symbols. The 2976 // information found in the dynsym is therefore also found in the symtab, 2977 // while the reverse is not necessarily true. 2978 Section *symtab = 2979 section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get(); 2980 if (symtab) { 2981 auto [num_symbols, address_class_map] = 2982 ParseSymbolTable(&lldb_symtab, symbol_id, symtab); 2983 m_address_class_map.merge(address_class_map); 2984 symbol_id += num_symbols; 2985 } 2986 2987 // The symtab section is non-allocable and can be stripped, while the 2988 // .dynsym section which should always be always be there. To support the 2989 // minidebuginfo case we parse .dynsym when there's a .gnu_debuginfo 2990 // section, nomatter if .symtab was already parsed or not. This is because 2991 // minidebuginfo normally removes the .symtab symbols which have their 2992 // matching .dynsym counterparts. 2993 if (!symtab || 2994 GetSectionList()->FindSectionByName(ConstString(".gnu_debugdata"))) { 2995 Section *dynsym = 2996 section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true) 2997 .get(); 2998 if (dynsym) { 2999 auto [num_symbols, address_class_map] = 3000 ParseSymbolTable(&lldb_symtab, symbol_id, dynsym); 3001 symbol_id += num_symbols; 3002 m_address_class_map.merge(address_class_map); 3003 } 3004 } 3005 3006 // DT_JMPREL 3007 // If present, this entry's d_ptr member holds the address of 3008 // relocation 3009 // entries associated solely with the procedure linkage table. 3010 // Separating 3011 // these relocation entries lets the dynamic linker ignore them during 3012 // process initialization, if lazy binding is enabled. If this entry is 3013 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must 3014 // also be present. 3015 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL); 3016 if (symbol) { 3017 // Synthesize trampoline symbols to help navigate the PLT. 3018 addr_t addr = symbol->d_ptr; 3019 Section *reloc_section = 3020 section_list->FindSectionContainingFileAddress(addr).get(); 3021 if (reloc_section) { 3022 user_id_t reloc_id = reloc_section->GetID(); 3023 const ELFSectionHeaderInfo *reloc_header = 3024 GetSectionHeaderByIndex(reloc_id); 3025 if (reloc_header) 3026 ParseTrampolineSymbols(&lldb_symtab, symbol_id, reloc_header, reloc_id); 3027 } 3028 } 3029 3030 if (DWARFCallFrameInfo *eh_frame = 3031 GetModule()->GetUnwindTable().GetEHFrameInfo()) { 3032 ParseUnwindSymbols(&lldb_symtab, eh_frame); 3033 } 3034 3035 // In the event that there's no symbol entry for the entry point we'll 3036 // artificially create one. We delegate to the symtab object the figuring 3037 // out of the proper size, this will usually make it span til the next 3038 // symbol it finds in the section. This means that if there are missing 3039 // symbols the entry point might span beyond its function definition. 3040 // We're fine with this as it doesn't make it worse than not having a 3041 // symbol entry at all. 3042 if (CalculateType() == eTypeExecutable) { 3043 ArchSpec arch = GetArchitecture(); 3044 auto entry_point_addr = GetEntryPointAddress(); 3045 bool is_valid_entry_point = 3046 entry_point_addr.IsValid() && entry_point_addr.IsSectionOffset(); 3047 addr_t entry_point_file_addr = entry_point_addr.GetFileAddress(); 3048 if (is_valid_entry_point && !lldb_symtab.FindSymbolContainingFileAddress( 3049 entry_point_file_addr)) { 3050 uint64_t symbol_id = lldb_symtab.GetNumSymbols(); 3051 // Don't set the name for any synthetic symbols, the Symbol 3052 // object will generate one if needed when the name is accessed 3053 // via accessors. 3054 SectionSP section_sp = entry_point_addr.GetSection(); 3055 Symbol symbol( 3056 /*symID=*/symbol_id, 3057 /*name=*/llvm::StringRef(), // Name will be auto generated. 3058 /*type=*/eSymbolTypeCode, 3059 /*external=*/true, 3060 /*is_debug=*/false, 3061 /*is_trampoline=*/false, 3062 /*is_artificial=*/true, 3063 /*section_sp=*/section_sp, 3064 /*offset=*/0, 3065 /*size=*/0, // FDE can span multiple symbols so don't use its size. 3066 /*size_is_valid=*/false, 3067 /*contains_linker_annotations=*/false, 3068 /*flags=*/0); 3069 // When the entry point is arm thumb we need to explicitly set its 3070 // class address to reflect that. This is important because expression 3071 // evaluation relies on correctly setting a breakpoint at this 3072 // address. 3073 if (arch.GetMachine() == llvm::Triple::arm && 3074 (entry_point_file_addr & 1)) { 3075 symbol.GetAddressRef().SetOffset(entry_point_addr.GetOffset() ^ 1); 3076 m_address_class_map[entry_point_file_addr ^ 1] = 3077 AddressClass::eCodeAlternateISA; 3078 } else { 3079 m_address_class_map[entry_point_file_addr] = AddressClass::eCode; 3080 } 3081 lldb_symtab.AddSymbol(symbol); 3082 } 3083 } 3084 } 3085 3086 void ObjectFileELF::RelocateSection(lldb_private::Section *section) 3087 { 3088 static const char *debug_prefix = ".debug"; 3089 3090 // Set relocated bit so we stop getting called, regardless of whether we 3091 // actually relocate. 3092 section->SetIsRelocated(true); 3093 3094 // We only relocate in ELF relocatable files 3095 if (CalculateType() != eTypeObjectFile) 3096 return; 3097 3098 const char *section_name = section->GetName().GetCString(); 3099 // Can't relocate that which can't be named 3100 if (section_name == nullptr) 3101 return; 3102 3103 // We don't relocate non-debug sections at the moment 3104 if (strncmp(section_name, debug_prefix, strlen(debug_prefix))) 3105 return; 3106 3107 // Relocation section names to look for 3108 std::string needle = std::string(".rel") + section_name; 3109 std::string needlea = std::string(".rela") + section_name; 3110 3111 for (SectionHeaderCollIter I = m_section_headers.begin(); 3112 I != m_section_headers.end(); ++I) { 3113 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) { 3114 const char *hay_name = I->section_name.GetCString(); 3115 if (hay_name == nullptr) 3116 continue; 3117 if (needle == hay_name || needlea == hay_name) { 3118 const ELFSectionHeader &reloc_header = *I; 3119 user_id_t reloc_id = SectionIndex(I); 3120 RelocateDebugSections(&reloc_header, reloc_id, GetSymtab()); 3121 break; 3122 } 3123 } 3124 } 3125 } 3126 3127 void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table, 3128 DWARFCallFrameInfo *eh_frame) { 3129 SectionList *section_list = GetSectionList(); 3130 if (!section_list) 3131 return; 3132 3133 // First we save the new symbols into a separate list and add them to the 3134 // symbol table after we collected all symbols we want to add. This is 3135 // neccessary because adding a new symbol invalidates the internal index of 3136 // the symtab what causing the next lookup to be slow because it have to 3137 // recalculate the index first. 3138 std::vector<Symbol> new_symbols; 3139 3140 size_t num_symbols = symbol_table->GetNumSymbols(); 3141 uint64_t last_symbol_id = 3142 num_symbols ? symbol_table->SymbolAtIndex(num_symbols - 1)->GetID() : 0; 3143 eh_frame->ForEachFDEEntries([&](lldb::addr_t file_addr, uint32_t size, 3144 dw_offset_t) { 3145 Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr); 3146 if (symbol) { 3147 if (!symbol->GetByteSizeIsValid()) { 3148 symbol->SetByteSize(size); 3149 symbol->SetSizeIsSynthesized(true); 3150 } 3151 } else { 3152 SectionSP section_sp = 3153 section_list->FindSectionContainingFileAddress(file_addr); 3154 if (section_sp) { 3155 addr_t offset = file_addr - section_sp->GetFileAddress(); 3156 uint64_t symbol_id = ++last_symbol_id; 3157 // Don't set the name for any synthetic symbols, the Symbol 3158 // object will generate one if needed when the name is accessed 3159 // via accessors. 3160 Symbol eh_symbol( 3161 /*symID=*/symbol_id, 3162 /*name=*/llvm::StringRef(), // Name will be auto generated. 3163 /*type=*/eSymbolTypeCode, 3164 /*external=*/true, 3165 /*is_debug=*/false, 3166 /*is_trampoline=*/false, 3167 /*is_artificial=*/true, 3168 /*section_sp=*/section_sp, 3169 /*offset=*/offset, 3170 /*size=*/0, // FDE can span multiple symbols so don't use its size. 3171 /*size_is_valid=*/false, 3172 /*contains_linker_annotations=*/false, 3173 /*flags=*/0); 3174 new_symbols.push_back(eh_symbol); 3175 } 3176 } 3177 return true; 3178 }); 3179 3180 for (const Symbol &s : new_symbols) 3181 symbol_table->AddSymbol(s); 3182 } 3183 3184 bool ObjectFileELF::IsStripped() { 3185 // TODO: determine this for ELF 3186 return false; 3187 } 3188 3189 //===----------------------------------------------------------------------===// 3190 // Dump 3191 // 3192 // Dump the specifics of the runtime file container (such as any headers 3193 // segments, sections, etc). 3194 void ObjectFileELF::Dump(Stream *s) { 3195 ModuleSP module_sp(GetModule()); 3196 if (!module_sp) { 3197 return; 3198 } 3199 3200 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex()); 3201 s->Printf("%p: ", static_cast<void *>(this)); 3202 s->Indent(); 3203 s->PutCString("ObjectFileELF"); 3204 3205 ArchSpec header_arch = GetArchitecture(); 3206 3207 *s << ", file = '" << m_file 3208 << "', arch = " << header_arch.GetArchitectureName(); 3209 if (m_memory_addr != LLDB_INVALID_ADDRESS) 3210 s->Printf(", addr = %#16.16" PRIx64, m_memory_addr); 3211 s->EOL(); 3212 3213 DumpELFHeader(s, m_header); 3214 s->EOL(); 3215 DumpELFProgramHeaders(s); 3216 s->EOL(); 3217 DumpELFSectionHeaders(s); 3218 s->EOL(); 3219 SectionList *section_list = GetSectionList(); 3220 if (section_list) 3221 section_list->Dump(s->AsRawOstream(), s->GetIndentLevel(), nullptr, true, 3222 UINT32_MAX); 3223 Symtab *symtab = GetSymtab(); 3224 if (symtab) 3225 symtab->Dump(s, nullptr, eSortOrderNone); 3226 s->EOL(); 3227 DumpDependentModules(s); 3228 s->EOL(); 3229 DumpELFDynamic(s); 3230 s->EOL(); 3231 Address image_info_addr = GetImageInfoAddress(nullptr); 3232 if (image_info_addr.IsValid()) 3233 s->Printf("image_info_address = %#16.16" PRIx64 "\n", 3234 image_info_addr.GetFileAddress()); 3235 } 3236 3237 // DumpELFHeader 3238 // 3239 // Dump the ELF header to the specified output stream 3240 void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) { 3241 s->PutCString("ELF Header\n"); 3242 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]); 3243 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1], 3244 header.e_ident[EI_MAG1]); 3245 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2], 3246 header.e_ident[EI_MAG2]); 3247 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3], 3248 header.e_ident[EI_MAG3]); 3249 3250 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]); 3251 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]); 3252 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]); 3253 s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]); 3254 s->Printf("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]); 3255 3256 s->Printf("e_type = 0x%4.4x ", header.e_type); 3257 DumpELFHeader_e_type(s, header.e_type); 3258 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine); 3259 s->Printf("e_version = 0x%8.8x\n", header.e_version); 3260 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry); 3261 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff); 3262 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff); 3263 s->Printf("e_flags = 0x%8.8x\n", header.e_flags); 3264 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize); 3265 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize); 3266 s->Printf("e_phnum = 0x%8.8x\n", header.e_phnum); 3267 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize); 3268 s->Printf("e_shnum = 0x%8.8x\n", header.e_shnum); 3269 s->Printf("e_shstrndx = 0x%8.8x\n", header.e_shstrndx); 3270 } 3271 3272 // DumpELFHeader_e_type 3273 // 3274 // Dump an token value for the ELF header member e_type 3275 void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) { 3276 switch (e_type) { 3277 case ET_NONE: 3278 *s << "ET_NONE"; 3279 break; 3280 case ET_REL: 3281 *s << "ET_REL"; 3282 break; 3283 case ET_EXEC: 3284 *s << "ET_EXEC"; 3285 break; 3286 case ET_DYN: 3287 *s << "ET_DYN"; 3288 break; 3289 case ET_CORE: 3290 *s << "ET_CORE"; 3291 break; 3292 default: 3293 break; 3294 } 3295 } 3296 3297 // DumpELFHeader_e_ident_EI_DATA 3298 // 3299 // Dump an token value for the ELF header member e_ident[EI_DATA] 3300 void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, 3301 unsigned char ei_data) { 3302 switch (ei_data) { 3303 case ELFDATANONE: 3304 *s << "ELFDATANONE"; 3305 break; 3306 case ELFDATA2LSB: 3307 *s << "ELFDATA2LSB - Little Endian"; 3308 break; 3309 case ELFDATA2MSB: 3310 *s << "ELFDATA2MSB - Big Endian"; 3311 break; 3312 default: 3313 break; 3314 } 3315 } 3316 3317 // DumpELFProgramHeader 3318 // 3319 // Dump a single ELF program header to the specified output stream 3320 void ObjectFileELF::DumpELFProgramHeader(Stream *s, 3321 const ELFProgramHeader &ph) { 3322 DumpELFProgramHeader_p_type(s, ph.p_type); 3323 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, 3324 ph.p_vaddr, ph.p_paddr); 3325 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, 3326 ph.p_flags); 3327 3328 DumpELFProgramHeader_p_flags(s, ph.p_flags); 3329 s->Printf(") %8.8" PRIx64, ph.p_align); 3330 } 3331 3332 // DumpELFProgramHeader_p_type 3333 // 3334 // Dump an token value for the ELF program header member p_type which describes 3335 // the type of the program header 3336 void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) { 3337 const int kStrWidth = 15; 3338 switch (p_type) { 3339 CASE_AND_STREAM(s, PT_NULL, kStrWidth); 3340 CASE_AND_STREAM(s, PT_LOAD, kStrWidth); 3341 CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth); 3342 CASE_AND_STREAM(s, PT_INTERP, kStrWidth); 3343 CASE_AND_STREAM(s, PT_NOTE, kStrWidth); 3344 CASE_AND_STREAM(s, PT_SHLIB, kStrWidth); 3345 CASE_AND_STREAM(s, PT_PHDR, kStrWidth); 3346 CASE_AND_STREAM(s, PT_TLS, kStrWidth); 3347 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth); 3348 default: 3349 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, ""); 3350 break; 3351 } 3352 } 3353 3354 // DumpELFProgramHeader_p_flags 3355 // 3356 // Dump an token value for the ELF program header member p_flags 3357 void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) { 3358 *s << ((p_flags & PF_X) ? "PF_X" : " ") 3359 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ') 3360 << ((p_flags & PF_W) ? "PF_W" : " ") 3361 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ') 3362 << ((p_flags & PF_R) ? "PF_R" : " "); 3363 } 3364 3365 // DumpELFProgramHeaders 3366 // 3367 // Dump all of the ELF program header to the specified output stream 3368 void ObjectFileELF::DumpELFProgramHeaders(Stream *s) { 3369 if (!ParseProgramHeaders()) 3370 return; 3371 3372 s->PutCString("Program Headers\n"); 3373 s->PutCString("IDX p_type p_offset p_vaddr p_paddr " 3374 "p_filesz p_memsz p_flags p_align\n"); 3375 s->PutCString("==== --------------- -------- -------- -------- " 3376 "-------- -------- ------------------------- --------\n"); 3377 3378 for (const auto &H : llvm::enumerate(m_program_headers)) { 3379 s->Format("[{0,2}] ", H.index()); 3380 ObjectFileELF::DumpELFProgramHeader(s, H.value()); 3381 s->EOL(); 3382 } 3383 } 3384 3385 // DumpELFSectionHeader 3386 // 3387 // Dump a single ELF section header to the specified output stream 3388 void ObjectFileELF::DumpELFSectionHeader(Stream *s, 3389 const ELFSectionHeaderInfo &sh) { 3390 s->Printf("%8.8x ", sh.sh_name); 3391 DumpELFSectionHeader_sh_type(s, sh.sh_type); 3392 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags); 3393 DumpELFSectionHeader_sh_flags(s, sh.sh_flags); 3394 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, 3395 sh.sh_offset, sh.sh_size); 3396 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info); 3397 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize); 3398 } 3399 3400 // DumpELFSectionHeader_sh_type 3401 // 3402 // Dump an token value for the ELF section header member sh_type which 3403 // describes the type of the section 3404 void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) { 3405 const int kStrWidth = 12; 3406 switch (sh_type) { 3407 CASE_AND_STREAM(s, SHT_NULL, kStrWidth); 3408 CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth); 3409 CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth); 3410 CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth); 3411 CASE_AND_STREAM(s, SHT_RELA, kStrWidth); 3412 CASE_AND_STREAM(s, SHT_HASH, kStrWidth); 3413 CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth); 3414 CASE_AND_STREAM(s, SHT_NOTE, kStrWidth); 3415 CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth); 3416 CASE_AND_STREAM(s, SHT_REL, kStrWidth); 3417 CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth); 3418 CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth); 3419 CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth); 3420 CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth); 3421 CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth); 3422 CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth); 3423 default: 3424 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, ""); 3425 break; 3426 } 3427 } 3428 3429 // DumpELFSectionHeader_sh_flags 3430 // 3431 // Dump an token value for the ELF section header member sh_flags 3432 void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, 3433 elf_xword sh_flags) { 3434 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ") 3435 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ') 3436 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ") 3437 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ') 3438 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " "); 3439 } 3440 3441 // DumpELFSectionHeaders 3442 // 3443 // Dump all of the ELF section header to the specified output stream 3444 void ObjectFileELF::DumpELFSectionHeaders(Stream *s) { 3445 if (!ParseSectionHeaders()) 3446 return; 3447 3448 s->PutCString("Section Headers\n"); 3449 s->PutCString("IDX name type flags " 3450 "addr offset size link info addralgn " 3451 "entsize Name\n"); 3452 s->PutCString("==== -------- ------------ -------------------------------- " 3453 "-------- -------- -------- -------- -------- -------- " 3454 "-------- ====================\n"); 3455 3456 uint32_t idx = 0; 3457 for (SectionHeaderCollConstIter I = m_section_headers.begin(); 3458 I != m_section_headers.end(); ++I, ++idx) { 3459 s->Printf("[%2u] ", idx); 3460 ObjectFileELF::DumpELFSectionHeader(s, *I); 3461 const char *section_name = I->section_name.AsCString(""); 3462 if (section_name) 3463 *s << ' ' << section_name << "\n"; 3464 } 3465 } 3466 3467 void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) { 3468 size_t num_modules = ParseDependentModules(); 3469 3470 if (num_modules > 0) { 3471 s->PutCString("Dependent Modules:\n"); 3472 for (unsigned i = 0; i < num_modules; ++i) { 3473 const FileSpec &spec = m_filespec_up->GetFileSpecAtIndex(i); 3474 s->Printf(" %s\n", spec.GetFilename().GetCString()); 3475 } 3476 } 3477 } 3478 3479 std::string static getDynamicTagAsString(uint16_t Arch, uint64_t Type) { 3480 #define DYNAMIC_STRINGIFY_ENUM(tag, value) \ 3481 case value: \ 3482 return #tag; 3483 3484 #define DYNAMIC_TAG(n, v) 3485 switch (Arch) { 3486 case llvm::ELF::EM_AARCH64: 3487 switch (Type) { 3488 #define AARCH64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3489 #include "llvm/BinaryFormat/DynamicTags.def" 3490 #undef AARCH64_DYNAMIC_TAG 3491 } 3492 break; 3493 3494 case llvm::ELF::EM_HEXAGON: 3495 switch (Type) { 3496 #define HEXAGON_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3497 #include "llvm/BinaryFormat/DynamicTags.def" 3498 #undef HEXAGON_DYNAMIC_TAG 3499 } 3500 break; 3501 3502 case llvm::ELF::EM_MIPS: 3503 switch (Type) { 3504 #define MIPS_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3505 #include "llvm/BinaryFormat/DynamicTags.def" 3506 #undef MIPS_DYNAMIC_TAG 3507 } 3508 break; 3509 3510 case llvm::ELF::EM_PPC: 3511 switch (Type) { 3512 #define PPC_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3513 #include "llvm/BinaryFormat/DynamicTags.def" 3514 #undef PPC_DYNAMIC_TAG 3515 } 3516 break; 3517 3518 case llvm::ELF::EM_PPC64: 3519 switch (Type) { 3520 #define PPC64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3521 #include "llvm/BinaryFormat/DynamicTags.def" 3522 #undef PPC64_DYNAMIC_TAG 3523 } 3524 break; 3525 3526 case llvm::ELF::EM_RISCV: 3527 switch (Type) { 3528 #define RISCV_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) 3529 #include "llvm/BinaryFormat/DynamicTags.def" 3530 #undef RISCV_DYNAMIC_TAG 3531 } 3532 break; 3533 } 3534 #undef DYNAMIC_TAG 3535 switch (Type) { 3536 // Now handle all dynamic tags except the architecture specific ones 3537 #define AARCH64_DYNAMIC_TAG(name, value) 3538 #define MIPS_DYNAMIC_TAG(name, value) 3539 #define HEXAGON_DYNAMIC_TAG(name, value) 3540 #define PPC_DYNAMIC_TAG(name, value) 3541 #define PPC64_DYNAMIC_TAG(name, value) 3542 #define RISCV_DYNAMIC_TAG(name, value) 3543 // Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc. 3544 #define DYNAMIC_TAG_MARKER(name, value) 3545 #define DYNAMIC_TAG(name, value) \ 3546 case value: \ 3547 return #name; 3548 #include "llvm/BinaryFormat/DynamicTags.def" 3549 #undef DYNAMIC_TAG 3550 #undef AARCH64_DYNAMIC_TAG 3551 #undef MIPS_DYNAMIC_TAG 3552 #undef HEXAGON_DYNAMIC_TAG 3553 #undef PPC_DYNAMIC_TAG 3554 #undef PPC64_DYNAMIC_TAG 3555 #undef RISCV_DYNAMIC_TAG 3556 #undef DYNAMIC_TAG_MARKER 3557 #undef DYNAMIC_STRINGIFY_ENUM 3558 default: 3559 return "<unknown:>0x" + llvm::utohexstr(Type, true); 3560 } 3561 } 3562 3563 void ObjectFileELF::DumpELFDynamic(lldb_private::Stream *s) { 3564 ParseDynamicSymbols(); 3565 if (m_dynamic_symbols.empty()) 3566 return; 3567 3568 s->PutCString(".dynamic:\n"); 3569 s->PutCString("IDX d_tag d_val/d_ptr\n"); 3570 s->PutCString("==== ---------------- ------------------\n"); 3571 uint32_t idx = 0; 3572 for (const auto &entry : m_dynamic_symbols) { 3573 s->Printf("[%2u] ", idx++); 3574 s->Printf( 3575 "%-16s 0x%16.16" PRIx64, 3576 getDynamicTagAsString(m_header.e_machine, entry.symbol.d_tag).c_str(), 3577 entry.symbol.d_ptr); 3578 if (!entry.name.empty()) 3579 s->Printf(" \"%s\"", entry.name.c_str()); 3580 s->EOL(); 3581 } 3582 } 3583 3584 ArchSpec ObjectFileELF::GetArchitecture() { 3585 if (!ParseHeader()) 3586 return ArchSpec(); 3587 3588 if (m_section_headers.empty()) { 3589 // Allow elf notes to be parsed which may affect the detected architecture. 3590 ParseSectionHeaders(); 3591 } 3592 3593 if (CalculateType() == eTypeCoreFile && 3594 !m_arch_spec.TripleOSWasSpecified()) { 3595 // Core files don't have section headers yet they have PT_NOTE program 3596 // headers that might shed more light on the architecture 3597 for (const elf::ELFProgramHeader &H : ProgramHeaders()) { 3598 if (H.p_type != PT_NOTE || H.p_offset == 0 || H.p_filesz == 0) 3599 continue; 3600 DataExtractor data; 3601 if (data.SetData(m_data, H.p_offset, H.p_filesz) == H.p_filesz) { 3602 UUID uuid; 3603 RefineModuleDetailsFromNote(data, m_arch_spec, uuid); 3604 } 3605 } 3606 } 3607 return m_arch_spec; 3608 } 3609 3610 ObjectFile::Type ObjectFileELF::CalculateType() { 3611 switch (m_header.e_type) { 3612 case llvm::ELF::ET_NONE: 3613 // 0 - No file type 3614 return eTypeUnknown; 3615 3616 case llvm::ELF::ET_REL: 3617 // 1 - Relocatable file 3618 return eTypeObjectFile; 3619 3620 case llvm::ELF::ET_EXEC: 3621 // 2 - Executable file 3622 return eTypeExecutable; 3623 3624 case llvm::ELF::ET_DYN: 3625 // 3 - Shared object file 3626 return eTypeSharedLibrary; 3627 3628 case ET_CORE: 3629 // 4 - Core file 3630 return eTypeCoreFile; 3631 3632 default: 3633 break; 3634 } 3635 return eTypeUnknown; 3636 } 3637 3638 ObjectFile::Strata ObjectFileELF::CalculateStrata() { 3639 switch (m_header.e_type) { 3640 case llvm::ELF::ET_NONE: 3641 // 0 - No file type 3642 return eStrataUnknown; 3643 3644 case llvm::ELF::ET_REL: 3645 // 1 - Relocatable file 3646 return eStrataUnknown; 3647 3648 case llvm::ELF::ET_EXEC: 3649 // 2 - Executable file 3650 { 3651 SectionList *section_list = GetSectionList(); 3652 if (section_list) { 3653 static ConstString loader_section_name(".interp"); 3654 SectionSP loader_section = 3655 section_list->FindSectionByName(loader_section_name); 3656 if (loader_section) { 3657 char buffer[256]; 3658 size_t read_size = 3659 ReadSectionData(loader_section.get(), 0, buffer, sizeof(buffer)); 3660 3661 // We compare the content of .interp section 3662 // It will contains \0 when counting read_size, so the size needs to 3663 // decrease by one 3664 llvm::StringRef loader_name(buffer, read_size - 1); 3665 llvm::StringRef freebsd_kernel_loader_name("/red/herring"); 3666 if (loader_name == freebsd_kernel_loader_name) 3667 return eStrataKernel; 3668 } 3669 } 3670 return eStrataUser; 3671 } 3672 3673 case llvm::ELF::ET_DYN: 3674 // 3 - Shared object file 3675 // TODO: is there any way to detect that an shared library is a kernel 3676 // related executable by inspecting the program headers, section headers, 3677 // symbols, or any other flag bits??? 3678 return eStrataUnknown; 3679 3680 case ET_CORE: 3681 // 4 - Core file 3682 // TODO: is there any way to detect that an core file is a kernel 3683 // related executable by inspecting the program headers, section headers, 3684 // symbols, or any other flag bits??? 3685 return eStrataUnknown; 3686 3687 default: 3688 break; 3689 } 3690 return eStrataUnknown; 3691 } 3692 3693 size_t ObjectFileELF::ReadSectionData(Section *section, 3694 lldb::offset_t section_offset, void *dst, 3695 size_t dst_len) { 3696 // If some other objectfile owns this data, pass this to them. 3697 if (section->GetObjectFile() != this) 3698 return section->GetObjectFile()->ReadSectionData(section, section_offset, 3699 dst, dst_len); 3700 3701 if (!section->Test(SHF_COMPRESSED)) 3702 return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len); 3703 3704 // For compressed sections we need to read to full data to be able to 3705 // decompress. 3706 DataExtractor data; 3707 ReadSectionData(section, data); 3708 return data.CopyData(section_offset, dst_len, dst); 3709 } 3710 3711 size_t ObjectFileELF::ReadSectionData(Section *section, 3712 DataExtractor §ion_data) { 3713 // If some other objectfile owns this data, pass this to them. 3714 if (section->GetObjectFile() != this) 3715 return section->GetObjectFile()->ReadSectionData(section, section_data); 3716 3717 size_t result = ObjectFile::ReadSectionData(section, section_data); 3718 if (result == 0 || !(section->Get() & llvm::ELF::SHF_COMPRESSED)) 3719 return result; 3720 3721 auto Decompressor = llvm::object::Decompressor::create( 3722 section->GetName().GetStringRef(), 3723 {reinterpret_cast<const char *>(section_data.GetDataStart()), 3724 size_t(section_data.GetByteSize())}, 3725 GetByteOrder() == eByteOrderLittle, GetAddressByteSize() == 8); 3726 if (!Decompressor) { 3727 GetModule()->ReportWarning( 3728 "Unable to initialize decompressor for section '{0}': {1}", 3729 section->GetName().GetCString(), 3730 llvm::toString(Decompressor.takeError()).c_str()); 3731 section_data.Clear(); 3732 return 0; 3733 } 3734 3735 auto buffer_sp = 3736 std::make_shared<DataBufferHeap>(Decompressor->getDecompressedSize(), 0); 3737 if (auto error = Decompressor->decompress( 3738 {buffer_sp->GetBytes(), size_t(buffer_sp->GetByteSize())})) { 3739 GetModule()->ReportWarning("Decompression of section '{0}' failed: {1}", 3740 section->GetName().GetCString(), 3741 llvm::toString(std::move(error)).c_str()); 3742 section_data.Clear(); 3743 return 0; 3744 } 3745 3746 section_data.SetData(buffer_sp); 3747 return buffer_sp->GetByteSize(); 3748 } 3749 3750 llvm::ArrayRef<ELFProgramHeader> ObjectFileELF::ProgramHeaders() { 3751 ParseProgramHeaders(); 3752 return m_program_headers; 3753 } 3754 3755 DataExtractor ObjectFileELF::GetSegmentData(const ELFProgramHeader &H) { 3756 // Try and read the program header from our cached m_data which can come from 3757 // the file on disk being mmap'ed or from the initial part of the ELF file we 3758 // read from memory and cached. 3759 DataExtractor data = DataExtractor(m_data, H.p_offset, H.p_filesz); 3760 if (data.GetByteSize() == H.p_filesz) 3761 return data; 3762 if (IsInMemory()) { 3763 // We have a ELF file in process memory, read the program header data from 3764 // the process. 3765 if (ProcessSP process_sp = m_process_wp.lock()) { 3766 const lldb::offset_t base_file_addr = GetBaseAddress().GetFileAddress(); 3767 const addr_t load_bias = m_memory_addr - base_file_addr; 3768 const addr_t data_addr = H.p_vaddr + load_bias; 3769 if (DataBufferSP data_sp = ReadMemory(process_sp, data_addr, H.p_memsz)) 3770 return DataExtractor(data_sp, GetByteOrder(), GetAddressByteSize()); 3771 } 3772 } 3773 return DataExtractor(); 3774 } 3775 3776 bool ObjectFileELF::AnySegmentHasPhysicalAddress() { 3777 for (const ELFProgramHeader &H : ProgramHeaders()) { 3778 if (H.p_paddr != 0) 3779 return true; 3780 } 3781 return false; 3782 } 3783 3784 std::vector<ObjectFile::LoadableData> 3785 ObjectFileELF::GetLoadableData(Target &target) { 3786 // Create a list of loadable data from loadable segments, using physical 3787 // addresses if they aren't all null 3788 std::vector<LoadableData> loadables; 3789 bool should_use_paddr = AnySegmentHasPhysicalAddress(); 3790 for (const ELFProgramHeader &H : ProgramHeaders()) { 3791 LoadableData loadable; 3792 if (H.p_type != llvm::ELF::PT_LOAD) 3793 continue; 3794 loadable.Dest = should_use_paddr ? H.p_paddr : H.p_vaddr; 3795 if (loadable.Dest == LLDB_INVALID_ADDRESS) 3796 continue; 3797 if (H.p_filesz == 0) 3798 continue; 3799 auto segment_data = GetSegmentData(H); 3800 loadable.Contents = llvm::ArrayRef<uint8_t>(segment_data.GetDataStart(), 3801 segment_data.GetByteSize()); 3802 loadables.push_back(loadable); 3803 } 3804 return loadables; 3805 } 3806 3807 lldb::WritableDataBufferSP 3808 ObjectFileELF::MapFileDataWritable(const FileSpec &file, uint64_t Size, 3809 uint64_t Offset) { 3810 return FileSystem::Instance().CreateWritableDataBuffer(file.GetPath(), Size, 3811 Offset); 3812 } 3813 3814 std::optional<DataExtractor> ObjectFileELF::GetDynstrData() { 3815 if (SectionList *section_list = GetSectionList()) { 3816 // Find the SHT_DYNAMIC section. 3817 if (Section *dynamic = 3818 section_list 3819 ->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true) 3820 .get()) { 3821 assert(dynamic->GetObjectFile() == this); 3822 if (const ELFSectionHeaderInfo *header = 3823 GetSectionHeaderByIndex(dynamic->GetID())) { 3824 // sh_link: section header index of string table used by entries in 3825 // the section. 3826 if (Section *dynstr = 3827 section_list->FindSectionByID(header->sh_link).get()) { 3828 DataExtractor data; 3829 if (ReadSectionData(dynstr, data)) 3830 return data; 3831 } 3832 } 3833 } 3834 } 3835 3836 // Every ELF file which represents an executable or shared library has 3837 // mandatory .dynamic entries. Two of these values are DT_STRTAB and DT_STRSZ 3838 // and represent the dynamic symbol tables's string table. These are needed 3839 // by the dynamic loader and we can read them from a process' address space. 3840 // 3841 // When loading and ELF file from memory, only the program headers end up 3842 // being mapped into memory, and we can find these values in the PT_DYNAMIC 3843 // segment. 3844 const ELFDynamic *strtab = FindDynamicSymbol(DT_STRTAB); 3845 const ELFDynamic *strsz = FindDynamicSymbol(DT_STRSZ); 3846 if (strtab == nullptr || strsz == nullptr) 3847 return std::nullopt; 3848 3849 if (ProcessSP process_sp = m_process_wp.lock()) { 3850 if (DataBufferSP data_sp = 3851 ReadMemory(process_sp, strtab->d_ptr, strsz->d_val)) 3852 return DataExtractor(data_sp, GetByteOrder(), GetAddressByteSize()); 3853 } else { 3854 // We have an ELF file with no section headers or we didn't find the 3855 // .dynamic section. Try and find the .dynstr section. 3856 Address addr; 3857 if (addr.ResolveAddressUsingFileSections(strtab->d_ptr, GetSectionList())) { 3858 DataExtractor data; 3859 addr.GetSection()->GetSectionData(data); 3860 return DataExtractor(data, 3861 strtab->d_ptr - addr.GetSection()->GetFileAddress(), 3862 strsz->d_val); 3863 } 3864 } 3865 return std::nullopt; 3866 } 3867 3868 std::optional<lldb_private::DataExtractor> ObjectFileELF::GetDynamicData() { 3869 DataExtractor data; 3870 // The PT_DYNAMIC program header describes where the .dynamic section is and 3871 // doesn't require parsing section headers. The PT_DYNAMIC is required by 3872 // executables and shared libraries so it will always be available. 3873 for (const ELFProgramHeader &H : ProgramHeaders()) { 3874 if (H.p_type == llvm::ELF::PT_DYNAMIC) { 3875 data = GetSegmentData(H); 3876 if (data.GetByteSize() > 0) { 3877 m_dynamic_base_addr = H.p_vaddr; 3878 return data; 3879 } 3880 } 3881 } 3882 // Fall back to using section headers. 3883 if (SectionList *section_list = GetSectionList()) { 3884 // Find the SHT_DYNAMIC section. 3885 if (Section *dynamic = 3886 section_list 3887 ->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true) 3888 .get()) { 3889 assert(dynamic->GetObjectFile() == this); 3890 if (ReadSectionData(dynamic, data)) { 3891 m_dynamic_base_addr = dynamic->GetFileAddress(); 3892 return data; 3893 } 3894 } 3895 } 3896 return std::nullopt; 3897 } 3898