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