xref: /llvm-project/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (revision 5c1c8443eb7366e6e5086426b5d8dc7d24afc13b)
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/Section.h"
20 #include "lldb/Host/FileSystem.h"
21 #include "lldb/Host/LZMA.h"
22 #include "lldb/Symbol/DWARFCallFrameInfo.h"
23 #include "lldb/Symbol/SymbolContext.h"
24 #include "lldb/Target/SectionLoadList.h"
25 #include "lldb/Target/Target.h"
26 #include "lldb/Utility/ArchSpec.h"
27 #include "lldb/Utility/DataBufferHeap.h"
28 #include "lldb/Utility/Log.h"
29 #include "lldb/Utility/RangeMap.h"
30 #include "lldb/Utility/Status.h"
31 #include "lldb/Utility/Stream.h"
32 #include "lldb/Utility/Timer.h"
33 #include "llvm/ADT/IntervalMap.h"
34 #include "llvm/ADT/PointerUnion.h"
35 #include "llvm/ADT/StringRef.h"
36 #include "llvm/BinaryFormat/ELF.h"
37 #include "llvm/Object/Decompressor.h"
38 #include "llvm/Support/ARMBuildAttributes.h"
39 #include "llvm/Support/CRC.h"
40 #include "llvm/Support/MathExtras.h"
41 #include "llvm/Support/MemoryBuffer.h"
42 #include "llvm/Support/MipsABIFlags.h"
43 
44 #define CASE_AND_STREAM(s, def, width)                                         \
45   case def:                                                                    \
46     s->Printf("%-*s", width, #def);                                            \
47     break;
48 
49 using namespace lldb;
50 using namespace lldb_private;
51 using namespace elf;
52 using namespace llvm::ELF;
53 
54 LLDB_PLUGIN_DEFINE(ObjectFileELF)
55 
56 namespace {
57 
58 // ELF note owner definitions
59 const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
60 const char *const LLDB_NT_OWNER_GNU = "GNU";
61 const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
62 const char *const LLDB_NT_OWNER_NETBSDCORE = "NetBSD-CORE";
63 const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD";
64 const char *const LLDB_NT_OWNER_ANDROID = "Android";
65 const char *const LLDB_NT_OWNER_CORE = "CORE";
66 const char *const LLDB_NT_OWNER_LINUX = "LINUX";
67 
68 // ELF note type definitions
69 const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
70 const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
71 
72 const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
73 const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
74 
75 const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
76 
77 const elf_word LLDB_NT_NETBSD_IDENT_TAG = 1;
78 const elf_word LLDB_NT_NETBSD_IDENT_DESCSZ = 4;
79 const elf_word LLDB_NT_NETBSD_IDENT_NAMESZ = 7;
80 const elf_word LLDB_NT_NETBSD_PROCINFO = 1;
81 
82 // GNU ABI note OS constants
83 const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
84 const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
85 const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
86 
87 //===----------------------------------------------------------------------===//
88 /// \class ELFRelocation
89 /// Generic wrapper for ELFRel and ELFRela.
90 ///
91 /// This helper class allows us to parse both ELFRel and ELFRela relocation
92 /// entries in a generic manner.
93 class ELFRelocation {
94 public:
95   /// Constructs an ELFRelocation entry with a personality as given by @p
96   /// type.
97   ///
98   /// \param type Either DT_REL or DT_RELA.  Any other value is invalid.
99   ELFRelocation(unsigned type);
100 
101   ~ELFRelocation();
102 
103   bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
104 
105   static unsigned RelocType32(const ELFRelocation &rel);
106 
107   static unsigned RelocType64(const ELFRelocation &rel);
108 
109   static unsigned RelocSymbol32(const ELFRelocation &rel);
110 
111   static unsigned RelocSymbol64(const ELFRelocation &rel);
112 
113   static unsigned RelocOffset32(const ELFRelocation &rel);
114 
115   static unsigned RelocOffset64(const ELFRelocation &rel);
116 
117   static unsigned RelocAddend32(const ELFRelocation &rel);
118 
119   static unsigned RelocAddend64(const ELFRelocation &rel);
120 
121 private:
122   typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion;
123 
124   RelocUnion reloc;
125 };
126 
127 ELFRelocation::ELFRelocation(unsigned type) {
128   if (type == DT_REL || type == SHT_REL)
129     reloc = new ELFRel();
130   else if (type == DT_RELA || type == SHT_RELA)
131     reloc = new ELFRela();
132   else {
133     assert(false && "unexpected relocation type");
134     reloc = static_cast<ELFRel *>(nullptr);
135   }
136 }
137 
138 ELFRelocation::~ELFRelocation() {
139   if (reloc.is<ELFRel *>())
140     delete reloc.get<ELFRel *>();
141   else
142     delete reloc.get<ELFRela *>();
143 }
144 
145 bool ELFRelocation::Parse(const lldb_private::DataExtractor &data,
146                           lldb::offset_t *offset) {
147   if (reloc.is<ELFRel *>())
148     return reloc.get<ELFRel *>()->Parse(data, offset);
149   else
150     return reloc.get<ELFRela *>()->Parse(data, offset);
151 }
152 
153 unsigned ELFRelocation::RelocType32(const ELFRelocation &rel) {
154   if (rel.reloc.is<ELFRel *>())
155     return ELFRel::RelocType32(*rel.reloc.get<ELFRel *>());
156   else
157     return ELFRela::RelocType32(*rel.reloc.get<ELFRela *>());
158 }
159 
160 unsigned ELFRelocation::RelocType64(const ELFRelocation &rel) {
161   if (rel.reloc.is<ELFRel *>())
162     return ELFRel::RelocType64(*rel.reloc.get<ELFRel *>());
163   else
164     return ELFRela::RelocType64(*rel.reloc.get<ELFRela *>());
165 }
166 
167 unsigned ELFRelocation::RelocSymbol32(const ELFRelocation &rel) {
168   if (rel.reloc.is<ELFRel *>())
169     return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel *>());
170   else
171     return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela *>());
172 }
173 
174 unsigned ELFRelocation::RelocSymbol64(const ELFRelocation &rel) {
175   if (rel.reloc.is<ELFRel *>())
176     return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel *>());
177   else
178     return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela *>());
179 }
180 
181 unsigned ELFRelocation::RelocOffset32(const ELFRelocation &rel) {
182   if (rel.reloc.is<ELFRel *>())
183     return rel.reloc.get<ELFRel *>()->r_offset;
184   else
185     return rel.reloc.get<ELFRela *>()->r_offset;
186 }
187 
188 unsigned ELFRelocation::RelocOffset64(const ELFRelocation &rel) {
189   if (rel.reloc.is<ELFRel *>())
190     return rel.reloc.get<ELFRel *>()->r_offset;
191   else
192     return rel.reloc.get<ELFRela *>()->r_offset;
193 }
194 
195 unsigned ELFRelocation::RelocAddend32(const ELFRelocation &rel) {
196   if (rel.reloc.is<ELFRel *>())
197     return 0;
198   else
199     return rel.reloc.get<ELFRela *>()->r_addend;
200 }
201 
202 unsigned ELFRelocation::RelocAddend64(const ELFRelocation &rel) {
203   if (rel.reloc.is<ELFRel *>())
204     return 0;
205   else
206     return rel.reloc.get<ELFRela *>()->r_addend;
207 }
208 
209 } // end anonymous namespace
210 
211 static user_id_t SegmentID(size_t PHdrIndex) {
212   return ~user_id_t(PHdrIndex);
213 }
214 
215 bool ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) {
216   // Read all fields.
217   if (data.GetU32(offset, &n_namesz, 3) == nullptr)
218     return false;
219 
220   // The name field is required to be nul-terminated, and n_namesz includes the
221   // terminating nul in observed implementations (contrary to the ELF-64 spec).
222   // A special case is needed for cores generated by some older Linux versions,
223   // which write a note named "CORE" without a nul terminator and n_namesz = 4.
224   if (n_namesz == 4) {
225     char buf[4];
226     if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4)
227       return false;
228     if (strncmp(buf, "CORE", 4) == 0) {
229       n_name = "CORE";
230       *offset += 4;
231       return true;
232     }
233   }
234 
235   const char *cstr = data.GetCStr(offset, llvm::alignTo(n_namesz, 4));
236   if (cstr == nullptr) {
237     Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS));
238     LLDB_LOGF(log, "Failed to parse note name lacking nul terminator");
239 
240     return false;
241   }
242   n_name = cstr;
243   return true;
244 }
245 
246 static uint32_t mipsVariantFromElfFlags (const elf::ELFHeader &header) {
247   const uint32_t mips_arch = header.e_flags & llvm::ELF::EF_MIPS_ARCH;
248   uint32_t endian = header.e_ident[EI_DATA];
249   uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown;
250   uint32_t fileclass = header.e_ident[EI_CLASS];
251 
252   // If there aren't any elf flags available (e.g core elf file) then return
253   // default
254   // 32 or 64 bit arch (without any architecture revision) based on object file's class.
255   if (header.e_type == ET_CORE) {
256     switch (fileclass) {
257     case llvm::ELF::ELFCLASS32:
258       return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
259                                      : ArchSpec::eMIPSSubType_mips32;
260     case llvm::ELF::ELFCLASS64:
261       return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
262                                      : ArchSpec::eMIPSSubType_mips64;
263     default:
264       return arch_variant;
265     }
266   }
267 
268   switch (mips_arch) {
269   case llvm::ELF::EF_MIPS_ARCH_1:
270   case llvm::ELF::EF_MIPS_ARCH_2:
271   case llvm::ELF::EF_MIPS_ARCH_32:
272     return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
273                                    : ArchSpec::eMIPSSubType_mips32;
274   case llvm::ELF::EF_MIPS_ARCH_32R2:
275     return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r2el
276                                    : ArchSpec::eMIPSSubType_mips32r2;
277   case llvm::ELF::EF_MIPS_ARCH_32R6:
278     return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r6el
279                                    : ArchSpec::eMIPSSubType_mips32r6;
280   case llvm::ELF::EF_MIPS_ARCH_3:
281   case llvm::ELF::EF_MIPS_ARCH_4:
282   case llvm::ELF::EF_MIPS_ARCH_5:
283   case llvm::ELF::EF_MIPS_ARCH_64:
284     return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
285                                    : ArchSpec::eMIPSSubType_mips64;
286   case llvm::ELF::EF_MIPS_ARCH_64R2:
287     return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r2el
288                                    : ArchSpec::eMIPSSubType_mips64r2;
289   case llvm::ELF::EF_MIPS_ARCH_64R6:
290     return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r6el
291                                    : ArchSpec::eMIPSSubType_mips64r6;
292   default:
293     break;
294   }
295 
296   return arch_variant;
297 }
298 
299 static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) {
300   if (header.e_machine == llvm::ELF::EM_MIPS)
301     return mipsVariantFromElfFlags(header);
302 
303   return LLDB_INVALID_CPUTYPE;
304 }
305 
306 char ObjectFileELF::ID;
307 
308 // Arbitrary constant used as UUID prefix for core files.
309 const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C);
310 
311 // Static methods.
312 void ObjectFileELF::Initialize() {
313   PluginManager::RegisterPlugin(GetPluginNameStatic(),
314                                 GetPluginDescriptionStatic(), CreateInstance,
315                                 CreateMemoryInstance, GetModuleSpecifications);
316 }
317 
318 void ObjectFileELF::Terminate() {
319   PluginManager::UnregisterPlugin(CreateInstance);
320 }
321 
322 lldb_private::ConstString ObjectFileELF::GetPluginNameStatic() {
323   static ConstString g_name("elf");
324   return g_name;
325 }
326 
327 const char *ObjectFileELF::GetPluginDescriptionStatic() {
328   return "ELF object file reader.";
329 }
330 
331 ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp,
332                                           DataBufferSP &data_sp,
333                                           lldb::offset_t data_offset,
334                                           const lldb_private::FileSpec *file,
335                                           lldb::offset_t file_offset,
336                                           lldb::offset_t length) {
337   if (!data_sp) {
338     data_sp = MapFileData(*file, length, file_offset);
339     if (!data_sp)
340       return nullptr;
341     data_offset = 0;
342   }
343 
344   assert(data_sp);
345 
346   if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset))
347     return nullptr;
348 
349   const uint8_t *magic = data_sp->GetBytes() + data_offset;
350   if (!ELFHeader::MagicBytesMatch(magic))
351     return nullptr;
352 
353   // Update the data to contain the entire file if it doesn't already
354   if (data_sp->GetByteSize() < length) {
355     data_sp = MapFileData(*file, length, file_offset);
356     if (!data_sp)
357       return nullptr;
358     data_offset = 0;
359     magic = data_sp->GetBytes();
360   }
361 
362   unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
363   if (address_size == 4 || address_size == 8) {
364     std::unique_ptr<ObjectFileELF> objfile_up(new ObjectFileELF(
365         module_sp, data_sp, data_offset, file, file_offset, length));
366     ArchSpec spec = objfile_up->GetArchitecture();
367     if (spec && objfile_up->SetModulesArchitecture(spec))
368       return objfile_up.release();
369   }
370 
371   return nullptr;
372 }
373 
374 ObjectFile *ObjectFileELF::CreateMemoryInstance(
375     const lldb::ModuleSP &module_sp, DataBufferSP &data_sp,
376     const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) {
377   if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT)) {
378     const uint8_t *magic = data_sp->GetBytes();
379     if (ELFHeader::MagicBytesMatch(magic)) {
380       unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
381       if (address_size == 4 || address_size == 8) {
382         std::unique_ptr<ObjectFileELF> objfile_up(
383             new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
384         ArchSpec spec = objfile_up->GetArchitecture();
385         if (spec && objfile_up->SetModulesArchitecture(spec))
386           return objfile_up.release();
387       }
388     }
389   }
390   return nullptr;
391 }
392 
393 bool ObjectFileELF::MagicBytesMatch(DataBufferSP &data_sp,
394                                     lldb::addr_t data_offset,
395                                     lldb::addr_t data_length) {
396   if (data_sp &&
397       data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) {
398     const uint8_t *magic = data_sp->GetBytes() + data_offset;
399     return ELFHeader::MagicBytesMatch(magic);
400   }
401   return false;
402 }
403 
404 static uint32_t calc_crc32(uint32_t init, const DataExtractor &data) {
405   return llvm::crc32(
406       init, llvm::makeArrayRef(data.GetDataStart(), data.GetByteSize()));
407 }
408 
409 uint32_t ObjectFileELF::CalculateELFNotesSegmentsCRC32(
410     const ProgramHeaderColl &program_headers, DataExtractor &object_data) {
411 
412   uint32_t core_notes_crc = 0;
413 
414   for (const ELFProgramHeader &H : program_headers) {
415     if (H.p_type == llvm::ELF::PT_NOTE) {
416       const elf_off ph_offset = H.p_offset;
417       const size_t ph_size = H.p_filesz;
418 
419       DataExtractor segment_data;
420       if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size) {
421         // The ELF program header contained incorrect data, probably corefile
422         // is incomplete or corrupted.
423         break;
424       }
425 
426       core_notes_crc = calc_crc32(core_notes_crc, segment_data);
427     }
428   }
429 
430   return core_notes_crc;
431 }
432 
433 static const char *OSABIAsCString(unsigned char osabi_byte) {
434 #define _MAKE_OSABI_CASE(x)                                                    \
435   case x:                                                                      \
436     return #x
437   switch (osabi_byte) {
438     _MAKE_OSABI_CASE(ELFOSABI_NONE);
439     _MAKE_OSABI_CASE(ELFOSABI_HPUX);
440     _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
441     _MAKE_OSABI_CASE(ELFOSABI_GNU);
442     _MAKE_OSABI_CASE(ELFOSABI_HURD);
443     _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
444     _MAKE_OSABI_CASE(ELFOSABI_AIX);
445     _MAKE_OSABI_CASE(ELFOSABI_IRIX);
446     _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
447     _MAKE_OSABI_CASE(ELFOSABI_TRU64);
448     _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
449     _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
450     _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
451     _MAKE_OSABI_CASE(ELFOSABI_NSK);
452     _MAKE_OSABI_CASE(ELFOSABI_AROS);
453     _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
454     _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
455     _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
456     _MAKE_OSABI_CASE(ELFOSABI_ARM);
457     _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
458   default:
459     return "<unknown-osabi>";
460   }
461 #undef _MAKE_OSABI_CASE
462 }
463 
464 //
465 // WARNING : This function is being deprecated
466 // It's functionality has moved to ArchSpec::SetArchitecture This function is
467 // only being kept to validate the move.
468 //
469 // TODO : Remove this function
470 static bool GetOsFromOSABI(unsigned char osabi_byte,
471                            llvm::Triple::OSType &ostype) {
472   switch (osabi_byte) {
473   case ELFOSABI_AIX:
474     ostype = llvm::Triple::OSType::AIX;
475     break;
476   case ELFOSABI_FREEBSD:
477     ostype = llvm::Triple::OSType::FreeBSD;
478     break;
479   case ELFOSABI_GNU:
480     ostype = llvm::Triple::OSType::Linux;
481     break;
482   case ELFOSABI_NETBSD:
483     ostype = llvm::Triple::OSType::NetBSD;
484     break;
485   case ELFOSABI_OPENBSD:
486     ostype = llvm::Triple::OSType::OpenBSD;
487     break;
488   case ELFOSABI_SOLARIS:
489     ostype = llvm::Triple::OSType::Solaris;
490     break;
491   default:
492     ostype = llvm::Triple::OSType::UnknownOS;
493   }
494   return ostype != llvm::Triple::OSType::UnknownOS;
495 }
496 
497 size_t ObjectFileELF::GetModuleSpecifications(
498     const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp,
499     lldb::offset_t data_offset, lldb::offset_t file_offset,
500     lldb::offset_t length, lldb_private::ModuleSpecList &specs) {
501   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
502 
503   const size_t initial_count = specs.GetSize();
504 
505   if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) {
506     DataExtractor data;
507     data.SetData(data_sp);
508     elf::ELFHeader header;
509     lldb::offset_t header_offset = data_offset;
510     if (header.Parse(data, &header_offset)) {
511       if (data_sp) {
512         ModuleSpec spec(file);
513 
514         const uint32_t sub_type = subTypeFromElfHeader(header);
515         spec.GetArchitecture().SetArchitecture(
516             eArchTypeELF, header.e_machine, sub_type, header.e_ident[EI_OSABI]);
517 
518         if (spec.GetArchitecture().IsValid()) {
519           llvm::Triple::OSType ostype;
520           llvm::Triple::VendorType vendor;
521           llvm::Triple::OSType spec_ostype =
522               spec.GetArchitecture().GetTriple().getOS();
523 
524           LLDB_LOGF(log, "ObjectFileELF::%s file '%s' module OSABI: %s",
525                     __FUNCTION__, file.GetPath().c_str(),
526                     OSABIAsCString(header.e_ident[EI_OSABI]));
527 
528           // SetArchitecture should have set the vendor to unknown
529           vendor = spec.GetArchitecture().GetTriple().getVendor();
530           assert(vendor == llvm::Triple::UnknownVendor);
531           UNUSED_IF_ASSERT_DISABLED(vendor);
532 
533           //
534           // Validate it is ok to remove GetOsFromOSABI
535           GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
536           assert(spec_ostype == ostype);
537           if (spec_ostype != llvm::Triple::OSType::UnknownOS) {
538             LLDB_LOGF(log,
539                       "ObjectFileELF::%s file '%s' set ELF module OS type "
540                       "from ELF header OSABI.",
541                       __FUNCTION__, file.GetPath().c_str());
542           }
543 
544           if (data_sp->GetByteSize() < length)
545             data_sp = MapFileData(file, -1, file_offset);
546           if (data_sp)
547             data.SetData(data_sp);
548           // In case there is header extension in the section #0, the header we
549           // parsed above could have sentinel values for e_phnum, e_shnum, and
550           // e_shstrndx.  In this case we need to reparse the header with a
551           // bigger data source to get the actual values.
552           if (header.HasHeaderExtension()) {
553             lldb::offset_t header_offset = data_offset;
554             header.Parse(data, &header_offset);
555           }
556 
557           uint32_t gnu_debuglink_crc = 0;
558           std::string gnu_debuglink_file;
559           SectionHeaderColl section_headers;
560           lldb_private::UUID &uuid = spec.GetUUID();
561 
562           GetSectionHeaderInfo(section_headers, data, header, uuid,
563                                gnu_debuglink_file, gnu_debuglink_crc,
564                                spec.GetArchitecture());
565 
566           llvm::Triple &spec_triple = spec.GetArchitecture().GetTriple();
567 
568           LLDB_LOGF(log,
569                     "ObjectFileELF::%s file '%s' module set to triple: %s "
570                     "(architecture %s)",
571                     __FUNCTION__, file.GetPath().c_str(),
572                     spec_triple.getTriple().c_str(),
573                     spec.GetArchitecture().GetArchitectureName());
574 
575           if (!uuid.IsValid()) {
576             uint32_t core_notes_crc = 0;
577 
578             if (!gnu_debuglink_crc) {
579               LLDB_SCOPED_TIMERF(
580                   "Calculating module crc32 %s with size %" PRIu64 " KiB",
581                   file.GetLastPathComponent().AsCString(),
582                   (length - file_offset) / 1024);
583 
584               // For core files - which usually don't happen to have a
585               // gnu_debuglink, and are pretty bulky - calculating whole
586               // contents crc32 would be too much of luxury.  Thus we will need
587               // to fallback to something simpler.
588               if (header.e_type == llvm::ELF::ET_CORE) {
589                 ProgramHeaderColl program_headers;
590                 GetProgramHeaderInfo(program_headers, data, header);
591 
592                 core_notes_crc =
593                     CalculateELFNotesSegmentsCRC32(program_headers, data);
594               } else {
595                 gnu_debuglink_crc = calc_crc32(0, data);
596               }
597             }
598             using u32le = llvm::support::ulittle32_t;
599             if (gnu_debuglink_crc) {
600               // Use 4 bytes of crc from the .gnu_debuglink section.
601               u32le data(gnu_debuglink_crc);
602               uuid = UUID::fromData(&data, sizeof(data));
603             } else if (core_notes_crc) {
604               // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make
605               // it look different form .gnu_debuglink crc followed by 4 bytes
606               // of note segments crc.
607               u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)};
608               uuid = UUID::fromData(data, sizeof(data));
609             }
610           }
611 
612           specs.Append(spec);
613         }
614       }
615     }
616   }
617 
618   return specs.GetSize() - initial_count;
619 }
620 
621 // PluginInterface protocol
622 lldb_private::ConstString ObjectFileELF::GetPluginName() {
623   return GetPluginNameStatic();
624 }
625 
626 uint32_t ObjectFileELF::GetPluginVersion() { return m_plugin_version; }
627 // ObjectFile protocol
628 
629 ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
630                              DataBufferSP &data_sp, lldb::offset_t data_offset,
631                              const FileSpec *file, lldb::offset_t file_offset,
632                              lldb::offset_t length)
633     : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset) {
634   if (file)
635     m_file = *file;
636 }
637 
638 ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
639                              DataBufferSP &header_data_sp,
640                              const lldb::ProcessSP &process_sp,
641                              addr_t header_addr)
642     : ObjectFile(module_sp, process_sp, header_addr, header_data_sp) {}
643 
644 bool ObjectFileELF::IsExecutable() const {
645   return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
646 }
647 
648 bool ObjectFileELF::SetLoadAddress(Target &target, lldb::addr_t value,
649                                    bool value_is_offset) {
650   ModuleSP module_sp = GetModule();
651   if (module_sp) {
652     size_t num_loaded_sections = 0;
653     SectionList *section_list = GetSectionList();
654     if (section_list) {
655       if (!value_is_offset) {
656         addr_t base = GetBaseAddress().GetFileAddress();
657         if (base == LLDB_INVALID_ADDRESS)
658           return false;
659         value -= base;
660       }
661 
662       const size_t num_sections = section_list->GetSize();
663       size_t sect_idx = 0;
664 
665       for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
666         // Iterate through the object file sections to find all of the sections
667         // that have SHF_ALLOC in their flag bits.
668         SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
669         if (section_sp->Test(SHF_ALLOC) ||
670             section_sp->GetType() == eSectionTypeContainer) {
671           lldb::addr_t load_addr = section_sp->GetFileAddress();
672           // We don't want to update the load address of a section with type
673           // eSectionTypeAbsoluteAddress as they already have the absolute load
674           // address already specified
675           if (section_sp->GetType() != eSectionTypeAbsoluteAddress)
676             load_addr += value;
677 
678           // On 32-bit systems the load address have to fit into 4 bytes. The
679           // rest of the bytes are the overflow from the addition.
680           if (GetAddressByteSize() == 4)
681             load_addr &= 0xFFFFFFFF;
682 
683           if (target.GetSectionLoadList().SetSectionLoadAddress(section_sp,
684                                                                 load_addr))
685             ++num_loaded_sections;
686         }
687       }
688       return num_loaded_sections > 0;
689     }
690   }
691   return false;
692 }
693 
694 ByteOrder ObjectFileELF::GetByteOrder() const {
695   if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
696     return eByteOrderBig;
697   if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
698     return eByteOrderLittle;
699   return eByteOrderInvalid;
700 }
701 
702 uint32_t ObjectFileELF::GetAddressByteSize() const {
703   return m_data.GetAddressByteSize();
704 }
705 
706 AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) {
707   Symtab *symtab = GetSymtab();
708   if (!symtab)
709     return AddressClass::eUnknown;
710 
711   // The address class is determined based on the symtab. Ask it from the
712   // object file what contains the symtab information.
713   ObjectFile *symtab_objfile = symtab->GetObjectFile();
714   if (symtab_objfile != nullptr && symtab_objfile != this)
715     return symtab_objfile->GetAddressClass(file_addr);
716 
717   auto res = ObjectFile::GetAddressClass(file_addr);
718   if (res != AddressClass::eCode)
719     return res;
720 
721   auto ub = m_address_class_map.upper_bound(file_addr);
722   if (ub == m_address_class_map.begin()) {
723     // No entry in the address class map before the address. Return default
724     // address class for an address in a code section.
725     return AddressClass::eCode;
726   }
727 
728   // Move iterator to the address class entry preceding address
729   --ub;
730 
731   return ub->second;
732 }
733 
734 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
735   return std::distance(m_section_headers.begin(), I);
736 }
737 
738 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const {
739   return std::distance(m_section_headers.begin(), I);
740 }
741 
742 bool ObjectFileELF::ParseHeader() {
743   lldb::offset_t offset = 0;
744   return m_header.Parse(m_data, &offset);
745 }
746 
747 UUID ObjectFileELF::GetUUID() {
748   // Need to parse the section list to get the UUIDs, so make sure that's been
749   // done.
750   if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
751     return UUID();
752 
753   if (!m_uuid) {
754     using u32le = llvm::support::ulittle32_t;
755     if (GetType() == ObjectFile::eTypeCoreFile) {
756       uint32_t core_notes_crc = 0;
757 
758       if (!ParseProgramHeaders())
759         return UUID();
760 
761       core_notes_crc =
762           CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
763 
764       if (core_notes_crc) {
765         // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
766         // look different form .gnu_debuglink crc - followed by 4 bytes of note
767         // segments crc.
768         u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)};
769         m_uuid = UUID::fromData(data, sizeof(data));
770       }
771     } else {
772       if (!m_gnu_debuglink_crc)
773         m_gnu_debuglink_crc = calc_crc32(0, m_data);
774       if (m_gnu_debuglink_crc) {
775         // Use 4 bytes of crc from the .gnu_debuglink section.
776         u32le data(m_gnu_debuglink_crc);
777         m_uuid = UUID::fromData(&data, sizeof(data));
778       }
779     }
780   }
781 
782   return m_uuid;
783 }
784 
785 llvm::Optional<FileSpec> ObjectFileELF::GetDebugLink() {
786   if (m_gnu_debuglink_file.empty())
787     return llvm::None;
788   return FileSpec(m_gnu_debuglink_file);
789 }
790 
791 uint32_t ObjectFileELF::GetDependentModules(FileSpecList &files) {
792   size_t num_modules = ParseDependentModules();
793   uint32_t num_specs = 0;
794 
795   for (unsigned i = 0; i < num_modules; ++i) {
796     if (files.AppendIfUnique(m_filespec_up->GetFileSpecAtIndex(i)))
797       num_specs++;
798   }
799 
800   return num_specs;
801 }
802 
803 Address ObjectFileELF::GetImageInfoAddress(Target *target) {
804   if (!ParseDynamicSymbols())
805     return Address();
806 
807   SectionList *section_list = GetSectionList();
808   if (!section_list)
809     return Address();
810 
811   // Find the SHT_DYNAMIC (.dynamic) section.
812   SectionSP dynsym_section_sp(
813       section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true));
814   if (!dynsym_section_sp)
815     return Address();
816   assert(dynsym_section_sp->GetObjectFile() == this);
817 
818   user_id_t dynsym_id = dynsym_section_sp->GetID();
819   const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
820   if (!dynsym_hdr)
821     return Address();
822 
823   for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) {
824     ELFDynamic &symbol = m_dynamic_symbols[i];
825 
826     if (symbol.d_tag == DT_DEBUG) {
827       // Compute the offset as the number of previous entries plus the size of
828       // d_tag.
829       addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
830       return Address(dynsym_section_sp, offset);
831     }
832     // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP
833     // exists in non-PIE.
834     else if ((symbol.d_tag == DT_MIPS_RLD_MAP ||
835               symbol.d_tag == DT_MIPS_RLD_MAP_REL) &&
836              target) {
837       addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
838       addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
839       if (dyn_base == LLDB_INVALID_ADDRESS)
840         return Address();
841 
842       Status error;
843       if (symbol.d_tag == DT_MIPS_RLD_MAP) {
844         // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer.
845         Address addr;
846         if (target->ReadPointerFromMemory(dyn_base + offset, false, error,
847                                           addr))
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, false, GetAddressByteSize(), UINT64_MAX, error);
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(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_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(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_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 = VMMap(Alloc);
1683   VMMap Sections = VMMap(Alloc);
1684   lldb_private::Log *Log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_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 =
2621                 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES);
2622             LLDB_LOGF(log, "Failed to apply debug info relocations");
2623             break;
2624           }
2625           uint32_t truncated_addr = (value & 0xFFFFFFFF);
2626           DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2627           uint32_t *dst = reinterpret_cast<uint32_t *>(
2628               data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2629               ELFRelocation::RelocOffset32(rel));
2630           memcpy(dst, &truncated_addr, sizeof(uint32_t));
2631         }
2632         break;
2633       }
2634       case R_X86_64_PC32:
2635       default:
2636         assert(false && "unexpected relocation type");
2637       }
2638     }
2639   }
2640 
2641   return 0;
2642 }
2643 
2644 unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr,
2645                                               user_id_t rel_id,
2646                                               lldb_private::Symtab *thetab) {
2647   assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2648 
2649   // Parse in the section list if needed.
2650   SectionList *section_list = GetSectionList();
2651   if (!section_list)
2652     return 0;
2653 
2654   user_id_t symtab_id = rel_hdr->sh_link;
2655   user_id_t debug_id = rel_hdr->sh_info;
2656 
2657   const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2658   if (!symtab_hdr)
2659     return 0;
2660 
2661   const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2662   if (!debug_hdr)
2663     return 0;
2664 
2665   Section *rel = section_list->FindSectionByID(rel_id).get();
2666   if (!rel)
2667     return 0;
2668 
2669   Section *symtab = section_list->FindSectionByID(symtab_id).get();
2670   if (!symtab)
2671     return 0;
2672 
2673   Section *debug = section_list->FindSectionByID(debug_id).get();
2674   if (!debug)
2675     return 0;
2676 
2677   DataExtractor rel_data;
2678   DataExtractor symtab_data;
2679   DataExtractor debug_data;
2680 
2681   if (GetData(rel->GetFileOffset(), rel->GetFileSize(), rel_data) &&
2682       GetData(symtab->GetFileOffset(), symtab->GetFileSize(), symtab_data) &&
2683       GetData(debug->GetFileOffset(), debug->GetFileSize(), debug_data)) {
2684     ApplyRelocations(thetab, &m_header, rel_hdr, symtab_hdr, debug_hdr,
2685                      rel_data, symtab_data, debug_data, debug);
2686   }
2687 
2688   return 0;
2689 }
2690 
2691 Symtab *ObjectFileELF::GetSymtab() {
2692   ModuleSP module_sp(GetModule());
2693   if (!module_sp)
2694     return nullptr;
2695 
2696   // We always want to use the main object file so we (hopefully) only have one
2697   // cached copy of our symtab, dynamic sections, etc.
2698   ObjectFile *module_obj_file = module_sp->GetObjectFile();
2699   if (module_obj_file && module_obj_file != this)
2700     return module_obj_file->GetSymtab();
2701 
2702   if (m_symtab_up == nullptr) {
2703     SectionList *section_list = module_sp->GetSectionList();
2704     if (!section_list)
2705       return nullptr;
2706 
2707     uint64_t symbol_id = 0;
2708     std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
2709 
2710     // Sharable objects and dynamic executables usually have 2 distinct symbol
2711     // tables, one named ".symtab", and the other ".dynsym". The dynsym is a
2712     // smaller version of the symtab that only contains global symbols. The
2713     // information found in the dynsym is therefore also found in the symtab,
2714     // while the reverse is not necessarily true.
2715     Section *symtab =
2716         section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get();
2717     if (symtab) {
2718       m_symtab_up = std::make_unique<Symtab>(symtab->GetObjectFile());
2719       symbol_id += ParseSymbolTable(m_symtab_up.get(), symbol_id, symtab);
2720     }
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         if (!m_symtab_up)
2735           m_symtab_up = std::make_unique<Symtab>(dynsym->GetObjectFile());
2736         symbol_id += ParseSymbolTable(m_symtab_up.get(), symbol_id, dynsym);
2737       }
2738     }
2739 
2740     // DT_JMPREL
2741     //      If present, this entry's d_ptr member holds the address of
2742     //      relocation
2743     //      entries associated solely with the procedure linkage table.
2744     //      Separating
2745     //      these relocation entries lets the dynamic linker ignore them during
2746     //      process initialization, if lazy binding is enabled. If this entry is
2747     //      present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2748     //      also be present.
2749     const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2750     if (symbol) {
2751       // Synthesize trampoline symbols to help navigate the PLT.
2752       addr_t addr = symbol->d_ptr;
2753       Section *reloc_section =
2754           section_list->FindSectionContainingFileAddress(addr).get();
2755       if (reloc_section) {
2756         user_id_t reloc_id = reloc_section->GetID();
2757         const ELFSectionHeaderInfo *reloc_header =
2758             GetSectionHeaderByIndex(reloc_id);
2759         assert(reloc_header);
2760 
2761         if (m_symtab_up == nullptr)
2762           m_symtab_up =
2763               std::make_unique<Symtab>(reloc_section->GetObjectFile());
2764 
2765         ParseTrampolineSymbols(m_symtab_up.get(), symbol_id, reloc_header,
2766                                reloc_id);
2767       }
2768     }
2769 
2770     if (DWARFCallFrameInfo *eh_frame =
2771             GetModule()->GetUnwindTable().GetEHFrameInfo()) {
2772       if (m_symtab_up == nullptr)
2773         m_symtab_up = std::make_unique<Symtab>(this);
2774       ParseUnwindSymbols(m_symtab_up.get(), eh_frame);
2775     }
2776 
2777     // If we still don't have any symtab then create an empty instance to avoid
2778     // do the section lookup next time.
2779     if (m_symtab_up == nullptr)
2780       m_symtab_up = std::make_unique<Symtab>(this);
2781 
2782     // In the event that there's no symbol entry for the entry point we'll
2783     // artificially create one. We delegate to the symtab object the figuring
2784     // out of the proper size, this will usually make it span til the next
2785     // symbol it finds in the section. This means that if there are missing
2786     // symbols the entry point might span beyond its function definition.
2787     // We're fine with this as it doesn't make it worse than not having a
2788     // symbol entry at all.
2789     if (CalculateType() == eTypeExecutable) {
2790       ArchSpec arch = GetArchitecture();
2791       auto entry_point_addr = GetEntryPointAddress();
2792       bool is_valid_entry_point =
2793           entry_point_addr.IsValid() && entry_point_addr.IsSectionOffset();
2794       addr_t entry_point_file_addr = entry_point_addr.GetFileAddress();
2795       if (is_valid_entry_point && !m_symtab_up->FindSymbolContainingFileAddress(
2796                                       entry_point_file_addr)) {
2797         uint64_t symbol_id = m_symtab_up->GetNumSymbols();
2798         Symbol symbol(symbol_id,
2799                       GetNextSyntheticSymbolName().GetCString(), // Symbol name.
2800                       eSymbolTypeCode, // Type of this symbol.
2801                       true,            // Is this globally visible?
2802                       false,           // Is this symbol debug info?
2803                       false,           // Is this symbol a trampoline?
2804                       true,            // Is this symbol artificial?
2805                       entry_point_addr.GetSection(), // Section where this
2806                                                      // symbol is defined.
2807                       0,     // Offset in section or symbol value.
2808                       0,     // Size.
2809                       false, // Size is valid.
2810                       false, // Contains linker annotations?
2811                       0);    // Symbol flags.
2812         m_symtab_up->AddSymbol(symbol);
2813         // When the entry point is arm thumb we need to explicitly set its
2814         // class address to reflect that. This is important because expression
2815         // evaluation relies on correctly setting a breakpoint at this
2816         // address.
2817         if (arch.GetMachine() == llvm::Triple::arm &&
2818             (entry_point_file_addr & 1))
2819           m_address_class_map[entry_point_file_addr ^ 1] =
2820               AddressClass::eCodeAlternateISA;
2821         else
2822           m_address_class_map[entry_point_file_addr] = AddressClass::eCode;
2823       }
2824     }
2825 
2826     m_symtab_up->CalculateSymbolSizes();
2827   }
2828 
2829   return m_symtab_up.get();
2830 }
2831 
2832 void ObjectFileELF::RelocateSection(lldb_private::Section *section)
2833 {
2834   static const char *debug_prefix = ".debug";
2835 
2836   // Set relocated bit so we stop getting called, regardless of whether we
2837   // actually relocate.
2838   section->SetIsRelocated(true);
2839 
2840   // We only relocate in ELF relocatable files
2841   if (CalculateType() != eTypeObjectFile)
2842     return;
2843 
2844   const char *section_name = section->GetName().GetCString();
2845   // Can't relocate that which can't be named
2846   if (section_name == nullptr)
2847     return;
2848 
2849   // We don't relocate non-debug sections at the moment
2850   if (strncmp(section_name, debug_prefix, strlen(debug_prefix)))
2851     return;
2852 
2853   // Relocation section names to look for
2854   std::string needle = std::string(".rel") + section_name;
2855   std::string needlea = std::string(".rela") + section_name;
2856 
2857   for (SectionHeaderCollIter I = m_section_headers.begin();
2858        I != m_section_headers.end(); ++I) {
2859     if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) {
2860       const char *hay_name = I->section_name.GetCString();
2861       if (hay_name == nullptr)
2862         continue;
2863       if (needle == hay_name || needlea == hay_name) {
2864         const ELFSectionHeader &reloc_header = *I;
2865         user_id_t reloc_id = SectionIndex(I);
2866         RelocateDebugSections(&reloc_header, reloc_id, GetSymtab());
2867         break;
2868       }
2869     }
2870   }
2871 }
2872 
2873 void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table,
2874                                        DWARFCallFrameInfo *eh_frame) {
2875   SectionList *section_list = GetSectionList();
2876   if (!section_list)
2877     return;
2878 
2879   // First we save the new symbols into a separate list and add them to the
2880   // symbol table after we collected all symbols we want to add. This is
2881   // neccessary because adding a new symbol invalidates the internal index of
2882   // the symtab what causing the next lookup to be slow because it have to
2883   // recalculate the index first.
2884   std::vector<Symbol> new_symbols;
2885 
2886   eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols](
2887       lldb::addr_t file_addr, uint32_t size, dw_offset_t) {
2888     Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
2889     if (symbol) {
2890       if (!symbol->GetByteSizeIsValid()) {
2891         symbol->SetByteSize(size);
2892         symbol->SetSizeIsSynthesized(true);
2893       }
2894     } else {
2895       SectionSP section_sp =
2896           section_list->FindSectionContainingFileAddress(file_addr);
2897       if (section_sp) {
2898         addr_t offset = file_addr - section_sp->GetFileAddress();
2899         const char *symbol_name = GetNextSyntheticSymbolName().GetCString();
2900         uint64_t symbol_id = symbol_table->GetNumSymbols();
2901         Symbol eh_symbol(
2902             symbol_id,       // Symbol table index.
2903             symbol_name,     // Symbol name.
2904             eSymbolTypeCode, // Type of this symbol.
2905             true,            // Is this globally visible?
2906             false,           // Is this symbol debug info?
2907             false,           // Is this symbol a trampoline?
2908             true,            // Is this symbol artificial?
2909             section_sp,      // Section in which this symbol is defined or null.
2910             offset,          // Offset in section or symbol value.
2911             0,     // Size:          Don't specify the size as an FDE can
2912             false, // Size is valid: cover multiple symbols.
2913             false, // Contains linker annotations?
2914             0);    // Symbol flags.
2915         new_symbols.push_back(eh_symbol);
2916       }
2917     }
2918     return true;
2919   });
2920 
2921   for (const Symbol &s : new_symbols)
2922     symbol_table->AddSymbol(s);
2923 }
2924 
2925 bool ObjectFileELF::IsStripped() {
2926   // TODO: determine this for ELF
2927   return false;
2928 }
2929 
2930 //===----------------------------------------------------------------------===//
2931 // Dump
2932 //
2933 // Dump the specifics of the runtime file container (such as any headers
2934 // segments, sections, etc).
2935 void ObjectFileELF::Dump(Stream *s) {
2936   ModuleSP module_sp(GetModule());
2937   if (!module_sp) {
2938     return;
2939   }
2940 
2941   std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
2942   s->Printf("%p: ", static_cast<void *>(this));
2943   s->Indent();
2944   s->PutCString("ObjectFileELF");
2945 
2946   ArchSpec header_arch = GetArchitecture();
2947 
2948   *s << ", file = '" << m_file
2949      << "', arch = " << header_arch.GetArchitectureName() << "\n";
2950 
2951   DumpELFHeader(s, m_header);
2952   s->EOL();
2953   DumpELFProgramHeaders(s);
2954   s->EOL();
2955   DumpELFSectionHeaders(s);
2956   s->EOL();
2957   SectionList *section_list = GetSectionList();
2958   if (section_list)
2959     section_list->Dump(s->AsRawOstream(), s->GetIndentLevel(), nullptr, true,
2960                        UINT32_MAX);
2961   Symtab *symtab = GetSymtab();
2962   if (symtab)
2963     symtab->Dump(s, nullptr, eSortOrderNone);
2964   s->EOL();
2965   DumpDependentModules(s);
2966   s->EOL();
2967 }
2968 
2969 // DumpELFHeader
2970 //
2971 // Dump the ELF header to the specified output stream
2972 void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) {
2973   s->PutCString("ELF Header\n");
2974   s->Printf("e_ident[EI_MAG0   ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2975   s->Printf("e_ident[EI_MAG1   ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1],
2976             header.e_ident[EI_MAG1]);
2977   s->Printf("e_ident[EI_MAG2   ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2],
2978             header.e_ident[EI_MAG2]);
2979   s->Printf("e_ident[EI_MAG3   ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3],
2980             header.e_ident[EI_MAG3]);
2981 
2982   s->Printf("e_ident[EI_CLASS  ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2983   s->Printf("e_ident[EI_DATA   ] = 0x%2.2x ", header.e_ident[EI_DATA]);
2984   DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2985   s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2986   s->Printf("e_ident[EI_PAD    ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
2987 
2988   s->Printf("e_type      = 0x%4.4x ", header.e_type);
2989   DumpELFHeader_e_type(s, header.e_type);
2990   s->Printf("\ne_machine   = 0x%4.4x\n", header.e_machine);
2991   s->Printf("e_version   = 0x%8.8x\n", header.e_version);
2992   s->Printf("e_entry     = 0x%8.8" PRIx64 "\n", header.e_entry);
2993   s->Printf("e_phoff     = 0x%8.8" PRIx64 "\n", header.e_phoff);
2994   s->Printf("e_shoff     = 0x%8.8" PRIx64 "\n", header.e_shoff);
2995   s->Printf("e_flags     = 0x%8.8x\n", header.e_flags);
2996   s->Printf("e_ehsize    = 0x%4.4x\n", header.e_ehsize);
2997   s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
2998   s->Printf("e_phnum     = 0x%8.8x\n", header.e_phnum);
2999   s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
3000   s->Printf("e_shnum     = 0x%8.8x\n", header.e_shnum);
3001   s->Printf("e_shstrndx  = 0x%8.8x\n", header.e_shstrndx);
3002 }
3003 
3004 // DumpELFHeader_e_type
3005 //
3006 // Dump an token value for the ELF header member e_type
3007 void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) {
3008   switch (e_type) {
3009   case ET_NONE:
3010     *s << "ET_NONE";
3011     break;
3012   case ET_REL:
3013     *s << "ET_REL";
3014     break;
3015   case ET_EXEC:
3016     *s << "ET_EXEC";
3017     break;
3018   case ET_DYN:
3019     *s << "ET_DYN";
3020     break;
3021   case ET_CORE:
3022     *s << "ET_CORE";
3023     break;
3024   default:
3025     break;
3026   }
3027 }
3028 
3029 // DumpELFHeader_e_ident_EI_DATA
3030 //
3031 // Dump an token value for the ELF header member e_ident[EI_DATA]
3032 void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s,
3033                                                   unsigned char ei_data) {
3034   switch (ei_data) {
3035   case ELFDATANONE:
3036     *s << "ELFDATANONE";
3037     break;
3038   case ELFDATA2LSB:
3039     *s << "ELFDATA2LSB - Little Endian";
3040     break;
3041   case ELFDATA2MSB:
3042     *s << "ELFDATA2MSB - Big Endian";
3043     break;
3044   default:
3045     break;
3046   }
3047 }
3048 
3049 // DumpELFProgramHeader
3050 //
3051 // Dump a single ELF program header to the specified output stream
3052 void ObjectFileELF::DumpELFProgramHeader(Stream *s,
3053                                          const ELFProgramHeader &ph) {
3054   DumpELFProgramHeader_p_type(s, ph.p_type);
3055   s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset,
3056             ph.p_vaddr, ph.p_paddr);
3057   s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz,
3058             ph.p_flags);
3059 
3060   DumpELFProgramHeader_p_flags(s, ph.p_flags);
3061   s->Printf(") %8.8" PRIx64, ph.p_align);
3062 }
3063 
3064 // DumpELFProgramHeader_p_type
3065 //
3066 // Dump an token value for the ELF program header member p_type which describes
3067 // the type of the program header
3068 void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) {
3069   const int kStrWidth = 15;
3070   switch (p_type) {
3071     CASE_AND_STREAM(s, PT_NULL, kStrWidth);
3072     CASE_AND_STREAM(s, PT_LOAD, kStrWidth);
3073     CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth);
3074     CASE_AND_STREAM(s, PT_INTERP, kStrWidth);
3075     CASE_AND_STREAM(s, PT_NOTE, kStrWidth);
3076     CASE_AND_STREAM(s, PT_SHLIB, kStrWidth);
3077     CASE_AND_STREAM(s, PT_PHDR, kStrWidth);
3078     CASE_AND_STREAM(s, PT_TLS, kStrWidth);
3079     CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
3080   default:
3081     s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
3082     break;
3083   }
3084 }
3085 
3086 // DumpELFProgramHeader_p_flags
3087 //
3088 // Dump an token value for the ELF program header member p_flags
3089 void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) {
3090   *s << ((p_flags & PF_X) ? "PF_X" : "    ")
3091      << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
3092      << ((p_flags & PF_W) ? "PF_W" : "    ")
3093      << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
3094      << ((p_flags & PF_R) ? "PF_R" : "    ");
3095 }
3096 
3097 // DumpELFProgramHeaders
3098 //
3099 // Dump all of the ELF program header to the specified output stream
3100 void ObjectFileELF::DumpELFProgramHeaders(Stream *s) {
3101   if (!ParseProgramHeaders())
3102     return;
3103 
3104   s->PutCString("Program Headers\n");
3105   s->PutCString("IDX  p_type          p_offset p_vaddr  p_paddr  "
3106                 "p_filesz p_memsz  p_flags                   p_align\n");
3107   s->PutCString("==== --------------- -------- -------- -------- "
3108                 "-------- -------- ------------------------- --------\n");
3109 
3110   for (const auto &H : llvm::enumerate(m_program_headers)) {
3111     s->Format("[{0,2}] ", H.index());
3112     ObjectFileELF::DumpELFProgramHeader(s, H.value());
3113     s->EOL();
3114   }
3115 }
3116 
3117 // DumpELFSectionHeader
3118 //
3119 // Dump a single ELF section header to the specified output stream
3120 void ObjectFileELF::DumpELFSectionHeader(Stream *s,
3121                                          const ELFSectionHeaderInfo &sh) {
3122   s->Printf("%8.8x ", sh.sh_name);
3123   DumpELFSectionHeader_sh_type(s, sh.sh_type);
3124   s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
3125   DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
3126   s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr,
3127             sh.sh_offset, sh.sh_size);
3128   s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
3129   s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
3130 }
3131 
3132 // DumpELFSectionHeader_sh_type
3133 //
3134 // Dump an token value for the ELF section header member sh_type which
3135 // describes the type of the section
3136 void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) {
3137   const int kStrWidth = 12;
3138   switch (sh_type) {
3139     CASE_AND_STREAM(s, SHT_NULL, kStrWidth);
3140     CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth);
3141     CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth);
3142     CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth);
3143     CASE_AND_STREAM(s, SHT_RELA, kStrWidth);
3144     CASE_AND_STREAM(s, SHT_HASH, kStrWidth);
3145     CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth);
3146     CASE_AND_STREAM(s, SHT_NOTE, kStrWidth);
3147     CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth);
3148     CASE_AND_STREAM(s, SHT_REL, kStrWidth);
3149     CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth);
3150     CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth);
3151     CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth);
3152     CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth);
3153     CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth);
3154     CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth);
3155   default:
3156     s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
3157     break;
3158   }
3159 }
3160 
3161 // DumpELFSectionHeader_sh_flags
3162 //
3163 // Dump an token value for the ELF section header member sh_flags
3164 void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s,
3165                                                   elf_xword sh_flags) {
3166   *s << ((sh_flags & SHF_WRITE) ? "WRITE" : "     ")
3167      << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
3168      << ((sh_flags & SHF_ALLOC) ? "ALLOC" : "     ")
3169      << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
3170      << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : "         ");
3171 }
3172 
3173 // DumpELFSectionHeaders
3174 //
3175 // Dump all of the ELF section header to the specified output stream
3176 void ObjectFileELF::DumpELFSectionHeaders(Stream *s) {
3177   if (!ParseSectionHeaders())
3178     return;
3179 
3180   s->PutCString("Section Headers\n");
3181   s->PutCString("IDX  name     type         flags                            "
3182                 "addr     offset   size     link     info     addralgn "
3183                 "entsize  Name\n");
3184   s->PutCString("==== -------- ------------ -------------------------------- "
3185                 "-------- -------- -------- -------- -------- -------- "
3186                 "-------- ====================\n");
3187 
3188   uint32_t idx = 0;
3189   for (SectionHeaderCollConstIter I = m_section_headers.begin();
3190        I != m_section_headers.end(); ++I, ++idx) {
3191     s->Printf("[%2u] ", idx);
3192     ObjectFileELF::DumpELFSectionHeader(s, *I);
3193     const char *section_name = I->section_name.AsCString("");
3194     if (section_name)
3195       *s << ' ' << section_name << "\n";
3196   }
3197 }
3198 
3199 void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) {
3200   size_t num_modules = ParseDependentModules();
3201 
3202   if (num_modules > 0) {
3203     s->PutCString("Dependent Modules:\n");
3204     for (unsigned i = 0; i < num_modules; ++i) {
3205       const FileSpec &spec = m_filespec_up->GetFileSpecAtIndex(i);
3206       s->Printf("   %s\n", spec.GetFilename().GetCString());
3207     }
3208   }
3209 }
3210 
3211 ArchSpec ObjectFileELF::GetArchitecture() {
3212   if (!ParseHeader())
3213     return ArchSpec();
3214 
3215   if (m_section_headers.empty()) {
3216     // Allow elf notes to be parsed which may affect the detected architecture.
3217     ParseSectionHeaders();
3218   }
3219 
3220   if (CalculateType() == eTypeCoreFile &&
3221       !m_arch_spec.TripleOSWasSpecified()) {
3222     // Core files don't have section headers yet they have PT_NOTE program
3223     // headers that might shed more light on the architecture
3224     for (const elf::ELFProgramHeader &H : ProgramHeaders()) {
3225       if (H.p_type != PT_NOTE || H.p_offset == 0 || H.p_filesz == 0)
3226         continue;
3227       DataExtractor data;
3228       if (data.SetData(m_data, H.p_offset, H.p_filesz) == H.p_filesz) {
3229         UUID uuid;
3230         RefineModuleDetailsFromNote(data, m_arch_spec, uuid);
3231       }
3232     }
3233   }
3234   return m_arch_spec;
3235 }
3236 
3237 ObjectFile::Type ObjectFileELF::CalculateType() {
3238   switch (m_header.e_type) {
3239   case llvm::ELF::ET_NONE:
3240     // 0 - No file type
3241     return eTypeUnknown;
3242 
3243   case llvm::ELF::ET_REL:
3244     // 1 - Relocatable file
3245     return eTypeObjectFile;
3246 
3247   case llvm::ELF::ET_EXEC:
3248     // 2 - Executable file
3249     return eTypeExecutable;
3250 
3251   case llvm::ELF::ET_DYN:
3252     // 3 - Shared object file
3253     return eTypeSharedLibrary;
3254 
3255   case ET_CORE:
3256     // 4 - Core file
3257     return eTypeCoreFile;
3258 
3259   default:
3260     break;
3261   }
3262   return eTypeUnknown;
3263 }
3264 
3265 ObjectFile::Strata ObjectFileELF::CalculateStrata() {
3266   switch (m_header.e_type) {
3267   case llvm::ELF::ET_NONE:
3268     // 0 - No file type
3269     return eStrataUnknown;
3270 
3271   case llvm::ELF::ET_REL:
3272     // 1 - Relocatable file
3273     return eStrataUnknown;
3274 
3275   case llvm::ELF::ET_EXEC:
3276     // 2 - Executable file
3277     // TODO: is there any way to detect that an executable is a kernel
3278     // related executable by inspecting the program headers, section headers,
3279     // symbols, or any other flag bits???
3280     return eStrataUser;
3281 
3282   case llvm::ELF::ET_DYN:
3283     // 3 - Shared object file
3284     // TODO: is there any way to detect that an shared library is a kernel
3285     // related executable by inspecting the program headers, section headers,
3286     // symbols, or any other flag bits???
3287     return eStrataUnknown;
3288 
3289   case ET_CORE:
3290     // 4 - Core file
3291     // TODO: is there any way to detect that an core file is a kernel
3292     // related executable by inspecting the program headers, section headers,
3293     // symbols, or any other flag bits???
3294     return eStrataUnknown;
3295 
3296   default:
3297     break;
3298   }
3299   return eStrataUnknown;
3300 }
3301 
3302 size_t ObjectFileELF::ReadSectionData(Section *section,
3303                        lldb::offset_t section_offset, void *dst,
3304                        size_t dst_len) {
3305   // If some other objectfile owns this data, pass this to them.
3306   if (section->GetObjectFile() != this)
3307     return section->GetObjectFile()->ReadSectionData(section, section_offset,
3308                                                      dst, dst_len);
3309 
3310   if (!section->Test(SHF_COMPRESSED))
3311     return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len);
3312 
3313   // For compressed sections we need to read to full data to be able to
3314   // decompress.
3315   DataExtractor data;
3316   ReadSectionData(section, data);
3317   return data.CopyData(section_offset, dst_len, dst);
3318 }
3319 
3320 size_t ObjectFileELF::ReadSectionData(Section *section,
3321                                       DataExtractor &section_data) {
3322   // If some other objectfile owns this data, pass this to them.
3323   if (section->GetObjectFile() != this)
3324     return section->GetObjectFile()->ReadSectionData(section, section_data);
3325 
3326   size_t result = ObjectFile::ReadSectionData(section, section_data);
3327   if (result == 0 || !llvm::object::Decompressor::isCompressedELFSection(
3328                          section->Get(), section->GetName().GetStringRef()))
3329     return result;
3330 
3331   auto Decompressor = llvm::object::Decompressor::create(
3332       section->GetName().GetStringRef(),
3333       {reinterpret_cast<const char *>(section_data.GetDataStart()),
3334        size_t(section_data.GetByteSize())},
3335       GetByteOrder() == eByteOrderLittle, GetAddressByteSize() == 8);
3336   if (!Decompressor) {
3337     GetModule()->ReportWarning(
3338         "Unable to initialize decompressor for section '%s': %s",
3339         section->GetName().GetCString(),
3340         llvm::toString(Decompressor.takeError()).c_str());
3341     section_data.Clear();
3342     return 0;
3343   }
3344 
3345   auto buffer_sp =
3346       std::make_shared<DataBufferHeap>(Decompressor->getDecompressedSize(), 0);
3347   if (auto error = Decompressor->decompress(
3348           {reinterpret_cast<char *>(buffer_sp->GetBytes()),
3349            size_t(buffer_sp->GetByteSize())})) {
3350     GetModule()->ReportWarning(
3351         "Decompression of section '%s' failed: %s",
3352         section->GetName().GetCString(),
3353         llvm::toString(std::move(error)).c_str());
3354     section_data.Clear();
3355     return 0;
3356   }
3357 
3358   section_data.SetData(buffer_sp);
3359   return buffer_sp->GetByteSize();
3360 }
3361 
3362 llvm::ArrayRef<ELFProgramHeader> ObjectFileELF::ProgramHeaders() {
3363   ParseProgramHeaders();
3364   return m_program_headers;
3365 }
3366 
3367 DataExtractor ObjectFileELF::GetSegmentData(const ELFProgramHeader &H) {
3368   return DataExtractor(m_data, H.p_offset, H.p_filesz);
3369 }
3370 
3371 bool ObjectFileELF::AnySegmentHasPhysicalAddress() {
3372   for (const ELFProgramHeader &H : ProgramHeaders()) {
3373     if (H.p_paddr != 0)
3374       return true;
3375   }
3376   return false;
3377 }
3378 
3379 std::vector<ObjectFile::LoadableData>
3380 ObjectFileELF::GetLoadableData(Target &target) {
3381   // Create a list of loadable data from loadable segments, using physical
3382   // addresses if they aren't all null
3383   std::vector<LoadableData> loadables;
3384   bool should_use_paddr = AnySegmentHasPhysicalAddress();
3385   for (const ELFProgramHeader &H : ProgramHeaders()) {
3386     LoadableData loadable;
3387     if (H.p_type != llvm::ELF::PT_LOAD)
3388       continue;
3389     loadable.Dest = should_use_paddr ? H.p_paddr : H.p_vaddr;
3390     if (loadable.Dest == LLDB_INVALID_ADDRESS)
3391       continue;
3392     if (H.p_filesz == 0)
3393       continue;
3394     auto segment_data = GetSegmentData(H);
3395     loadable.Contents = llvm::ArrayRef<uint8_t>(segment_data.GetDataStart(),
3396                                                 segment_data.GetByteSize());
3397     loadables.push_back(loadable);
3398   }
3399   return loadables;
3400 }
3401