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