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