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