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