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