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