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