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