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 #if 0
1658         if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
1659             arch_spec.GetTriple().setOSName(HostInfo::GetOSString().data());
1660 #endif
1661         return 0;
1662     }
1663 
1664     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1665 
1666     section_headers.resize(header.e_shnum);
1667     if (section_headers.size() != header.e_shnum)
1668         return 0;
1669 
1670     const size_t sh_size = header.e_shnum * header.e_shentsize;
1671     const elf_off sh_offset = header.e_shoff;
1672     DataExtractor sh_data;
1673     if (set_data (sh_data, sh_offset, sh_size) != sh_size)
1674         return 0;
1675 
1676     uint32_t idx;
1677     lldb::offset_t offset;
1678     for (idx = 0, offset = 0; idx < header.e_shnum; ++idx)
1679     {
1680         if (section_headers[idx].Parse(sh_data, &offset) == false)
1681             break;
1682     }
1683     if (idx < section_headers.size())
1684         section_headers.resize(idx);
1685 
1686     const unsigned strtab_idx = header.e_shstrndx;
1687     if (strtab_idx && strtab_idx < section_headers.size())
1688     {
1689         const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1690         const size_t byte_size = sheader.sh_size;
1691         const Elf64_Off offset = sheader.sh_offset;
1692         lldb_private::DataExtractor shstr_data;
1693 
1694         if (set_data (shstr_data, offset, byte_size) == byte_size)
1695         {
1696             for (SectionHeaderCollIter I = section_headers.begin();
1697                  I != section_headers.end(); ++I)
1698             {
1699                 static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink");
1700                 const ELFSectionHeaderInfo &sheader = *I;
1701                 const uint64_t section_size = sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size;
1702                 ConstString name(shstr_data.PeekCStr(I->sh_name));
1703 
1704                 I->section_name = name;
1705 
1706                 if (arch_spec.IsMIPS())
1707                 {
1708                     uint32_t arch_flags = arch_spec.GetFlags ();
1709                     DataExtractor data;
1710                     if (sheader.sh_type == SHT_MIPS_ABIFLAGS)
1711                     {
1712 
1713                         if (section_size && (set_data (data, sheader.sh_offset, section_size) == section_size))
1714                         {
1715                             // MIPS ASE Mask is at offset 12 in MIPS.abiflags section
1716                             lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0
1717                             arch_flags |= data.GetU32 (&offset);
1718 
1719                             // The floating point ABI is at offset 7
1720                             offset = 7;
1721                             switch (data.GetU8 (&offset))
1722                             {
1723                                 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY :
1724                                     arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY;
1725                                     break;
1726                                 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE :
1727                                     arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE;
1728                                     break;
1729                                 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE :
1730                                     arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE;
1731                                     break;
1732                                 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT :
1733                                     arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT;
1734                                     break;
1735                                 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64 :
1736                                     arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64;
1737                                     break;
1738                                 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX :
1739                                     arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX;
1740                                     break;
1741                                 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64 :
1742                                     arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64;
1743                                     break;
1744                                 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A :
1745                                     arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A;
1746                                     break;
1747                             }
1748                         }
1749                     }
1750                     // Settings appropriate ArchSpec ABI Flags
1751                     switch(header.e_flags & llvm::ELF::EF_MIPS_ABI)
1752                     {
1753                         case llvm::ELF::EF_MIPS_ABI_O32:
1754                             arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32;
1755                             break;
1756                         case EF_MIPS_ABI_O64:
1757                             arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64;
1758                             break;
1759                         case EF_MIPS_ABI_EABI32:
1760                             arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32;
1761                             break;
1762                         case EF_MIPS_ABI_EABI64:
1763                             arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64;
1764                             break;
1765                         default:
1766                             // ABI Mask doesn't cover N32 and N64 ABI.
1767                             if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64)
1768                                 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64;
1769                             else if (header.e_flags && llvm::ELF::EF_MIPS_ABI2)
1770                                 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32;
1771                                 break;
1772                     }
1773                     arch_spec.SetFlags (arch_flags);
1774                 }
1775 
1776                 if (arch_spec.GetMachine() == llvm::Triple::arm || arch_spec.GetMachine() == llvm::Triple::thumb)
1777                 {
1778                     DataExtractor data;
1779 
1780                     if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 &&
1781                         set_data(data, sheader.sh_offset, section_size) == section_size)
1782                         ParseARMAttributes(data, section_size, arch_spec);
1783                 }
1784 
1785                 if (name == g_sect_name_gnu_debuglink)
1786                 {
1787                     DataExtractor data;
1788                     if (section_size && (set_data (data, sheader.sh_offset, section_size) == section_size))
1789                     {
1790                         lldb::offset_t gnu_debuglink_offset = 0;
1791                         gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset);
1792                         gnu_debuglink_offset = llvm::alignTo (gnu_debuglink_offset, 4);
1793                         data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1794                     }
1795                 }
1796 
1797                 // Process ELF note section entries.
1798                 bool is_note_header = (sheader.sh_type == SHT_NOTE);
1799 
1800                 // The section header ".note.android.ident" is stored as a
1801                 // PROGBITS type header but it is actually a note header.
1802                 static ConstString g_sect_name_android_ident (".note.android.ident");
1803                 if (!is_note_header && name == g_sect_name_android_ident)
1804                     is_note_header = true;
1805 
1806                 if (is_note_header)
1807                 {
1808                     // Allow notes to refine module info.
1809                     DataExtractor data;
1810                     if (section_size && (set_data (data, sheader.sh_offset, section_size) == section_size))
1811                     {
1812                         Error error = RefineModuleDetailsFromNote (data, arch_spec, uuid);
1813                         if (error.Fail ())
1814                         {
1815                             if (log)
1816                                 log->Printf ("ObjectFileELF::%s ELF note processing failed: %s", __FUNCTION__, error.AsCString ());
1817                         }
1818                     }
1819                 }
1820             }
1821 
1822             // Make any unknown triple components to be unspecified unknowns.
1823             if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor)
1824                 arch_spec.GetTriple().setVendorName (llvm::StringRef());
1825             if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS)
1826                 arch_spec.GetTriple().setOSName (llvm::StringRef());
1827 
1828             return section_headers.size();
1829         }
1830     }
1831 
1832     section_headers.clear();
1833     return 0;
1834 }
1835 
1836 size_t
1837 ObjectFileELF::GetProgramHeaderCount()
1838 {
1839     return ParseProgramHeaders();
1840 }
1841 
1842 const elf::ELFProgramHeader *
1843 ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id)
1844 {
1845     if (!id || !ParseProgramHeaders())
1846         return NULL;
1847 
1848     if (--id < m_program_headers.size())
1849         return &m_program_headers[id];
1850 
1851     return NULL;
1852 }
1853 
1854 DataExtractor
1855 ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id)
1856 {
1857     const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id);
1858     if (segment_header == NULL)
1859         return DataExtractor();
1860     return DataExtractor(m_data, segment_header->p_offset, segment_header->p_filesz);
1861 }
1862 
1863 std::string
1864 ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const
1865 {
1866     size_t pos = symbol_name.find('@');
1867     return symbol_name.substr(0, pos).str();
1868 }
1869 
1870 //----------------------------------------------------------------------
1871 // ParseSectionHeaders
1872 //----------------------------------------------------------------------
1873 size_t
1874 ObjectFileELF::ParseSectionHeaders()
1875 {
1876     using namespace std::placeholders;
1877 
1878     return GetSectionHeaderInfo(m_section_headers,
1879                                 std::bind(&ObjectFileELF::SetDataWithReadMemoryFallback, this, _1, _2, _3),
1880                                 m_header,
1881                                 m_uuid,
1882                                 m_gnu_debuglink_file,
1883                                 m_gnu_debuglink_crc,
1884                                 m_arch_spec);
1885 }
1886 
1887 lldb::offset_t
1888 ObjectFileELF::SetData(const lldb_private::DataExtractor &src, lldb_private::DataExtractor &dst, lldb::offset_t offset, lldb::offset_t length)
1889 {
1890     return dst.SetData(src, offset, length);
1891 }
1892 
1893 lldb::offset_t
1894 ObjectFileELF::SetDataWithReadMemoryFallback(lldb_private::DataExtractor &dst, lldb::offset_t offset, lldb::offset_t length)
1895 {
1896     if (offset + length <= m_data.GetByteSize())
1897         return dst.SetData(m_data, offset, length);
1898 
1899     const auto process_sp = m_process_wp.lock();
1900     if (process_sp != nullptr)
1901     {
1902         addr_t file_size = offset + length;
1903 
1904         DataBufferSP data_sp = ReadMemory(process_sp, m_memory_addr, file_size);
1905         if (!data_sp)
1906             return false;
1907         m_data.SetData(data_sp, 0, file_size);
1908     }
1909 
1910     return dst.SetData(m_data, offset, length);
1911 }
1912 
1913 const ObjectFileELF::ELFSectionHeaderInfo *
1914 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id)
1915 {
1916     if (!id || !ParseSectionHeaders())
1917         return NULL;
1918 
1919     if (--id < m_section_headers.size())
1920         return &m_section_headers[id];
1921 
1922     return NULL;
1923 }
1924 
1925 lldb::user_id_t
1926 ObjectFileELF::GetSectionIndexByName(const char* name)
1927 {
1928     if (!name || !name[0] || !ParseSectionHeaders())
1929         return 0;
1930     for (size_t i = 1; i < m_section_headers.size(); ++i)
1931         if (m_section_headers[i].section_name == ConstString(name))
1932             return i;
1933     return 0;
1934 }
1935 
1936 void
1937 ObjectFileELF::CreateSections(SectionList &unified_section_list)
1938 {
1939     if (!m_sections_ap.get() && ParseSectionHeaders())
1940     {
1941         m_sections_ap.reset(new SectionList());
1942 
1943         for (SectionHeaderCollIter I = m_section_headers.begin();
1944              I != m_section_headers.end(); ++I)
1945         {
1946             const ELFSectionHeaderInfo &header = *I;
1947 
1948             ConstString& name = I->section_name;
1949             const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1950             const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
1951 
1952             static ConstString g_sect_name_text (".text");
1953             static ConstString g_sect_name_data (".data");
1954             static ConstString g_sect_name_bss (".bss");
1955             static ConstString g_sect_name_tdata (".tdata");
1956             static ConstString g_sect_name_tbss (".tbss");
1957             static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev");
1958             static ConstString g_sect_name_dwarf_debug_addr (".debug_addr");
1959             static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges");
1960             static ConstString g_sect_name_dwarf_debug_frame (".debug_frame");
1961             static ConstString g_sect_name_dwarf_debug_info (".debug_info");
1962             static ConstString g_sect_name_dwarf_debug_line (".debug_line");
1963             static ConstString g_sect_name_dwarf_debug_loc (".debug_loc");
1964             static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo");
1965             static ConstString g_sect_name_dwarf_debug_macro (".debug_macro");
1966             static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames");
1967             static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes");
1968             static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges");
1969             static ConstString g_sect_name_dwarf_debug_str (".debug_str");
1970             static ConstString g_sect_name_dwarf_debug_str_offsets (".debug_str_offsets");
1971             static ConstString g_sect_name_dwarf_debug_abbrev_dwo (".debug_abbrev.dwo");
1972             static ConstString g_sect_name_dwarf_debug_info_dwo (".debug_info.dwo");
1973             static ConstString g_sect_name_dwarf_debug_line_dwo (".debug_line.dwo");
1974             static ConstString g_sect_name_dwarf_debug_macro_dwo (".debug_macro.dwo");
1975             static ConstString g_sect_name_dwarf_debug_loc_dwo (".debug_loc.dwo");
1976             static ConstString g_sect_name_dwarf_debug_str_dwo (".debug_str.dwo");
1977             static ConstString g_sect_name_dwarf_debug_str_offsets_dwo (".debug_str_offsets.dwo");
1978             static ConstString g_sect_name_eh_frame (".eh_frame");
1979             static ConstString g_sect_name_arm_exidx (".ARM.exidx");
1980             static ConstString g_sect_name_arm_extab (".ARM.extab");
1981             static ConstString g_sect_name_go_symtab (".gosymtab");
1982 
1983             SectionType sect_type = eSectionTypeOther;
1984 
1985             bool is_thread_specific = false;
1986 
1987             if      (name == g_sect_name_text)                  sect_type = eSectionTypeCode;
1988             else if (name == g_sect_name_data)                  sect_type = eSectionTypeData;
1989             else if (name == g_sect_name_bss)                   sect_type = eSectionTypeZeroFill;
1990             else if (name == g_sect_name_tdata)
1991             {
1992                 sect_type = eSectionTypeData;
1993                 is_thread_specific = true;
1994             }
1995             else if (name == g_sect_name_tbss)
1996             {
1997                 sect_type = eSectionTypeZeroFill;
1998                 is_thread_specific = true;
1999             }
2000             // .debug_abbrev – Abbreviations used in the .debug_info section
2001             // .debug_aranges – Lookup table for mapping addresses to compilation units
2002             // .debug_frame – Call frame information
2003             // .debug_info – The core DWARF information section
2004             // .debug_line – Line number information
2005             // .debug_loc – Location lists used in DW_AT_location attributes
2006             // .debug_macinfo – Macro information
2007             // .debug_pubnames – Lookup table for mapping object and function names to compilation units
2008             // .debug_pubtypes – Lookup table for mapping type names to compilation units
2009             // .debug_ranges – Address ranges used in DW_AT_ranges attributes
2010             // .debug_str – String table used in .debug_info
2011             // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
2012             // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
2013             // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
2014             else if (name == g_sect_name_dwarf_debug_abbrev)          sect_type = eSectionTypeDWARFDebugAbbrev;
2015             else if (name == g_sect_name_dwarf_debug_addr)            sect_type = eSectionTypeDWARFDebugAddr;
2016             else if (name == g_sect_name_dwarf_debug_aranges)         sect_type = eSectionTypeDWARFDebugAranges;
2017             else if (name == g_sect_name_dwarf_debug_frame)           sect_type = eSectionTypeDWARFDebugFrame;
2018             else if (name == g_sect_name_dwarf_debug_info)            sect_type = eSectionTypeDWARFDebugInfo;
2019             else if (name == g_sect_name_dwarf_debug_line)            sect_type = eSectionTypeDWARFDebugLine;
2020             else if (name == g_sect_name_dwarf_debug_loc)             sect_type = eSectionTypeDWARFDebugLoc;
2021             else if (name == g_sect_name_dwarf_debug_macinfo)         sect_type = eSectionTypeDWARFDebugMacInfo;
2022             else if (name == g_sect_name_dwarf_debug_macro)           sect_type = eSectionTypeDWARFDebugMacro;
2023             else if (name == g_sect_name_dwarf_debug_pubnames)        sect_type = eSectionTypeDWARFDebugPubNames;
2024             else if (name == g_sect_name_dwarf_debug_pubtypes)        sect_type = eSectionTypeDWARFDebugPubTypes;
2025             else if (name == g_sect_name_dwarf_debug_ranges)          sect_type = eSectionTypeDWARFDebugRanges;
2026             else if (name == g_sect_name_dwarf_debug_str)             sect_type = eSectionTypeDWARFDebugStr;
2027             else if (name == g_sect_name_dwarf_debug_str_offsets)     sect_type = eSectionTypeDWARFDebugStrOffsets;
2028             else if (name == g_sect_name_dwarf_debug_abbrev_dwo)      sect_type = eSectionTypeDWARFDebugAbbrev;
2029             else if (name == g_sect_name_dwarf_debug_info_dwo)        sect_type = eSectionTypeDWARFDebugInfo;
2030             else if (name == g_sect_name_dwarf_debug_line_dwo)        sect_type = eSectionTypeDWARFDebugLine;
2031             else if (name == g_sect_name_dwarf_debug_macro_dwo)       sect_type = eSectionTypeDWARFDebugMacro;
2032             else if (name == g_sect_name_dwarf_debug_loc_dwo)         sect_type = eSectionTypeDWARFDebugLoc;
2033             else if (name == g_sect_name_dwarf_debug_str_dwo)         sect_type = eSectionTypeDWARFDebugStr;
2034             else if (name == g_sect_name_dwarf_debug_str_offsets_dwo) sect_type = eSectionTypeDWARFDebugStrOffsets;
2035             else if (name == g_sect_name_eh_frame)                    sect_type = eSectionTypeEHFrame;
2036             else if (name == g_sect_name_arm_exidx)                   sect_type = eSectionTypeARMexidx;
2037             else if (name == g_sect_name_arm_extab)                   sect_type = eSectionTypeARMextab;
2038             else if (name == g_sect_name_go_symtab)                   sect_type = eSectionTypeGoSymtab;
2039 
2040             const uint32_t permissions = ((header.sh_flags & SHF_ALLOC) ? ePermissionsReadable : 0) |
2041                                          ((header.sh_flags & SHF_WRITE) ? ePermissionsWritable : 0) |
2042                                          ((header.sh_flags & SHF_EXECINSTR) ? ePermissionsExecutable : 0);
2043             switch (header.sh_type)
2044             {
2045                 case SHT_SYMTAB:
2046                     assert (sect_type == eSectionTypeOther);
2047                     sect_type = eSectionTypeELFSymbolTable;
2048                     break;
2049                 case SHT_DYNSYM:
2050                     assert (sect_type == eSectionTypeOther);
2051                     sect_type = eSectionTypeELFDynamicSymbols;
2052                     break;
2053                 case SHT_RELA:
2054                 case SHT_REL:
2055                     assert (sect_type == eSectionTypeOther);
2056                     sect_type = eSectionTypeELFRelocationEntries;
2057                     break;
2058                 case SHT_DYNAMIC:
2059                     assert (sect_type == eSectionTypeOther);
2060                     sect_type = eSectionTypeELFDynamicLinkInfo;
2061                     break;
2062             }
2063 
2064             if (eSectionTypeOther == sect_type)
2065             {
2066                 // the kalimba toolchain assumes that ELF section names are free-form. It does
2067                 // support linkscripts which (can) give rise to various arbitrarily named
2068                 // sections being "Code" or "Data".
2069                 sect_type = kalimbaSectionType(m_header, header);
2070             }
2071 
2072             const uint32_t target_bytes_size =
2073                 (eSectionTypeData == sect_type || eSectionTypeZeroFill == sect_type) ?
2074                 m_arch_spec.GetDataByteSize() :
2075                     eSectionTypeCode == sect_type ?
2076                     m_arch_spec.GetCodeByteSize() : 1;
2077 
2078             elf::elf_xword log2align = (header.sh_addralign==0)
2079                                         ? 0
2080                                         : llvm::Log2_64(header.sh_addralign);
2081             SectionSP section_sp (new Section(GetModule(),        // Module to which this section belongs.
2082                                               this,               // ObjectFile to which this section belongs and should read section data from.
2083                                               SectionIndex(I),    // Section ID.
2084                                               name,               // Section name.
2085                                               sect_type,          // Section type.
2086                                               header.sh_addr,     // VM address.
2087                                               vm_size,            // VM size in bytes of this section.
2088                                               header.sh_offset,   // Offset of this section in the file.
2089                                               file_size,          // Size of the section as found in the file.
2090                                               log2align,          // Alignment of the section
2091                                               header.sh_flags,    // Flags for this section.
2092                                               target_bytes_size));// Number of host bytes per target byte
2093 
2094             section_sp->SetPermissions(permissions);
2095             if (is_thread_specific)
2096                 section_sp->SetIsThreadSpecific (is_thread_specific);
2097             m_sections_ap->AddSection(section_sp);
2098         }
2099     }
2100 
2101     if (m_sections_ap.get())
2102     {
2103         if (GetType() == eTypeDebugInfo)
2104         {
2105             static const SectionType g_sections[] =
2106             {
2107                 eSectionTypeDWARFDebugAbbrev,
2108                 eSectionTypeDWARFDebugAddr,
2109                 eSectionTypeDWARFDebugAranges,
2110                 eSectionTypeDWARFDebugFrame,
2111                 eSectionTypeDWARFDebugInfo,
2112                 eSectionTypeDWARFDebugLine,
2113                 eSectionTypeDWARFDebugLoc,
2114                 eSectionTypeDWARFDebugMacInfo,
2115                 eSectionTypeDWARFDebugPubNames,
2116                 eSectionTypeDWARFDebugPubTypes,
2117                 eSectionTypeDWARFDebugRanges,
2118                 eSectionTypeDWARFDebugStr,
2119                 eSectionTypeDWARFDebugStrOffsets,
2120                 eSectionTypeELFSymbolTable,
2121             };
2122             SectionList *elf_section_list = m_sections_ap.get();
2123             for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx)
2124             {
2125                 SectionType section_type = g_sections[idx];
2126                 SectionSP section_sp (elf_section_list->FindSectionByType (section_type, true));
2127                 if (section_sp)
2128                 {
2129                     SectionSP module_section_sp (unified_section_list.FindSectionByType (section_type, true));
2130                     if (module_section_sp)
2131                         unified_section_list.ReplaceSection (module_section_sp->GetID(), section_sp);
2132                     else
2133                         unified_section_list.AddSection (section_sp);
2134                 }
2135             }
2136         }
2137         else
2138         {
2139             unified_section_list = *m_sections_ap;
2140         }
2141     }
2142 }
2143 
2144 // Find the arm/aarch64 mapping symbol character in the given symbol name. Mapping symbols have the
2145 // form of "$<char>[.<any>]*". Additionally we recognize cases when the mapping symbol prefixed by
2146 // an arbitrary string because if a symbol prefix added to each symbol in the object file with
2147 // objcopy then the mapping symbols are also prefixed.
2148 static char
2149 FindArmAarch64MappingSymbol(const char* symbol_name)
2150 {
2151     if (!symbol_name)
2152         return '\0';
2153 
2154     const char* dollar_pos = ::strchr(symbol_name, '$');
2155     if (!dollar_pos || dollar_pos[1] == '\0')
2156         return '\0';
2157 
2158     if (dollar_pos[2] == '\0' || dollar_pos[2] == '.')
2159         return dollar_pos[1];
2160     return '\0';
2161 }
2162 
2163 #define STO_MIPS_ISA            (3 << 6)
2164 #define STO_MICROMIPS           (2 << 6)
2165 #define IS_MICROMIPS(ST_OTHER)  (((ST_OTHER) & STO_MIPS_ISA) == STO_MICROMIPS)
2166 
2167 // private
2168 unsigned
2169 ObjectFileELF::ParseSymbols (Symtab *symtab,
2170                              user_id_t start_id,
2171                              SectionList *section_list,
2172                              const size_t num_symbols,
2173                              const DataExtractor &symtab_data,
2174                              const DataExtractor &strtab_data)
2175 {
2176     ELFSymbol symbol;
2177     lldb::offset_t offset = 0;
2178 
2179     static ConstString text_section_name(".text");
2180     static ConstString init_section_name(".init");
2181     static ConstString fini_section_name(".fini");
2182     static ConstString ctors_section_name(".ctors");
2183     static ConstString dtors_section_name(".dtors");
2184 
2185     static ConstString data_section_name(".data");
2186     static ConstString rodata_section_name(".rodata");
2187     static ConstString rodata1_section_name(".rodata1");
2188     static ConstString data2_section_name(".data1");
2189     static ConstString bss_section_name(".bss");
2190     static ConstString opd_section_name(".opd");    // For ppc64
2191 
2192     // On Android the oatdata and the oatexec symbols in the oat and odex files covers the full
2193     // .text section what causes issues with displaying unusable symbol name to the user and very
2194     // slow unwinding speed because the instruction emulation based unwind plans try to emulate all
2195     // instructions in these symbols. Don't add these symbols to the symbol list as they have no
2196     // use for the debugger and they are causing a lot of trouble.
2197     // Filtering can't be restricted to Android because this special object file don't contain the
2198     // note section specifying the environment to Android but the custom extension and file name
2199     // makes it highly unlikely that this will collide with anything else.
2200     ConstString file_extension = m_file.GetFileNameExtension();
2201     bool skip_oatdata_oatexec = file_extension == ConstString("oat") || file_extension == ConstString("odex");
2202 
2203     ArchSpec arch;
2204     GetArchitecture(arch);
2205     ModuleSP module_sp(GetModule());
2206     SectionList* module_section_list = module_sp ? module_sp->GetSectionList() : nullptr;
2207 
2208     // Local cache to avoid doing a FindSectionByName for each symbol. The "const char*" key must
2209     // came from a ConstString object so they can be compared by pointer
2210     std::unordered_map<const char*, lldb::SectionSP> section_name_to_section;
2211 
2212     unsigned i;
2213     for (i = 0; i < num_symbols; ++i)
2214     {
2215         if (symbol.Parse(symtab_data, &offset) == false)
2216             break;
2217 
2218         const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2219 
2220         // No need to add non-section symbols that have no names
2221         if (symbol.getType() != STT_SECTION &&
2222             (symbol_name == NULL || symbol_name[0] == '\0'))
2223             continue;
2224 
2225         // Skipping oatdata and oatexec sections if it is requested. See details above the
2226         // definition of skip_oatdata_oatexec for the reasons.
2227         if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 || ::strcmp(symbol_name, "oatexec") == 0))
2228             continue;
2229 
2230         SectionSP symbol_section_sp;
2231         SymbolType symbol_type = eSymbolTypeInvalid;
2232         Elf64_Half section_idx = symbol.st_shndx;
2233 
2234         switch (section_idx)
2235         {
2236         case SHN_ABS:
2237             symbol_type = eSymbolTypeAbsolute;
2238             break;
2239         case SHN_UNDEF:
2240             symbol_type = eSymbolTypeUndefined;
2241             break;
2242         default:
2243             symbol_section_sp = section_list->GetSectionAtIndex(section_idx);
2244             break;
2245         }
2246 
2247         // If a symbol is undefined do not process it further even if it has a STT type
2248         if (symbol_type != eSymbolTypeUndefined)
2249         {
2250             switch (symbol.getType())
2251             {
2252             default:
2253             case STT_NOTYPE:
2254                 // The symbol's type is not specified.
2255                 break;
2256 
2257             case STT_OBJECT:
2258                 // The symbol is associated with a data object, such as a variable,
2259                 // an array, etc.
2260                 symbol_type = eSymbolTypeData;
2261                 break;
2262 
2263             case STT_FUNC:
2264                 // The symbol is associated with a function or other executable code.
2265                 symbol_type = eSymbolTypeCode;
2266                 break;
2267 
2268             case STT_SECTION:
2269                 // The symbol is associated with a section. Symbol table entries of
2270                 // this type exist primarily for relocation and normally have
2271                 // STB_LOCAL binding.
2272                 break;
2273 
2274             case STT_FILE:
2275                 // Conventionally, the symbol's name gives the name of the source
2276                 // file associated with the object file. A file symbol has STB_LOCAL
2277                 // binding, its section index is SHN_ABS, and it precedes the other
2278                 // STB_LOCAL symbols for the file, if it is present.
2279                 symbol_type = eSymbolTypeSourceFile;
2280                 break;
2281 
2282             case STT_GNU_IFUNC:
2283                 // The symbol is associated with an indirect function. The actual
2284                 // function will be resolved if it is referenced.
2285                 symbol_type = eSymbolTypeResolver;
2286                 break;
2287             }
2288         }
2289 
2290         if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION)
2291         {
2292             if (symbol_section_sp)
2293             {
2294                 const ConstString &sect_name = symbol_section_sp->GetName();
2295                 if (sect_name == text_section_name ||
2296                     sect_name == init_section_name ||
2297                     sect_name == fini_section_name ||
2298                     sect_name == ctors_section_name ||
2299                     sect_name == dtors_section_name)
2300                 {
2301                     symbol_type = eSymbolTypeCode;
2302                 }
2303                 else if (sect_name == data_section_name ||
2304                          sect_name == data2_section_name ||
2305                          sect_name == rodata_section_name ||
2306                          sect_name == rodata1_section_name ||
2307                          sect_name == bss_section_name)
2308                 {
2309                     symbol_type = eSymbolTypeData;
2310                 }
2311             }
2312         }
2313 
2314         int64_t symbol_value_offset = 0;
2315         uint32_t additional_flags = 0;
2316 
2317         if (arch.IsValid())
2318         {
2319             if (arch.GetMachine() == llvm::Triple::arm)
2320             {
2321                 if (symbol.getBinding() == STB_LOCAL)
2322                 {
2323                     char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2324                     if (symbol_type == eSymbolTypeCode)
2325                     {
2326                         switch (mapping_symbol)
2327                         {
2328                             case 'a':
2329                                 // $a[.<any>]* - marks an ARM instruction sequence
2330                                 m_address_class_map[symbol.st_value] = eAddressClassCode;
2331                                 break;
2332                             case 'b':
2333                             case 't':
2334                                 // $b[.<any>]* - marks a THUMB BL instruction sequence
2335                                 // $t[.<any>]* - marks a THUMB instruction sequence
2336                                 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
2337                                 break;
2338                             case 'd':
2339                                 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2340                                 m_address_class_map[symbol.st_value] = eAddressClassData;
2341                                 break;
2342                         }
2343                     }
2344                     if (mapping_symbol)
2345                         continue;
2346                 }
2347             }
2348             else if (arch.GetMachine() == llvm::Triple::aarch64)
2349             {
2350                 if (symbol.getBinding() == STB_LOCAL)
2351                 {
2352                     char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2353                     if (symbol_type == eSymbolTypeCode)
2354                     {
2355                         switch (mapping_symbol)
2356                         {
2357                             case 'x':
2358                                 // $x[.<any>]* - marks an A64 instruction sequence
2359                                 m_address_class_map[symbol.st_value] = eAddressClassCode;
2360                                 break;
2361                             case 'd':
2362                                 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2363                                 m_address_class_map[symbol.st_value] = eAddressClassData;
2364                                 break;
2365                         }
2366                     }
2367                     if (mapping_symbol)
2368                         continue;
2369                 }
2370             }
2371 
2372             if (arch.GetMachine() == llvm::Triple::arm)
2373             {
2374                 if (symbol_type == eSymbolTypeCode)
2375                 {
2376                     if (symbol.st_value & 1)
2377                     {
2378                         // Subtracting 1 from the address effectively unsets
2379                         // the low order bit, which results in the address
2380                         // actually pointing to the beginning of the symbol.
2381                         // This delta will be used below in conjunction with
2382                         // symbol.st_value to produce the final symbol_value
2383                         // that we store in the symtab.
2384                         symbol_value_offset = -1;
2385                         m_address_class_map[symbol.st_value^1] = eAddressClassCodeAlternateISA;
2386                     }
2387                     else
2388                     {
2389                         // This address is ARM
2390                         m_address_class_map[symbol.st_value] = eAddressClassCode;
2391                     }
2392                 }
2393             }
2394 
2395             /*
2396              * MIPS:
2397              * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for MIPS).
2398              * This allows processer to switch between microMIPS and MIPS without any need
2399              * for special mode-control register. However, apart from .debug_line, none of
2400              * the ELF/DWARF sections set the ISA bit (for symbol or section). Use st_other
2401              * flag to check whether the symbol is microMIPS and then set the address class
2402              * accordingly.
2403             */
2404             const llvm::Triple::ArchType llvm_arch = arch.GetMachine();
2405             if (llvm_arch == llvm::Triple::mips || llvm_arch == llvm::Triple::mipsel
2406                 || llvm_arch == llvm::Triple::mips64 || llvm_arch == llvm::Triple::mips64el)
2407             {
2408                 if (IS_MICROMIPS(symbol.st_other))
2409                     m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
2410                 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode))
2411                 {
2412                     symbol.st_value = symbol.st_value & (~1ull);
2413                     m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
2414                 }
2415                 else
2416                 {
2417                     if (symbol_type == eSymbolTypeCode)
2418                         m_address_class_map[symbol.st_value] = eAddressClassCode;
2419                     else if (symbol_type == eSymbolTypeData)
2420                         m_address_class_map[symbol.st_value] = eAddressClassData;
2421                     else
2422                         m_address_class_map[symbol.st_value] = eAddressClassUnknown;
2423                 }
2424             }
2425         }
2426 
2427         // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB symbols. See above for
2428         // more details.
2429         uint64_t symbol_value = symbol.st_value + symbol_value_offset;
2430 
2431         if (symbol_section_sp == nullptr && section_idx == SHN_ABS && symbol.st_size != 0)
2432         {
2433             // We don't have a section for a symbol with non-zero size. Create a new section for it
2434             // so the address range covered by the symbol is also covered by the module (represented
2435             // through the section list). It is needed so module lookup for the addresses covered
2436             // by this symbol will be successfull. This case happens for absolute symbols.
2437             ConstString fake_section_name(std::string(".absolute.") + symbol_name);
2438             symbol_section_sp = std::make_shared<Section>(module_sp,
2439                                                           this,
2440                                                           SHN_ABS,
2441                                                           fake_section_name,
2442                                                           eSectionTypeAbsoluteAddress,
2443                                                           symbol_value,
2444                                                           symbol.st_size,
2445                                                           0, 0, 0,
2446                                                           SHF_ALLOC);
2447 
2448             module_section_list->AddSection(symbol_section_sp);
2449             section_list->AddSection(symbol_section_sp);
2450         }
2451 
2452         if (symbol_section_sp && CalculateType() != ObjectFile::Type::eTypeObjectFile)
2453             symbol_value -= symbol_section_sp->GetFileAddress();
2454 
2455         if (symbol_section_sp && module_section_list && module_section_list != section_list)
2456         {
2457             const ConstString &sect_name = symbol_section_sp->GetName();
2458             auto section_it = section_name_to_section.find(sect_name.GetCString());
2459             if (section_it == section_name_to_section.end())
2460                 section_it = section_name_to_section.emplace(
2461                     sect_name.GetCString(),
2462                     module_section_list->FindSectionByName (sect_name)).first;
2463             if (section_it->second && section_it->second->GetFileSize())
2464                 symbol_section_sp = section_it->second;
2465         }
2466 
2467         bool is_global = symbol.getBinding() == STB_GLOBAL;
2468         uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
2469         bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
2470 
2471         llvm::StringRef symbol_ref(symbol_name);
2472 
2473         // Symbol names may contain @VERSION suffixes. Find those and strip them temporarily.
2474         size_t version_pos = symbol_ref.find('@');
2475         bool has_suffix = version_pos != llvm::StringRef::npos;
2476         llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos);
2477         Mangled mangled(ConstString(symbol_bare), is_mangled);
2478 
2479         // Now append the suffix back to mangled and unmangled names. Only do it if the
2480         // demangling was successful (string is not empty).
2481         if (has_suffix)
2482         {
2483             llvm::StringRef suffix = symbol_ref.substr(version_pos);
2484 
2485             llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef();
2486             if (! mangled_name.empty())
2487                 mangled.SetMangledName( ConstString((mangled_name + suffix).str()) );
2488 
2489             ConstString demangled = mangled.GetDemangledName(lldb::eLanguageTypeUnknown);
2490             llvm::StringRef demangled_name = demangled.GetStringRef();
2491             if (!demangled_name.empty())
2492                 mangled.SetDemangledName( ConstString((demangled_name + suffix).str()) );
2493         }
2494 
2495         // In ELF all symbol should have a valid size but it is not true for some function symbols
2496         // coming from hand written assembly. As none of the function symbol should have 0 size we
2497         // try to calculate the size for these symbols in the symtab with saying that their original
2498         // size is not valid.
2499         bool symbol_size_valid = symbol.st_size != 0 || symbol.getType() != STT_FUNC;
2500 
2501         Symbol dc_symbol(
2502             i + start_id,       // ID is the original symbol table index.
2503             mangled,
2504             symbol_type,        // Type of this symbol
2505             is_global,          // Is this globally visible?
2506             false,              // Is this symbol debug info?
2507             false,              // Is this symbol a trampoline?
2508             false,              // Is this symbol artificial?
2509             AddressRange(
2510                 symbol_section_sp,  // Section in which this symbol is defined or null.
2511                 symbol_value,       // Offset in section or symbol value.
2512                 symbol.st_size),    // Size in bytes of this symbol.
2513             symbol_size_valid,      // Symbol size is valid
2514             has_suffix,             // Contains linker annotations?
2515             flags);                 // Symbol flags.
2516         symtab->AddSymbol(dc_symbol);
2517     }
2518     return i;
2519 }
2520 
2521 unsigned
2522 ObjectFileELF::ParseSymbolTable(Symtab *symbol_table,
2523                                 user_id_t start_id,
2524                                 lldb_private::Section *symtab)
2525 {
2526     if (symtab->GetObjectFile() != this)
2527     {
2528         // If the symbol table section is owned by a different object file, have it do the
2529         // parsing.
2530         ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile());
2531         return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
2532     }
2533 
2534     // Get section list for this object file.
2535     SectionList *section_list = m_sections_ap.get();
2536     if (!section_list)
2537         return 0;
2538 
2539     user_id_t symtab_id = symtab->GetID();
2540     const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2541     assert(symtab_hdr->sh_type == SHT_SYMTAB ||
2542            symtab_hdr->sh_type == SHT_DYNSYM);
2543 
2544     // sh_link: section header index of associated string table.
2545     // Section ID's are ones based.
2546     user_id_t strtab_id = symtab_hdr->sh_link + 1;
2547     Section *strtab = section_list->FindSectionByID(strtab_id).get();
2548 
2549     if (symtab && strtab)
2550     {
2551         assert (symtab->GetObjectFile() == this);
2552         assert (strtab->GetObjectFile() == this);
2553 
2554         DataExtractor symtab_data;
2555         DataExtractor strtab_data;
2556         if (ReadSectionData(symtab, symtab_data) &&
2557             ReadSectionData(strtab, strtab_data))
2558         {
2559             size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
2560 
2561             return ParseSymbols(symbol_table, start_id, section_list,
2562                                 num_symbols, symtab_data, strtab_data);
2563         }
2564     }
2565 
2566     return 0;
2567 }
2568 
2569 size_t
2570 ObjectFileELF::ParseDynamicSymbols()
2571 {
2572     if (m_dynamic_symbols.size())
2573         return m_dynamic_symbols.size();
2574 
2575     SectionList *section_list = GetSectionList();
2576     if (!section_list)
2577         return 0;
2578 
2579     // Find the SHT_DYNAMIC section.
2580     Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
2581     if (!dynsym)
2582         return 0;
2583     assert (dynsym->GetObjectFile() == this);
2584 
2585     ELFDynamic symbol;
2586     DataExtractor dynsym_data;
2587     if (ReadSectionData(dynsym, dynsym_data))
2588     {
2589         const lldb::offset_t section_size = dynsym_data.GetByteSize();
2590         lldb::offset_t cursor = 0;
2591 
2592         while (cursor < section_size)
2593         {
2594             if (!symbol.Parse(dynsym_data, &cursor))
2595                 break;
2596 
2597             m_dynamic_symbols.push_back(symbol);
2598         }
2599     }
2600 
2601     return m_dynamic_symbols.size();
2602 }
2603 
2604 const ELFDynamic *
2605 ObjectFileELF::FindDynamicSymbol(unsigned tag)
2606 {
2607     if (!ParseDynamicSymbols())
2608         return NULL;
2609 
2610     DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2611     DynamicSymbolCollIter E = m_dynamic_symbols.end();
2612     for ( ; I != E; ++I)
2613     {
2614         ELFDynamic *symbol = &*I;
2615 
2616         if (symbol->d_tag == tag)
2617             return symbol;
2618     }
2619 
2620     return NULL;
2621 }
2622 
2623 unsigned
2624 ObjectFileELF::PLTRelocationType()
2625 {
2626     // DT_PLTREL
2627     //  This member specifies the type of relocation entry to which the
2628     //  procedure linkage table refers. The d_val member holds DT_REL or
2629     //  DT_RELA, as appropriate. All relocations in a procedure linkage table
2630     //  must use the same relocation.
2631     const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2632 
2633     if (symbol)
2634         return symbol->d_val;
2635 
2636     return 0;
2637 }
2638 
2639 // Returns the size of the normal plt entries and the offset of the first normal plt entry. The
2640 // 0th entry in the plt table is usually a resolution entry which have different size in some
2641 // architectures then the rest of the plt entries.
2642 static std::pair<uint64_t, uint64_t>
2643 GetPltEntrySizeAndOffset(const ELFSectionHeader* rel_hdr, const ELFSectionHeader* plt_hdr)
2644 {
2645     const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2646 
2647     // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 16 bytes.
2648     // So round the entsize up by the alignment if addralign is set.
2649     elf_xword plt_entsize = plt_hdr->sh_addralign ?
2650         llvm::alignTo (plt_hdr->sh_entsize, plt_hdr->sh_addralign) : plt_hdr->sh_entsize;
2651 
2652     // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly.
2653     // PLT entries relocation code in general requires multiple instruction and
2654     // should be greater than 4 bytes in most cases. Try to guess correct size just in case.
2655     if (plt_entsize <= 4)
2656     {
2657         // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the size of the plt
2658         // entries based on the number of entries and the size of the plt section with the
2659         // assumption that the size of the 0th entry is at least as big as the size of the normal
2660         // entries and it isn't much bigger then that.
2661         if (plt_hdr->sh_addralign)
2662             plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign / (num_relocations + 1) * plt_hdr->sh_addralign;
2663         else
2664             plt_entsize = plt_hdr->sh_size / (num_relocations + 1);
2665     }
2666 
2667     elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize;
2668 
2669     return std::make_pair(plt_entsize, plt_offset);
2670 }
2671 
2672 static unsigned
2673 ParsePLTRelocations(Symtab *symbol_table,
2674                     user_id_t start_id,
2675                     unsigned rel_type,
2676                     const ELFHeader *hdr,
2677                     const ELFSectionHeader *rel_hdr,
2678                     const ELFSectionHeader *plt_hdr,
2679                     const ELFSectionHeader *sym_hdr,
2680                     const lldb::SectionSP &plt_section_sp,
2681                     DataExtractor &rel_data,
2682                     DataExtractor &symtab_data,
2683                     DataExtractor &strtab_data)
2684 {
2685     ELFRelocation rel(rel_type);
2686     ELFSymbol symbol;
2687     lldb::offset_t offset = 0;
2688 
2689     uint64_t plt_offset, plt_entsize;
2690     std::tie(plt_entsize, plt_offset) = GetPltEntrySizeAndOffset(rel_hdr, plt_hdr);
2691     const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2692 
2693     typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2694     reloc_info_fn reloc_type;
2695     reloc_info_fn reloc_symbol;
2696 
2697     if (hdr->Is32Bit())
2698     {
2699         reloc_type = ELFRelocation::RelocType32;
2700         reloc_symbol = ELFRelocation::RelocSymbol32;
2701     }
2702     else
2703     {
2704         reloc_type = ELFRelocation::RelocType64;
2705         reloc_symbol = ELFRelocation::RelocSymbol64;
2706     }
2707 
2708     unsigned slot_type = hdr->GetRelocationJumpSlotType();
2709     unsigned i;
2710     for (i = 0; i < num_relocations; ++i)
2711     {
2712         if (rel.Parse(rel_data, &offset) == false)
2713             break;
2714 
2715         if (reloc_type(rel) != slot_type)
2716             continue;
2717 
2718         lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
2719         if (!symbol.Parse(symtab_data, &symbol_offset))
2720             break;
2721 
2722         const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2723         bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
2724         uint64_t plt_index = plt_offset + i * plt_entsize;
2725 
2726         Symbol jump_symbol(
2727             i + start_id,    // Symbol table index
2728             symbol_name,     // symbol name.
2729             is_mangled,      // is the symbol name mangled?
2730             eSymbolTypeTrampoline, // Type of this symbol
2731             false,           // Is this globally visible?
2732             false,           // Is this symbol debug info?
2733             true,            // Is this symbol a trampoline?
2734             true,            // Is this symbol artificial?
2735             plt_section_sp,  // Section in which this symbol is defined or null.
2736             plt_index,       // Offset in section or symbol value.
2737             plt_entsize,     // Size in bytes of this symbol.
2738             true,            // Size is valid
2739             false,           // Contains linker annotations?
2740             0);              // Symbol flags.
2741 
2742         symbol_table->AddSymbol(jump_symbol);
2743     }
2744 
2745     return i;
2746 }
2747 
2748 unsigned
2749 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table,
2750                                       user_id_t start_id,
2751                                       const ELFSectionHeaderInfo *rel_hdr,
2752                                       user_id_t rel_id)
2753 {
2754     assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2755 
2756     // The link field points to the associated symbol table.
2757     user_id_t symtab_id = rel_hdr->sh_link;
2758 
2759     // If the link field doesn't point to the appropriate symbol name table then
2760     // try to find it by name as some compiler don't fill in the link fields.
2761     if (!symtab_id)
2762         symtab_id = GetSectionIndexByName(".dynsym");
2763 
2764     // Get PLT section.  We cannot use rel_hdr->sh_info, since current linkers
2765     // point that to the .got.plt or .got section instead of .plt.
2766     user_id_t plt_id = GetSectionIndexByName(".plt");
2767 
2768     if (!symtab_id || !plt_id)
2769         return 0;
2770 
2771     // Section ID's are ones based;
2772     symtab_id++;
2773     plt_id++;
2774 
2775     const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
2776     if (!plt_hdr)
2777         return 0;
2778 
2779     const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
2780     if (!sym_hdr)
2781         return 0;
2782 
2783     SectionList *section_list = m_sections_ap.get();
2784     if (!section_list)
2785         return 0;
2786 
2787     Section *rel_section = section_list->FindSectionByID(rel_id).get();
2788     if (!rel_section)
2789         return 0;
2790 
2791     SectionSP plt_section_sp (section_list->FindSectionByID(plt_id));
2792     if (!plt_section_sp)
2793         return 0;
2794 
2795     Section *symtab = section_list->FindSectionByID(symtab_id).get();
2796     if (!symtab)
2797         return 0;
2798 
2799     // sh_link points to associated string table.
2800     Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
2801     if (!strtab)
2802         return 0;
2803 
2804     DataExtractor rel_data;
2805     if (!ReadSectionData(rel_section, rel_data))
2806         return 0;
2807 
2808     DataExtractor symtab_data;
2809     if (!ReadSectionData(symtab, symtab_data))
2810         return 0;
2811 
2812     DataExtractor strtab_data;
2813     if (!ReadSectionData(strtab, strtab_data))
2814         return 0;
2815 
2816     unsigned rel_type = PLTRelocationType();
2817     if (!rel_type)
2818         return 0;
2819 
2820     return ParsePLTRelocations (symbol_table,
2821                                 start_id,
2822                                 rel_type,
2823                                 &m_header,
2824                                 rel_hdr,
2825                                 plt_hdr,
2826                                 sym_hdr,
2827                                 plt_section_sp,
2828                                 rel_data,
2829                                 symtab_data,
2830                                 strtab_data);
2831 }
2832 
2833 unsigned
2834 ObjectFileELF::RelocateSection(Symtab* symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2835                 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2836                 DataExtractor &rel_data, DataExtractor &symtab_data,
2837                 DataExtractor &debug_data, Section* rel_section)
2838 {
2839     ELFRelocation rel(rel_hdr->sh_type);
2840     lldb::addr_t offset = 0;
2841     const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2842     typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2843     reloc_info_fn reloc_type;
2844     reloc_info_fn reloc_symbol;
2845 
2846     if (hdr->Is32Bit())
2847     {
2848         reloc_type = ELFRelocation::RelocType32;
2849         reloc_symbol = ELFRelocation::RelocSymbol32;
2850     }
2851     else
2852     {
2853         reloc_type = ELFRelocation::RelocType64;
2854         reloc_symbol = ELFRelocation::RelocSymbol64;
2855     }
2856 
2857     for (unsigned i = 0; i < num_relocations; ++i)
2858     {
2859         if (rel.Parse(rel_data, &offset) == false)
2860             break;
2861 
2862         Symbol* symbol = NULL;
2863 
2864         if (hdr->Is32Bit())
2865         {
2866             switch (reloc_type(rel)) {
2867             case R_386_32:
2868             case R_386_PC32:
2869             default:
2870                 assert(false && "unexpected relocation type");
2871             }
2872         } else {
2873             switch (reloc_type(rel)) {
2874             case R_X86_64_64:
2875             {
2876                 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2877                 if (symbol)
2878                 {
2879                     addr_t value = symbol->GetAddressRef().GetFileAddress();
2880                     DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2881                     uint64_t* dst = reinterpret_cast<uint64_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset64(rel));
2882                     *dst = value + ELFRelocation::RelocAddend64(rel);
2883                 }
2884                 break;
2885             }
2886             case R_X86_64_32:
2887             case R_X86_64_32S:
2888             {
2889                 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2890                 if (symbol)
2891                 {
2892                     addr_t value = symbol->GetAddressRef().GetFileAddress();
2893                     value += ELFRelocation::RelocAddend32(rel);
2894                     assert((reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) ||
2895                            (reloc_type(rel) == R_X86_64_32S &&
2896                             ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN)));
2897                     uint32_t truncated_addr = (value & 0xFFFFFFFF);
2898                     DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2899                     uint32_t* dst = reinterpret_cast<uint32_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel));
2900                     *dst = truncated_addr;
2901                 }
2902                 break;
2903             }
2904             case R_X86_64_PC32:
2905             default:
2906                 assert(false && "unexpected relocation type");
2907             }
2908         }
2909     }
2910 
2911     return 0;
2912 }
2913 
2914 unsigned
2915 ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, user_id_t rel_id)
2916 {
2917     assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2918 
2919     // Parse in the section list if needed.
2920     SectionList *section_list = GetSectionList();
2921     if (!section_list)
2922         return 0;
2923 
2924     // Section ID's are ones based.
2925     user_id_t symtab_id = rel_hdr->sh_link + 1;
2926     user_id_t debug_id = rel_hdr->sh_info + 1;
2927 
2928     const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2929     if (!symtab_hdr)
2930         return 0;
2931 
2932     const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2933     if (!debug_hdr)
2934         return 0;
2935 
2936     Section *rel = section_list->FindSectionByID(rel_id).get();
2937     if (!rel)
2938         return 0;
2939 
2940     Section *symtab = section_list->FindSectionByID(symtab_id).get();
2941     if (!symtab)
2942         return 0;
2943 
2944     Section *debug = section_list->FindSectionByID(debug_id).get();
2945     if (!debug)
2946         return 0;
2947 
2948     DataExtractor rel_data;
2949     DataExtractor symtab_data;
2950     DataExtractor debug_data;
2951 
2952     if (ReadSectionData(rel, rel_data) &&
2953         ReadSectionData(symtab, symtab_data) &&
2954         ReadSectionData(debug, debug_data))
2955     {
2956         RelocateSection(m_symtab_ap.get(), &m_header, rel_hdr, symtab_hdr, debug_hdr,
2957                         rel_data, symtab_data, debug_data, debug);
2958     }
2959 
2960     return 0;
2961 }
2962 
2963 Symtab *
2964 ObjectFileELF::GetSymtab()
2965 {
2966     ModuleSP module_sp(GetModule());
2967     if (!module_sp)
2968         return NULL;
2969 
2970     // We always want to use the main object file so we (hopefully) only have one cached copy
2971     // of our symtab, dynamic sections, etc.
2972     ObjectFile *module_obj_file = module_sp->GetObjectFile();
2973     if (module_obj_file && module_obj_file != this)
2974         return module_obj_file->GetSymtab();
2975 
2976     if (m_symtab_ap.get() == NULL)
2977     {
2978         SectionList *section_list = module_sp->GetSectionList();
2979         if (!section_list)
2980             return NULL;
2981 
2982         uint64_t symbol_id = 0;
2983         std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
2984 
2985         // Sharable objects and dynamic executables usually have 2 distinct symbol
2986         // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller
2987         // version of the symtab that only contains global symbols. The information found
2988         // in the dynsym is therefore also found in the symtab, while the reverse is not
2989         // necessarily true.
2990         Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get();
2991         if (!symtab)
2992         {
2993             // The symtab section is non-allocable and can be stripped, so if it doesn't exist
2994             // then use the dynsym section which should always be there.
2995             symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get();
2996         }
2997         if (symtab)
2998         {
2999             m_symtab_ap.reset(new Symtab(symtab->GetObjectFile()));
3000             symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab);
3001         }
3002 
3003         // DT_JMPREL
3004         //      If present, this entry's d_ptr member holds the address of relocation
3005         //      entries associated solely with the procedure linkage table. Separating
3006         //      these relocation entries lets the dynamic linker ignore them during
3007         //      process initialization, if lazy binding is enabled. If this entry is
3008         //      present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
3009         //      also be present.
3010         const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
3011         if (symbol)
3012         {
3013             // Synthesize trampoline symbols to help navigate the PLT.
3014             addr_t addr = symbol->d_ptr;
3015             Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get();
3016             if (reloc_section)
3017             {
3018                 user_id_t reloc_id = reloc_section->GetID();
3019                 const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id);
3020                 assert(reloc_header);
3021 
3022                 if (m_symtab_ap == nullptr)
3023                     m_symtab_ap.reset(new Symtab(reloc_section->GetObjectFile()));
3024 
3025                 ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id);
3026             }
3027         }
3028 
3029         DWARFCallFrameInfo* eh_frame = GetUnwindTable().GetEHFrameInfo();
3030         if (eh_frame)
3031         {
3032             if (m_symtab_ap == nullptr)
3033                 m_symtab_ap.reset(new Symtab(this));
3034             ParseUnwindSymbols (m_symtab_ap.get(), eh_frame);
3035         }
3036 
3037         // If we still don't have any symtab then create an empty instance to avoid do the section
3038         // lookup next time.
3039         if (m_symtab_ap == nullptr)
3040             m_symtab_ap.reset(new Symtab(this));
3041 
3042         m_symtab_ap->CalculateSymbolSizes();
3043     }
3044 
3045     for (SectionHeaderCollIter I = m_section_headers.begin();
3046          I != m_section_headers.end(); ++I)
3047     {
3048         if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL)
3049         {
3050             if (CalculateType() == eTypeObjectFile)
3051             {
3052                 const char *section_name = I->section_name.AsCString("");
3053                 if (strstr(section_name, ".rela.debug") ||
3054                     strstr(section_name, ".rel.debug"))
3055                 {
3056                     const ELFSectionHeader &reloc_header = *I;
3057                     user_id_t reloc_id = SectionIndex(I);
3058                     RelocateDebugSections(&reloc_header, reloc_id);
3059                 }
3060             }
3061         }
3062     }
3063     return m_symtab_ap.get();
3064 }
3065 
3066 void
3067 ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table, DWARFCallFrameInfo* eh_frame)
3068 {
3069     SectionList* section_list = GetSectionList();
3070     if (!section_list)
3071         return;
3072 
3073     // First we save the new symbols into a separate list and add them to the symbol table after
3074     // we colleced all symbols we want to add. This is neccessary because adding a new symbol
3075     // invalidates the internal index of the symtab what causing the next lookup to be slow because
3076     // it have to recalculate the index first.
3077     std::vector<Symbol> new_symbols;
3078 
3079     eh_frame->ForEachFDEEntries(
3080         [this, symbol_table, section_list, &new_symbols](lldb::addr_t file_addr,
3081                                                          uint32_t size,
3082                                                          dw_offset_t) {
3083         Symbol* symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
3084         if (symbol)
3085         {
3086             if (!symbol->GetByteSizeIsValid())
3087             {
3088                 symbol->SetByteSize(size);
3089                 symbol->SetSizeIsSynthesized(true);
3090             }
3091         }
3092         else
3093         {
3094             SectionSP section_sp = section_list->FindSectionContainingFileAddress(file_addr);
3095             if (section_sp)
3096             {
3097                 addr_t offset = file_addr - section_sp->GetFileAddress();
3098                 const char* symbol_name = GetNextSyntheticSymbolName().GetCString();
3099                 uint64_t symbol_id = symbol_table->GetNumSymbols();
3100                 Symbol eh_symbol(
3101                         symbol_id,       // Symbol table index.
3102                         symbol_name,     // Symbol name.
3103                         false,           // Is the symbol name mangled?
3104                         eSymbolTypeCode, // Type of this symbol.
3105                         true,            // Is this globally visible?
3106                         false,           // Is this symbol debug info?
3107                         false,           // Is this symbol a trampoline?
3108                         true,            // Is this symbol artificial?
3109                         section_sp,      // Section in which this symbol is defined or null.
3110                         offset,          // Offset in section or symbol value.
3111                         0,               // Size:          Don't specify the size as an FDE can
3112                         false,           // Size is valid: cover multiple symbols.
3113                         false,           // Contains linker annotations?
3114                         0);              // Symbol flags.
3115                 new_symbols.push_back(eh_symbol);
3116             }
3117         }
3118         return true;
3119     });
3120 
3121     for (const Symbol& s : new_symbols)
3122         symbol_table->AddSymbol(s);
3123 }
3124 
3125 bool
3126 ObjectFileELF::IsStripped ()
3127 {
3128     // TODO: determine this for ELF
3129     return false;
3130 }
3131 
3132 //===----------------------------------------------------------------------===//
3133 // Dump
3134 //
3135 // Dump the specifics of the runtime file container (such as any headers
3136 // segments, sections, etc).
3137 //----------------------------------------------------------------------
3138 void
3139 ObjectFileELF::Dump(Stream *s)
3140 {
3141     ModuleSP module_sp(GetModule());
3142     if (!module_sp)
3143     {
3144         return;
3145     }
3146 
3147     std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
3148     s->Printf("%p: ", static_cast<void *>(this));
3149     s->Indent();
3150     s->PutCString("ObjectFileELF");
3151 
3152     ArchSpec header_arch;
3153     GetArchitecture(header_arch);
3154 
3155     *s << ", file = '" << m_file << "', arch = " << header_arch.GetArchitectureName() << "\n";
3156 
3157     DumpELFHeader(s, m_header);
3158     s->EOL();
3159     DumpELFProgramHeaders(s);
3160     s->EOL();
3161     DumpELFSectionHeaders(s);
3162     s->EOL();
3163     SectionList *section_list = GetSectionList();
3164     if (section_list)
3165         section_list->Dump(s, NULL, true, UINT32_MAX);
3166     Symtab *symtab = GetSymtab();
3167     if (symtab)
3168         symtab->Dump(s, NULL, eSortOrderNone);
3169     s->EOL();
3170     DumpDependentModules(s);
3171     s->EOL();
3172 }
3173 
3174 //----------------------------------------------------------------------
3175 // DumpELFHeader
3176 //
3177 // Dump the ELF header to the specified output stream
3178 //----------------------------------------------------------------------
3179 void
3180 ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header)
3181 {
3182     s->PutCString("ELF Header\n");
3183     s->Printf("e_ident[EI_MAG0   ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
3184     s->Printf("e_ident[EI_MAG1   ] = 0x%2.2x '%c'\n",
3185               header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]);
3186     s->Printf("e_ident[EI_MAG2   ] = 0x%2.2x '%c'\n",
3187               header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]);
3188     s->Printf("e_ident[EI_MAG3   ] = 0x%2.2x '%c'\n",
3189               header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]);
3190 
3191     s->Printf("e_ident[EI_CLASS  ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
3192     s->Printf("e_ident[EI_DATA   ] = 0x%2.2x ", header.e_ident[EI_DATA]);
3193     DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
3194     s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
3195     s->Printf ("e_ident[EI_PAD    ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
3196 
3197     s->Printf("e_type      = 0x%4.4x ", header.e_type);
3198     DumpELFHeader_e_type(s, header.e_type);
3199     s->Printf("\ne_machine   = 0x%4.4x\n", header.e_machine);
3200     s->Printf("e_version   = 0x%8.8x\n", header.e_version);
3201     s->Printf("e_entry     = 0x%8.8" PRIx64 "\n", header.e_entry);
3202     s->Printf("e_phoff     = 0x%8.8" PRIx64 "\n", header.e_phoff);
3203     s->Printf("e_shoff     = 0x%8.8" PRIx64 "\n", header.e_shoff);
3204     s->Printf("e_flags     = 0x%8.8x\n", header.e_flags);
3205     s->Printf("e_ehsize    = 0x%4.4x\n", header.e_ehsize);
3206     s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
3207     s->Printf("e_phnum     = 0x%4.4x\n", header.e_phnum);
3208     s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
3209     s->Printf("e_shnum     = 0x%4.4x\n", header.e_shnum);
3210     s->Printf("e_shstrndx  = 0x%4.4x\n", header.e_shstrndx);
3211 }
3212 
3213 //----------------------------------------------------------------------
3214 // DumpELFHeader_e_type
3215 //
3216 // Dump an token value for the ELF header member e_type
3217 //----------------------------------------------------------------------
3218 void
3219 ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type)
3220 {
3221     switch (e_type)
3222     {
3223     case ET_NONE:   *s << "ET_NONE"; break;
3224     case ET_REL:    *s << "ET_REL"; break;
3225     case ET_EXEC:   *s << "ET_EXEC"; break;
3226     case ET_DYN:    *s << "ET_DYN"; break;
3227     case ET_CORE:   *s << "ET_CORE"; break;
3228     default:
3229         break;
3230     }
3231 }
3232 
3233 //----------------------------------------------------------------------
3234 // DumpELFHeader_e_ident_EI_DATA
3235 //
3236 // Dump an token value for the ELF header member e_ident[EI_DATA]
3237 //----------------------------------------------------------------------
3238 void
3239 ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data)
3240 {
3241     switch (ei_data)
3242     {
3243     case ELFDATANONE:   *s << "ELFDATANONE"; break;
3244     case ELFDATA2LSB:   *s << "ELFDATA2LSB - Little Endian"; break;
3245     case ELFDATA2MSB:   *s << "ELFDATA2MSB - Big Endian"; break;
3246     default:
3247         break;
3248     }
3249 }
3250 
3251 
3252 //----------------------------------------------------------------------
3253 // DumpELFProgramHeader
3254 //
3255 // Dump a single ELF program header to the specified output stream
3256 //----------------------------------------------------------------------
3257 void
3258 ObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph)
3259 {
3260     DumpELFProgramHeader_p_type(s, ph.p_type);
3261     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr);
3262     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, ph.p_flags);
3263 
3264     DumpELFProgramHeader_p_flags(s, ph.p_flags);
3265     s->Printf(") %8.8" PRIx64, ph.p_align);
3266 }
3267 
3268 //----------------------------------------------------------------------
3269 // DumpELFProgramHeader_p_type
3270 //
3271 // Dump an token value for the ELF program header member p_type which
3272 // describes the type of the program header
3273 // ----------------------------------------------------------------------
3274 void
3275 ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type)
3276 {
3277     const int kStrWidth = 15;
3278     switch (p_type)
3279     {
3280     CASE_AND_STREAM(s, PT_NULL        , kStrWidth);
3281     CASE_AND_STREAM(s, PT_LOAD        , kStrWidth);
3282     CASE_AND_STREAM(s, PT_DYNAMIC     , kStrWidth);
3283     CASE_AND_STREAM(s, PT_INTERP      , kStrWidth);
3284     CASE_AND_STREAM(s, PT_NOTE        , kStrWidth);
3285     CASE_AND_STREAM(s, PT_SHLIB       , kStrWidth);
3286     CASE_AND_STREAM(s, PT_PHDR        , kStrWidth);
3287     CASE_AND_STREAM(s, PT_TLS         , kStrWidth);
3288     CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
3289     default:
3290         s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
3291         break;
3292     }
3293 }
3294 
3295 
3296 //----------------------------------------------------------------------
3297 // DumpELFProgramHeader_p_flags
3298 //
3299 // Dump an token value for the ELF program header member p_flags
3300 //----------------------------------------------------------------------
3301 void
3302 ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags)
3303 {
3304     *s  << ((p_flags & PF_X) ? "PF_X" : "    ")
3305         << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
3306         << ((p_flags & PF_W) ? "PF_W" : "    ")
3307         << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
3308         << ((p_flags & PF_R) ? "PF_R" : "    ");
3309 }
3310 
3311 //----------------------------------------------------------------------
3312 // DumpELFProgramHeaders
3313 //
3314 // Dump all of the ELF program header to the specified output stream
3315 //----------------------------------------------------------------------
3316 void
3317 ObjectFileELF::DumpELFProgramHeaders(Stream *s)
3318 {
3319     if (!ParseProgramHeaders())
3320         return;
3321 
3322     s->PutCString("Program Headers\n");
3323     s->PutCString("IDX  p_type          p_offset p_vaddr  p_paddr  "
3324                   "p_filesz p_memsz  p_flags                   p_align\n");
3325     s->PutCString("==== --------------- -------- -------- -------- "
3326                   "-------- -------- ------------------------- --------\n");
3327 
3328     uint32_t idx = 0;
3329     for (ProgramHeaderCollConstIter I = m_program_headers.begin();
3330          I != m_program_headers.end(); ++I, ++idx)
3331     {
3332         s->Printf("[%2u] ", idx);
3333         ObjectFileELF::DumpELFProgramHeader(s, *I);
3334         s->EOL();
3335     }
3336 }
3337 
3338 //----------------------------------------------------------------------
3339 // DumpELFSectionHeader
3340 //
3341 // Dump a single ELF section header to the specified output stream
3342 //----------------------------------------------------------------------
3343 void
3344 ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh)
3345 {
3346     s->Printf("%8.8x ", sh.sh_name);
3347     DumpELFSectionHeader_sh_type(s, sh.sh_type);
3348     s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
3349     DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
3350     s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, sh.sh_offset, sh.sh_size);
3351     s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
3352     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
3353 }
3354 
3355 //----------------------------------------------------------------------
3356 // DumpELFSectionHeader_sh_type
3357 //
3358 // Dump an token value for the ELF section header member sh_type which
3359 // describes the type of the section
3360 //----------------------------------------------------------------------
3361 void
3362 ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type)
3363 {
3364     const int kStrWidth = 12;
3365     switch (sh_type)
3366     {
3367     CASE_AND_STREAM(s, SHT_NULL     , kStrWidth);
3368     CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth);
3369     CASE_AND_STREAM(s, SHT_SYMTAB   , kStrWidth);
3370     CASE_AND_STREAM(s, SHT_STRTAB   , kStrWidth);
3371     CASE_AND_STREAM(s, SHT_RELA     , kStrWidth);
3372     CASE_AND_STREAM(s, SHT_HASH     , kStrWidth);
3373     CASE_AND_STREAM(s, SHT_DYNAMIC  , kStrWidth);
3374     CASE_AND_STREAM(s, SHT_NOTE     , kStrWidth);
3375     CASE_AND_STREAM(s, SHT_NOBITS   , kStrWidth);
3376     CASE_AND_STREAM(s, SHT_REL      , kStrWidth);
3377     CASE_AND_STREAM(s, SHT_SHLIB    , kStrWidth);
3378     CASE_AND_STREAM(s, SHT_DYNSYM   , kStrWidth);
3379     CASE_AND_STREAM(s, SHT_LOPROC   , kStrWidth);
3380     CASE_AND_STREAM(s, SHT_HIPROC   , kStrWidth);
3381     CASE_AND_STREAM(s, SHT_LOUSER   , kStrWidth);
3382     CASE_AND_STREAM(s, SHT_HIUSER   , kStrWidth);
3383     default:
3384         s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
3385         break;
3386     }
3387 }
3388 
3389 //----------------------------------------------------------------------
3390 // DumpELFSectionHeader_sh_flags
3391 //
3392 // Dump an token value for the ELF section header member sh_flags
3393 //----------------------------------------------------------------------
3394 void
3395 ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags)
3396 {
3397     *s  << ((sh_flags & SHF_WRITE) ? "WRITE" : "     ")
3398         << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
3399         << ((sh_flags & SHF_ALLOC) ? "ALLOC" : "     ")
3400         << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
3401         << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : "         ");
3402 }
3403 
3404 //----------------------------------------------------------------------
3405 // DumpELFSectionHeaders
3406 //
3407 // Dump all of the ELF section header to the specified output stream
3408 //----------------------------------------------------------------------
3409 void
3410 ObjectFileELF::DumpELFSectionHeaders(Stream *s)
3411 {
3412     if (!ParseSectionHeaders())
3413         return;
3414 
3415     s->PutCString("Section Headers\n");
3416     s->PutCString("IDX  name     type         flags                            "
3417                   "addr     offset   size     link     info     addralgn "
3418                   "entsize  Name\n");
3419     s->PutCString("==== -------- ------------ -------------------------------- "
3420                   "-------- -------- -------- -------- -------- -------- "
3421                   "-------- ====================\n");
3422 
3423     uint32_t idx = 0;
3424     for (SectionHeaderCollConstIter I = m_section_headers.begin();
3425          I != m_section_headers.end(); ++I, ++idx)
3426     {
3427         s->Printf("[%2u] ", idx);
3428         ObjectFileELF::DumpELFSectionHeader(s, *I);
3429         const char* section_name = I->section_name.AsCString("");
3430         if (section_name)
3431             *s << ' ' << section_name << "\n";
3432     }
3433 }
3434 
3435 void
3436 ObjectFileELF::DumpDependentModules(lldb_private::Stream *s)
3437 {
3438     size_t num_modules = ParseDependentModules();
3439 
3440     if (num_modules > 0)
3441     {
3442         s->PutCString("Dependent Modules:\n");
3443         for (unsigned i = 0; i < num_modules; ++i)
3444         {
3445             const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
3446             s->Printf("   %s\n", spec.GetFilename().GetCString());
3447         }
3448     }
3449 }
3450 
3451 bool
3452 ObjectFileELF::GetArchitecture (ArchSpec &arch)
3453 {
3454     if (!ParseHeader())
3455         return false;
3456 
3457     if (m_section_headers.empty())
3458     {
3459         // Allow elf notes to be parsed which may affect the detected architecture.
3460         ParseSectionHeaders();
3461     }
3462 
3463     if (CalculateType() == eTypeCoreFile && m_arch_spec.TripleOSIsUnspecifiedUnknown())
3464     {
3465         // Core files don't have section headers yet they have PT_NOTE program headers
3466         // that might shed more light on the architecture
3467         if (ParseProgramHeaders())
3468         {
3469             for (size_t i = 0, count = GetProgramHeaderCount(); i < count; ++i)
3470             {
3471                 const elf::ELFProgramHeader* header = GetProgramHeaderByIndex(i);
3472                 if (header && header->p_type == PT_NOTE && header->p_offset != 0 && header->p_filesz > 0)
3473                 {
3474                     DataExtractor data;
3475                     if (data.SetData (m_data, header->p_offset, header->p_filesz) == header->p_filesz)
3476                     {
3477                         lldb_private::UUID uuid;
3478                         RefineModuleDetailsFromNote (data, m_arch_spec, uuid);
3479                     }
3480                 }
3481             }
3482         }
3483     }
3484     arch = m_arch_spec;
3485     return true;
3486 }
3487 
3488 ObjectFile::Type
3489 ObjectFileELF::CalculateType()
3490 {
3491     switch (m_header.e_type)
3492     {
3493         case llvm::ELF::ET_NONE:
3494             // 0 - No file type
3495             return eTypeUnknown;
3496 
3497         case llvm::ELF::ET_REL:
3498             // 1 - Relocatable file
3499             return eTypeObjectFile;
3500 
3501         case llvm::ELF::ET_EXEC:
3502             // 2 - Executable file
3503             return eTypeExecutable;
3504 
3505         case llvm::ELF::ET_DYN:
3506             // 3 - Shared object file
3507             return eTypeSharedLibrary;
3508 
3509         case ET_CORE:
3510             // 4 - Core file
3511             return eTypeCoreFile;
3512 
3513         default:
3514             break;
3515     }
3516     return eTypeUnknown;
3517 }
3518 
3519 ObjectFile::Strata
3520 ObjectFileELF::CalculateStrata()
3521 {
3522     switch (m_header.e_type)
3523     {
3524         case llvm::ELF::ET_NONE:
3525             // 0 - No file type
3526             return eStrataUnknown;
3527 
3528         case llvm::ELF::ET_REL:
3529             // 1 - Relocatable file
3530             return eStrataUnknown;
3531 
3532         case llvm::ELF::ET_EXEC:
3533             // 2 - Executable file
3534             // TODO: is there any way to detect that an executable is a kernel
3535             // related executable by inspecting the program headers, section
3536             // headers, symbols, or any other flag bits???
3537             return eStrataUser;
3538 
3539         case llvm::ELF::ET_DYN:
3540             // 3 - Shared object file
3541             // TODO: is there any way to detect that an shared library is a kernel
3542             // related executable by inspecting the program headers, section
3543             // headers, symbols, or any other flag bits???
3544             return eStrataUnknown;
3545 
3546         case ET_CORE:
3547             // 4 - Core file
3548             // TODO: is there any way to detect that an core file is a kernel
3549             // related executable by inspecting the program headers, section
3550             // headers, symbols, or any other flag bits???
3551             return eStrataUnknown;
3552 
3553         default:
3554             break;
3555     }
3556     return eStrataUnknown;
3557 }
3558 
3559