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