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