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