xref: /llvm-project/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (revision 6e7b0a088e9f2efb4cb0c1a5bfe6606b3946353f)
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->MemoryMapFileContents(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->MemoryMapFileContents(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.MemoryMapFileContents (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.MemoryMapFileContents(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.MemoryMapFileContents(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.MemoryMapFileContents (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 
1728     //StreamFile strm(stdout, false);
1729     unsigned i;
1730     for (i = 0; i < num_symbols; ++i)
1731     {
1732         if (symbol.Parse(symtab_data, &offset) == false)
1733             break;
1734 
1735         const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1736 
1737         // No need to add non-section symbols that have no names
1738         if (symbol.getType() != STT_SECTION &&
1739             (symbol_name == NULL || symbol_name[0] == '\0'))
1740             continue;
1741 
1742         //symbol.Dump (&strm, i, &strtab_data, section_list);
1743 
1744         SectionSP symbol_section_sp;
1745         SymbolType symbol_type = eSymbolTypeInvalid;
1746         Elf64_Half symbol_idx = symbol.st_shndx;
1747 
1748         switch (symbol_idx)
1749         {
1750         case SHN_ABS:
1751             symbol_type = eSymbolTypeAbsolute;
1752             break;
1753         case SHN_UNDEF:
1754             symbol_type = eSymbolTypeUndefined;
1755             break;
1756         default:
1757             symbol_section_sp = section_list->GetSectionAtIndex(symbol_idx);
1758             break;
1759         }
1760 
1761         // If a symbol is undefined do not process it further even if it has a STT type
1762         if (symbol_type != eSymbolTypeUndefined)
1763         {
1764             switch (symbol.getType())
1765             {
1766             default:
1767             case STT_NOTYPE:
1768                 // The symbol's type is not specified.
1769                 break;
1770 
1771             case STT_OBJECT:
1772                 // The symbol is associated with a data object, such as a variable,
1773                 // an array, etc.
1774                 symbol_type = eSymbolTypeData;
1775                 break;
1776 
1777             case STT_FUNC:
1778                 // The symbol is associated with a function or other executable code.
1779                 symbol_type = eSymbolTypeCode;
1780                 break;
1781 
1782             case STT_SECTION:
1783                 // The symbol is associated with a section. Symbol table entries of
1784                 // this type exist primarily for relocation and normally have
1785                 // STB_LOCAL binding.
1786                 break;
1787 
1788             case STT_FILE:
1789                 // Conventionally, the symbol's name gives the name of the source
1790                 // file associated with the object file. A file symbol has STB_LOCAL
1791                 // binding, its section index is SHN_ABS, and it precedes the other
1792                 // STB_LOCAL symbols for the file, if it is present.
1793                 symbol_type = eSymbolTypeSourceFile;
1794                 break;
1795 
1796             case STT_GNU_IFUNC:
1797                 // The symbol is associated with an indirect function. The actual
1798                 // function will be resolved if it is referenced.
1799                 symbol_type = eSymbolTypeResolver;
1800                 break;
1801             }
1802         }
1803 
1804         if (symbol_type == eSymbolTypeInvalid)
1805         {
1806             if (symbol_section_sp)
1807             {
1808                 const ConstString &sect_name = symbol_section_sp->GetName();
1809                 if (sect_name == text_section_name ||
1810                     sect_name == init_section_name ||
1811                     sect_name == fini_section_name ||
1812                     sect_name == ctors_section_name ||
1813                     sect_name == dtors_section_name)
1814                 {
1815                     symbol_type = eSymbolTypeCode;
1816                 }
1817                 else if (sect_name == data_section_name ||
1818                          sect_name == data2_section_name ||
1819                          sect_name == rodata_section_name ||
1820                          sect_name == rodata1_section_name ||
1821                          sect_name == bss_section_name)
1822                 {
1823                     symbol_type = eSymbolTypeData;
1824                 }
1825             }
1826         }
1827 
1828         ArchSpec arch;
1829         int64_t symbol_value_offset = 0;
1830         uint32_t additional_flags = 0;
1831 
1832         if (GetArchitecture(arch) &&
1833             arch.GetMachine() == llvm::Triple::arm)
1834         {
1835             // ELF symbol tables may contain some mapping symbols. They provide
1836             // information about the underlying data. There are three of them
1837             // currently defined:
1838             //   $a[.<any>]* - marks an ARM instruction sequence
1839             //   $t[.<any>]* - marks a THUMB instruction sequence
1840             //   $d[.<any>]* - marks a data item sequence (e.g. lit pool)
1841             // These symbols interfere with normal debugger operations and we
1842             // don't need them. We can drop them here.
1843 
1844             static const llvm::StringRef g_armelf_arm_marker("$a");
1845             static const llvm::StringRef g_armelf_thumb_marker("$t");
1846             static const llvm::StringRef g_armelf_data_marker("$d");
1847             llvm::StringRef symbol_name_ref(symbol_name);
1848 
1849             if (symbol_name &&
1850                 (symbol_name_ref.startswith(g_armelf_arm_marker) ||
1851                  symbol_name_ref.startswith(g_armelf_thumb_marker) ||
1852                  symbol_name_ref.startswith(g_armelf_data_marker)))
1853                 continue;
1854 
1855             // THUMB functions have the lower bit of their address set. Fixup
1856             // the actual address and mark the symbol as THUMB.
1857             if (symbol_type == eSymbolTypeCode && symbol.st_value & 1)
1858             {
1859                 // Substracting 1 from the address effectively unsets
1860                 // the low order bit, which results in the address
1861                 // actually pointing to the beginning of the symbol.
1862                 // This delta will be used below in conjuction with
1863                 // symbol.st_value to produce the final symbol_value
1864                 // that we store in the symtab.
1865                 symbol_value_offset = -1;
1866                 additional_flags = ARM_ELF_SYM_IS_THUMB;
1867             }
1868         }
1869 
1870         // If the symbol section we've found has no data (SHT_NOBITS), then check the module section
1871         // list. This can happen if we're parsing the debug file and it has no .text section, for example.
1872         if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0))
1873         {
1874             ModuleSP module_sp(GetModule());
1875             if (module_sp)
1876             {
1877                 SectionList *module_section_list = module_sp->GetSectionList();
1878                 if (module_section_list && module_section_list != section_list)
1879                 {
1880                     const ConstString &sect_name = symbol_section_sp->GetName();
1881                     lldb::SectionSP section_sp (module_section_list->FindSectionByName (sect_name));
1882                     if (section_sp && section_sp->GetFileSize())
1883                     {
1884                         symbol_section_sp = section_sp;
1885                     }
1886                 }
1887             }
1888         }
1889 
1890         // symbol_value_offset may contain 0 for ARM symbols or -1 for
1891         // THUMB symbols. See above for more details.
1892         uint64_t symbol_value = symbol.st_value | symbol_value_offset;
1893         if (symbol_section_sp && CalculateType() != ObjectFile::Type::eTypeObjectFile)
1894             symbol_value -= symbol_section_sp->GetFileAddress();
1895         bool is_global = symbol.getBinding() == STB_GLOBAL;
1896         uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
1897         bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
1898 
1899         Symbol dc_symbol(
1900             i + start_id,       // ID is the original symbol table index.
1901             symbol_name,        // Symbol name.
1902             is_mangled,         // Is the symbol name mangled?
1903             symbol_type,        // Type of this symbol
1904             is_global,          // Is this globally visible?
1905             false,              // Is this symbol debug info?
1906             false,              // Is this symbol a trampoline?
1907             false,              // Is this symbol artificial?
1908             symbol_section_sp,  // Section in which this symbol is defined or null.
1909             symbol_value,       // Offset in section or symbol value.
1910             symbol.st_size,     // Size in bytes of this symbol.
1911             true,               // Size is valid
1912             flags);             // Symbol flags.
1913         symtab->AddSymbol(dc_symbol);
1914     }
1915 
1916     return i;
1917 }
1918 
1919 unsigned
1920 ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab)
1921 {
1922     if (symtab->GetObjectFile() != this)
1923     {
1924         // If the symbol table section is owned by a different object file, have it do the
1925         // parsing.
1926         ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile());
1927         return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
1928     }
1929 
1930     // Get section list for this object file.
1931     SectionList *section_list = m_sections_ap.get();
1932     if (!section_list)
1933         return 0;
1934 
1935     user_id_t symtab_id = symtab->GetID();
1936     const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
1937     assert(symtab_hdr->sh_type == SHT_SYMTAB ||
1938            symtab_hdr->sh_type == SHT_DYNSYM);
1939 
1940     // sh_link: section header index of associated string table.
1941     // Section ID's are ones based.
1942     user_id_t strtab_id = symtab_hdr->sh_link + 1;
1943     Section *strtab = section_list->FindSectionByID(strtab_id).get();
1944 
1945     if (symtab && strtab)
1946     {
1947         assert (symtab->GetObjectFile() == this);
1948         assert (strtab->GetObjectFile() == this);
1949 
1950         DataExtractor symtab_data;
1951         DataExtractor strtab_data;
1952         if (ReadSectionData(symtab, symtab_data) &&
1953             ReadSectionData(strtab, strtab_data))
1954         {
1955             size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
1956 
1957             return ParseSymbols(symbol_table, start_id, section_list,
1958                                 num_symbols, symtab_data, strtab_data);
1959         }
1960     }
1961 
1962     return 0;
1963 }
1964 
1965 size_t
1966 ObjectFileELF::ParseDynamicSymbols()
1967 {
1968     if (m_dynamic_symbols.size())
1969         return m_dynamic_symbols.size();
1970 
1971     SectionList *section_list = GetSectionList();
1972     if (!section_list)
1973         return 0;
1974 
1975     // Find the SHT_DYNAMIC section.
1976     Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
1977     if (!dynsym)
1978         return 0;
1979     assert (dynsym->GetObjectFile() == this);
1980 
1981     ELFDynamic symbol;
1982     DataExtractor dynsym_data;
1983     if (ReadSectionData(dynsym, dynsym_data))
1984     {
1985         const lldb::offset_t section_size = dynsym_data.GetByteSize();
1986         lldb::offset_t cursor = 0;
1987 
1988         while (cursor < section_size)
1989         {
1990             if (!symbol.Parse(dynsym_data, &cursor))
1991                 break;
1992 
1993             m_dynamic_symbols.push_back(symbol);
1994         }
1995     }
1996 
1997     return m_dynamic_symbols.size();
1998 }
1999 
2000 const ELFDynamic *
2001 ObjectFileELF::FindDynamicSymbol(unsigned tag)
2002 {
2003     if (!ParseDynamicSymbols())
2004         return NULL;
2005 
2006     DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2007     DynamicSymbolCollIter E = m_dynamic_symbols.end();
2008     for ( ; I != E; ++I)
2009     {
2010         ELFDynamic *symbol = &*I;
2011 
2012         if (symbol->d_tag == tag)
2013             return symbol;
2014     }
2015 
2016     return NULL;
2017 }
2018 
2019 unsigned
2020 ObjectFileELF::PLTRelocationType()
2021 {
2022     // DT_PLTREL
2023     //  This member specifies the type of relocation entry to which the
2024     //  procedure linkage table refers. The d_val member holds DT_REL or
2025     //  DT_RELA, as appropriate. All relocations in a procedure linkage table
2026     //  must use the same relocation.
2027     const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2028 
2029     if (symbol)
2030         return symbol->d_val;
2031 
2032     return 0;
2033 }
2034 
2035 static unsigned
2036 ParsePLTRelocations(Symtab *symbol_table,
2037                     user_id_t start_id,
2038                     unsigned rel_type,
2039                     const ELFHeader *hdr,
2040                     const ELFSectionHeader *rel_hdr,
2041                     const ELFSectionHeader *plt_hdr,
2042                     const ELFSectionHeader *sym_hdr,
2043                     const lldb::SectionSP &plt_section_sp,
2044                     DataExtractor &rel_data,
2045                     DataExtractor &symtab_data,
2046                     DataExtractor &strtab_data)
2047 {
2048     ELFRelocation rel(rel_type);
2049     ELFSymbol symbol;
2050     lldb::offset_t offset = 0;
2051     // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 16 bytes.
2052     // So round the entsize up by the alignment if addralign is set.
2053     const elf_xword plt_entsize = plt_hdr->sh_addralign ?
2054         llvm::RoundUpToAlignment (plt_hdr->sh_entsize, plt_hdr->sh_addralign) : plt_hdr->sh_entsize;
2055     const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2056 
2057     typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2058     reloc_info_fn reloc_type;
2059     reloc_info_fn reloc_symbol;
2060 
2061     if (hdr->Is32Bit())
2062     {
2063         reloc_type = ELFRelocation::RelocType32;
2064         reloc_symbol = ELFRelocation::RelocSymbol32;
2065     }
2066     else
2067     {
2068         reloc_type = ELFRelocation::RelocType64;
2069         reloc_symbol = ELFRelocation::RelocSymbol64;
2070     }
2071 
2072     unsigned slot_type = hdr->GetRelocationJumpSlotType();
2073     unsigned i;
2074     for (i = 0; i < num_relocations; ++i)
2075     {
2076         if (rel.Parse(rel_data, &offset) == false)
2077             break;
2078 
2079         if (reloc_type(rel) != slot_type)
2080             continue;
2081 
2082         lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
2083         uint64_t plt_index = (i + 1) * plt_entsize;
2084 
2085         if (!symbol.Parse(symtab_data, &symbol_offset))
2086             break;
2087 
2088         const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2089         bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
2090 
2091         Symbol jump_symbol(
2092             i + start_id,    // Symbol table index
2093             symbol_name,     // symbol name.
2094             is_mangled,      // is the symbol name mangled?
2095             eSymbolTypeTrampoline, // Type of this symbol
2096             false,           // Is this globally visible?
2097             false,           // Is this symbol debug info?
2098             true,            // Is this symbol a trampoline?
2099             true,            // Is this symbol artificial?
2100             plt_section_sp,  // Section in which this symbol is defined or null.
2101             plt_index,       // Offset in section or symbol value.
2102             plt_entsize,     // Size in bytes of this symbol.
2103             true,            // Size is valid
2104             0);              // Symbol flags.
2105 
2106         symbol_table->AddSymbol(jump_symbol);
2107     }
2108 
2109     return i;
2110 }
2111 
2112 unsigned
2113 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table,
2114                                       user_id_t start_id,
2115                                       const ELFSectionHeaderInfo *rel_hdr,
2116                                       user_id_t rel_id)
2117 {
2118     assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2119 
2120     // The link field points to the associated symbol table. The info field
2121     // points to the section holding the plt.
2122     user_id_t symtab_id = rel_hdr->sh_link;
2123     user_id_t plt_id = rel_hdr->sh_info;
2124 
2125     if (!symtab_id || !plt_id)
2126         return 0;
2127 
2128     // Section ID's are ones based;
2129     symtab_id++;
2130     plt_id++;
2131 
2132     const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
2133     if (!plt_hdr)
2134         return 0;
2135 
2136     const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
2137     if (!sym_hdr)
2138         return 0;
2139 
2140     SectionList *section_list = m_sections_ap.get();
2141     if (!section_list)
2142         return 0;
2143 
2144     Section *rel_section = section_list->FindSectionByID(rel_id).get();
2145     if (!rel_section)
2146         return 0;
2147 
2148     SectionSP plt_section_sp (section_list->FindSectionByID(plt_id));
2149     if (!plt_section_sp)
2150         return 0;
2151 
2152     Section *symtab = section_list->FindSectionByID(symtab_id).get();
2153     if (!symtab)
2154         return 0;
2155 
2156     // sh_link points to associated string table.
2157     Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
2158     if (!strtab)
2159         return 0;
2160 
2161     DataExtractor rel_data;
2162     if (!ReadSectionData(rel_section, rel_data))
2163         return 0;
2164 
2165     DataExtractor symtab_data;
2166     if (!ReadSectionData(symtab, symtab_data))
2167         return 0;
2168 
2169     DataExtractor strtab_data;
2170     if (!ReadSectionData(strtab, strtab_data))
2171         return 0;
2172 
2173     unsigned rel_type = PLTRelocationType();
2174     if (!rel_type)
2175         return 0;
2176 
2177     return ParsePLTRelocations (symbol_table,
2178                                 start_id,
2179                                 rel_type,
2180                                 &m_header,
2181                                 rel_hdr,
2182                                 plt_hdr,
2183                                 sym_hdr,
2184                                 plt_section_sp,
2185                                 rel_data,
2186                                 symtab_data,
2187                                 strtab_data);
2188 }
2189 
2190 unsigned
2191 ObjectFileELF::RelocateSection(Symtab* symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2192                 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2193                 DataExtractor &rel_data, DataExtractor &symtab_data,
2194                 DataExtractor &debug_data, Section* rel_section)
2195 {
2196     ELFRelocation rel(rel_hdr->sh_type);
2197     lldb::addr_t offset = 0;
2198     const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2199     typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2200     reloc_info_fn reloc_type;
2201     reloc_info_fn reloc_symbol;
2202 
2203     if (hdr->Is32Bit())
2204     {
2205         reloc_type = ELFRelocation::RelocType32;
2206         reloc_symbol = ELFRelocation::RelocSymbol32;
2207     }
2208     else
2209     {
2210         reloc_type = ELFRelocation::RelocType64;
2211         reloc_symbol = ELFRelocation::RelocSymbol64;
2212     }
2213 
2214     for (unsigned i = 0; i < num_relocations; ++i)
2215     {
2216         if (rel.Parse(rel_data, &offset) == false)
2217             break;
2218 
2219         Symbol* symbol = NULL;
2220 
2221         if (hdr->Is32Bit())
2222         {
2223             switch (reloc_type(rel)) {
2224             case R_386_32:
2225             case R_386_PC32:
2226             default:
2227                 assert(false && "unexpected relocation type");
2228             }
2229         } else {
2230             switch (reloc_type(rel)) {
2231             case R_X86_64_64:
2232             {
2233                 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2234                 if (symbol)
2235                 {
2236                     addr_t value = symbol->GetAddress().GetFileAddress();
2237                     DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2238                     uint64_t* dst = reinterpret_cast<uint64_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset64(rel));
2239                     *dst = value + ELFRelocation::RelocAddend64(rel);
2240                 }
2241                 break;
2242             }
2243             case R_X86_64_32:
2244             case R_X86_64_32S:
2245             {
2246                 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2247                 if (symbol)
2248                 {
2249                     addr_t value = symbol->GetAddress().GetFileAddress();
2250                     value += ELFRelocation::RelocAddend32(rel);
2251                     assert((reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) ||
2252                            (reloc_type(rel) == R_X86_64_32S &&
2253                             ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN)));
2254                     uint32_t truncated_addr = (value & 0xFFFFFFFF);
2255                     DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2256                     uint32_t* dst = reinterpret_cast<uint32_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel));
2257                     *dst = truncated_addr;
2258                 }
2259                 break;
2260             }
2261             case R_X86_64_PC32:
2262             default:
2263                 assert(false && "unexpected relocation type");
2264             }
2265         }
2266     }
2267 
2268     return 0;
2269 }
2270 
2271 unsigned
2272 ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, user_id_t rel_id)
2273 {
2274     assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2275 
2276     // Parse in the section list if needed.
2277     SectionList *section_list = GetSectionList();
2278     if (!section_list)
2279         return 0;
2280 
2281     // Section ID's are ones based.
2282     user_id_t symtab_id = rel_hdr->sh_link + 1;
2283     user_id_t debug_id = rel_hdr->sh_info + 1;
2284 
2285     const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2286     if (!symtab_hdr)
2287         return 0;
2288 
2289     const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2290     if (!debug_hdr)
2291         return 0;
2292 
2293     Section *rel = section_list->FindSectionByID(rel_id).get();
2294     if (!rel)
2295         return 0;
2296 
2297     Section *symtab = section_list->FindSectionByID(symtab_id).get();
2298     if (!symtab)
2299         return 0;
2300 
2301     Section *debug = section_list->FindSectionByID(debug_id).get();
2302     if (!debug)
2303         return 0;
2304 
2305     DataExtractor rel_data;
2306     DataExtractor symtab_data;
2307     DataExtractor debug_data;
2308 
2309     if (ReadSectionData(rel, rel_data) &&
2310         ReadSectionData(symtab, symtab_data) &&
2311         ReadSectionData(debug, debug_data))
2312     {
2313         RelocateSection(m_symtab_ap.get(), &m_header, rel_hdr, symtab_hdr, debug_hdr,
2314                         rel_data, symtab_data, debug_data, debug);
2315     }
2316 
2317     return 0;
2318 }
2319 
2320 Symtab *
2321 ObjectFileELF::GetSymtab()
2322 {
2323     ModuleSP module_sp(GetModule());
2324     if (!module_sp)
2325         return NULL;
2326 
2327     // We always want to use the main object file so we (hopefully) only have one cached copy
2328     // of our symtab, dynamic sections, etc.
2329     ObjectFile *module_obj_file = module_sp->GetObjectFile();
2330     if (module_obj_file && module_obj_file != this)
2331         return module_obj_file->GetSymtab();
2332 
2333     if (m_symtab_ap.get() == NULL)
2334     {
2335         SectionList *section_list = GetSectionList();
2336         if (!section_list)
2337             return NULL;
2338 
2339         uint64_t symbol_id = 0;
2340         lldb_private::Mutex::Locker locker(module_sp->GetMutex());
2341 
2342         m_symtab_ap.reset(new Symtab(this));
2343 
2344         // Sharable objects and dynamic executables usually have 2 distinct symbol
2345         // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller
2346         // version of the symtab that only contains global symbols. The information found
2347         // in the dynsym is therefore also found in the symtab, while the reverse is not
2348         // necessarily true.
2349         Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get();
2350         if (!symtab)
2351         {
2352             // The symtab section is non-allocable and can be stripped, so if it doesn't exist
2353             // then use the dynsym section which should always be there.
2354             symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get();
2355         }
2356         if (symtab)
2357             symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab);
2358 
2359         // DT_JMPREL
2360         //      If present, this entry's d_ptr member holds the address of relocation
2361         //      entries associated solely with the procedure linkage table. Separating
2362         //      these relocation entries lets the dynamic linker ignore them during
2363         //      process initialization, if lazy binding is enabled. If this entry is
2364         //      present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2365         //      also be present.
2366         const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2367         if (symbol)
2368         {
2369             // Synthesize trampoline symbols to help navigate the PLT.
2370             addr_t addr = symbol->d_ptr;
2371             Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get();
2372             if (reloc_section)
2373             {
2374                 user_id_t reloc_id = reloc_section->GetID();
2375                 const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id);
2376                 assert(reloc_header);
2377 
2378                 ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id);
2379             }
2380         }
2381     }
2382 
2383     for (SectionHeaderCollIter I = m_section_headers.begin();
2384          I != m_section_headers.end(); ++I)
2385     {
2386         if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL)
2387         {
2388             if (CalculateType() == eTypeObjectFile)
2389             {
2390                 const char *section_name = I->section_name.AsCString("");
2391                 if (strstr(section_name, ".rela.debug") ||
2392                     strstr(section_name, ".rel.debug"))
2393                 {
2394                     const ELFSectionHeader &reloc_header = *I;
2395                     user_id_t reloc_id = SectionIndex(I);
2396                     RelocateDebugSections(&reloc_header, reloc_id);
2397                 }
2398             }
2399         }
2400     }
2401     return m_symtab_ap.get();
2402 }
2403 
2404 Symbol *
2405 ObjectFileELF::ResolveSymbolForAddress(const Address& so_addr, bool verify_unique)
2406 {
2407     if (!m_symtab_ap.get())
2408         return nullptr; // GetSymtab() should be called first.
2409 
2410     const SectionList *section_list = GetSectionList();
2411     if (!section_list)
2412         return nullptr;
2413 
2414     if (DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo())
2415     {
2416         AddressRange range;
2417         if (eh_frame->GetAddressRange (so_addr, range))
2418         {
2419             const addr_t file_addr = range.GetBaseAddress().GetFileAddress();
2420             Symbol * symbol = verify_unique ? m_symtab_ap->FindSymbolContainingFileAddress(file_addr) : nullptr;
2421             if (symbol)
2422                 return symbol;
2423 
2424             // Note that a (stripped) symbol won't be found by GetSymtab()...
2425             lldb::SectionSP eh_sym_section_sp = section_list->FindSectionContainingFileAddress(file_addr);
2426             if (eh_sym_section_sp.get())
2427             {
2428                 addr_t section_base = eh_sym_section_sp->GetFileAddress();
2429                 addr_t offset = file_addr - section_base;
2430                 uint64_t symbol_id = m_symtab_ap->GetNumSymbols();
2431 
2432                 Symbol eh_symbol(
2433                         symbol_id,            // Symbol table index.
2434                         "???",                // Symbol name.
2435                         false,                // Is the symbol name mangled?
2436                         eSymbolTypeCode,      // Type of this symbol.
2437                         true,                 // Is this globally visible?
2438                         false,                // Is this symbol debug info?
2439                         false,                // Is this symbol a trampoline?
2440                         true,                 // Is this symbol artificial?
2441                         eh_sym_section_sp,    // Section in which this symbol is defined or null.
2442                         offset,               // Offset in section or symbol value.
2443                         range.GetByteSize(),  // Size in bytes of this symbol.
2444                         true,                 // Size is valid.
2445                         0);                   // Symbol flags.
2446                 if (symbol_id == m_symtab_ap->AddSymbol(eh_symbol))
2447                     return m_symtab_ap->SymbolAtIndex(symbol_id);
2448             }
2449         }
2450     }
2451     return nullptr;
2452 }
2453 
2454 
2455 bool
2456 ObjectFileELF::IsStripped ()
2457 {
2458     // TODO: determine this for ELF
2459     return false;
2460 }
2461 
2462 //===----------------------------------------------------------------------===//
2463 // Dump
2464 //
2465 // Dump the specifics of the runtime file container (such as any headers
2466 // segments, sections, etc).
2467 //----------------------------------------------------------------------
2468 void
2469 ObjectFileELF::Dump(Stream *s)
2470 {
2471     DumpELFHeader(s, m_header);
2472     s->EOL();
2473     DumpELFProgramHeaders(s);
2474     s->EOL();
2475     DumpELFSectionHeaders(s);
2476     s->EOL();
2477     SectionList *section_list = GetSectionList();
2478     if (section_list)
2479         section_list->Dump(s, NULL, true, UINT32_MAX);
2480     Symtab *symtab = GetSymtab();
2481     if (symtab)
2482         symtab->Dump(s, NULL, eSortOrderNone);
2483     s->EOL();
2484     DumpDependentModules(s);
2485     s->EOL();
2486 }
2487 
2488 //----------------------------------------------------------------------
2489 // DumpELFHeader
2490 //
2491 // Dump the ELF header to the specified output stream
2492 //----------------------------------------------------------------------
2493 void
2494 ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header)
2495 {
2496     s->PutCString("ELF Header\n");
2497     s->Printf("e_ident[EI_MAG0   ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2498     s->Printf("e_ident[EI_MAG1   ] = 0x%2.2x '%c'\n",
2499               header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]);
2500     s->Printf("e_ident[EI_MAG2   ] = 0x%2.2x '%c'\n",
2501               header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]);
2502     s->Printf("e_ident[EI_MAG3   ] = 0x%2.2x '%c'\n",
2503               header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]);
2504 
2505     s->Printf("e_ident[EI_CLASS  ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2506     s->Printf("e_ident[EI_DATA   ] = 0x%2.2x ", header.e_ident[EI_DATA]);
2507     DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2508     s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2509     s->Printf ("e_ident[EI_PAD    ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
2510 
2511     s->Printf("e_type      = 0x%4.4x ", header.e_type);
2512     DumpELFHeader_e_type(s, header.e_type);
2513     s->Printf("\ne_machine   = 0x%4.4x\n", header.e_machine);
2514     s->Printf("e_version   = 0x%8.8x\n", header.e_version);
2515     s->Printf("e_entry     = 0x%8.8" PRIx64 "\n", header.e_entry);
2516     s->Printf("e_phoff     = 0x%8.8" PRIx64 "\n", header.e_phoff);
2517     s->Printf("e_shoff     = 0x%8.8" PRIx64 "\n", header.e_shoff);
2518     s->Printf("e_flags     = 0x%8.8x\n", header.e_flags);
2519     s->Printf("e_ehsize    = 0x%4.4x\n", header.e_ehsize);
2520     s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
2521     s->Printf("e_phnum     = 0x%4.4x\n", header.e_phnum);
2522     s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
2523     s->Printf("e_shnum     = 0x%4.4x\n", header.e_shnum);
2524     s->Printf("e_shstrndx  = 0x%4.4x\n", header.e_shstrndx);
2525 }
2526 
2527 //----------------------------------------------------------------------
2528 // DumpELFHeader_e_type
2529 //
2530 // Dump an token value for the ELF header member e_type
2531 //----------------------------------------------------------------------
2532 void
2533 ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type)
2534 {
2535     switch (e_type)
2536     {
2537     case ET_NONE:   *s << "ET_NONE"; break;
2538     case ET_REL:    *s << "ET_REL"; break;
2539     case ET_EXEC:   *s << "ET_EXEC"; break;
2540     case ET_DYN:    *s << "ET_DYN"; break;
2541     case ET_CORE:   *s << "ET_CORE"; break;
2542     default:
2543         break;
2544     }
2545 }
2546 
2547 //----------------------------------------------------------------------
2548 // DumpELFHeader_e_ident_EI_DATA
2549 //
2550 // Dump an token value for the ELF header member e_ident[EI_DATA]
2551 //----------------------------------------------------------------------
2552 void
2553 ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data)
2554 {
2555     switch (ei_data)
2556     {
2557     case ELFDATANONE:   *s << "ELFDATANONE"; break;
2558     case ELFDATA2LSB:   *s << "ELFDATA2LSB - Little Endian"; break;
2559     case ELFDATA2MSB:   *s << "ELFDATA2MSB - Big Endian"; break;
2560     default:
2561         break;
2562     }
2563 }
2564 
2565 
2566 //----------------------------------------------------------------------
2567 // DumpELFProgramHeader
2568 //
2569 // Dump a single ELF program header to the specified output stream
2570 //----------------------------------------------------------------------
2571 void
2572 ObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph)
2573 {
2574     DumpELFProgramHeader_p_type(s, ph.p_type);
2575     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr);
2576     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, ph.p_flags);
2577 
2578     DumpELFProgramHeader_p_flags(s, ph.p_flags);
2579     s->Printf(") %8.8" PRIx64, ph.p_align);
2580 }
2581 
2582 //----------------------------------------------------------------------
2583 // DumpELFProgramHeader_p_type
2584 //
2585 // Dump an token value for the ELF program header member p_type which
2586 // describes the type of the program header
2587 // ----------------------------------------------------------------------
2588 void
2589 ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type)
2590 {
2591     const int kStrWidth = 15;
2592     switch (p_type)
2593     {
2594     CASE_AND_STREAM(s, PT_NULL        , kStrWidth);
2595     CASE_AND_STREAM(s, PT_LOAD        , kStrWidth);
2596     CASE_AND_STREAM(s, PT_DYNAMIC     , kStrWidth);
2597     CASE_AND_STREAM(s, PT_INTERP      , kStrWidth);
2598     CASE_AND_STREAM(s, PT_NOTE        , kStrWidth);
2599     CASE_AND_STREAM(s, PT_SHLIB       , kStrWidth);
2600     CASE_AND_STREAM(s, PT_PHDR        , kStrWidth);
2601     CASE_AND_STREAM(s, PT_TLS         , kStrWidth);
2602     CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
2603     default:
2604         s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
2605         break;
2606     }
2607 }
2608 
2609 
2610 //----------------------------------------------------------------------
2611 // DumpELFProgramHeader_p_flags
2612 //
2613 // Dump an token value for the ELF program header member p_flags
2614 //----------------------------------------------------------------------
2615 void
2616 ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags)
2617 {
2618     *s  << ((p_flags & PF_X) ? "PF_X" : "    ")
2619         << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
2620         << ((p_flags & PF_W) ? "PF_W" : "    ")
2621         << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
2622         << ((p_flags & PF_R) ? "PF_R" : "    ");
2623 }
2624 
2625 //----------------------------------------------------------------------
2626 // DumpELFProgramHeaders
2627 //
2628 // Dump all of the ELF program header to the specified output stream
2629 //----------------------------------------------------------------------
2630 void
2631 ObjectFileELF::DumpELFProgramHeaders(Stream *s)
2632 {
2633     if (ParseProgramHeaders())
2634     {
2635         s->PutCString("Program Headers\n");
2636         s->PutCString("IDX  p_type          p_offset p_vaddr  p_paddr  "
2637                       "p_filesz p_memsz  p_flags                   p_align\n");
2638         s->PutCString("==== --------------- -------- -------- -------- "
2639                       "-------- -------- ------------------------- --------\n");
2640 
2641         uint32_t idx = 0;
2642         for (ProgramHeaderCollConstIter I = m_program_headers.begin();
2643              I != m_program_headers.end(); ++I, ++idx)
2644         {
2645             s->Printf("[%2u] ", idx);
2646             ObjectFileELF::DumpELFProgramHeader(s, *I);
2647             s->EOL();
2648         }
2649     }
2650 }
2651 
2652 //----------------------------------------------------------------------
2653 // DumpELFSectionHeader
2654 //
2655 // Dump a single ELF section header to the specified output stream
2656 //----------------------------------------------------------------------
2657 void
2658 ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh)
2659 {
2660     s->Printf("%8.8x ", sh.sh_name);
2661     DumpELFSectionHeader_sh_type(s, sh.sh_type);
2662     s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
2663     DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
2664     s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, sh.sh_offset, sh.sh_size);
2665     s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
2666     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
2667 }
2668 
2669 //----------------------------------------------------------------------
2670 // DumpELFSectionHeader_sh_type
2671 //
2672 // Dump an token value for the ELF section header member sh_type which
2673 // describes the type of the section
2674 //----------------------------------------------------------------------
2675 void
2676 ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type)
2677 {
2678     const int kStrWidth = 12;
2679     switch (sh_type)
2680     {
2681     CASE_AND_STREAM(s, SHT_NULL     , kStrWidth);
2682     CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth);
2683     CASE_AND_STREAM(s, SHT_SYMTAB   , kStrWidth);
2684     CASE_AND_STREAM(s, SHT_STRTAB   , kStrWidth);
2685     CASE_AND_STREAM(s, SHT_RELA     , kStrWidth);
2686     CASE_AND_STREAM(s, SHT_HASH     , kStrWidth);
2687     CASE_AND_STREAM(s, SHT_DYNAMIC  , kStrWidth);
2688     CASE_AND_STREAM(s, SHT_NOTE     , kStrWidth);
2689     CASE_AND_STREAM(s, SHT_NOBITS   , kStrWidth);
2690     CASE_AND_STREAM(s, SHT_REL      , kStrWidth);
2691     CASE_AND_STREAM(s, SHT_SHLIB    , kStrWidth);
2692     CASE_AND_STREAM(s, SHT_DYNSYM   , kStrWidth);
2693     CASE_AND_STREAM(s, SHT_LOPROC   , kStrWidth);
2694     CASE_AND_STREAM(s, SHT_HIPROC   , kStrWidth);
2695     CASE_AND_STREAM(s, SHT_LOUSER   , kStrWidth);
2696     CASE_AND_STREAM(s, SHT_HIUSER   , kStrWidth);
2697     default:
2698         s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
2699         break;
2700     }
2701 }
2702 
2703 //----------------------------------------------------------------------
2704 // DumpELFSectionHeader_sh_flags
2705 //
2706 // Dump an token value for the ELF section header member sh_flags
2707 //----------------------------------------------------------------------
2708 void
2709 ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags)
2710 {
2711     *s  << ((sh_flags & SHF_WRITE) ? "WRITE" : "     ")
2712         << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
2713         << ((sh_flags & SHF_ALLOC) ? "ALLOC" : "     ")
2714         << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
2715         << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : "         ");
2716 }
2717 
2718 //----------------------------------------------------------------------
2719 // DumpELFSectionHeaders
2720 //
2721 // Dump all of the ELF section header to the specified output stream
2722 //----------------------------------------------------------------------
2723 void
2724 ObjectFileELF::DumpELFSectionHeaders(Stream *s)
2725 {
2726     if (!ParseSectionHeaders())
2727         return;
2728 
2729     s->PutCString("Section Headers\n");
2730     s->PutCString("IDX  name     type         flags                            "
2731                   "addr     offset   size     link     info     addralgn "
2732                   "entsize  Name\n");
2733     s->PutCString("==== -------- ------------ -------------------------------- "
2734                   "-------- -------- -------- -------- -------- -------- "
2735                   "-------- ====================\n");
2736 
2737     uint32_t idx = 0;
2738     for (SectionHeaderCollConstIter I = m_section_headers.begin();
2739          I != m_section_headers.end(); ++I, ++idx)
2740     {
2741         s->Printf("[%2u] ", idx);
2742         ObjectFileELF::DumpELFSectionHeader(s, *I);
2743         const char* section_name = I->section_name.AsCString("");
2744         if (section_name)
2745             *s << ' ' << section_name << "\n";
2746     }
2747 }
2748 
2749 void
2750 ObjectFileELF::DumpDependentModules(lldb_private::Stream *s)
2751 {
2752     size_t num_modules = ParseDependentModules();
2753 
2754     if (num_modules > 0)
2755     {
2756         s->PutCString("Dependent Modules:\n");
2757         for (unsigned i = 0; i < num_modules; ++i)
2758         {
2759             const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
2760             s->Printf("   %s\n", spec.GetFilename().GetCString());
2761         }
2762     }
2763 }
2764 
2765 bool
2766 ObjectFileELF::GetArchitecture (ArchSpec &arch)
2767 {
2768     if (!ParseHeader())
2769         return false;
2770 
2771     if (m_section_headers.empty())
2772     {
2773         // Allow elf notes to be parsed which may affect the detected architecture.
2774         ParseSectionHeaders();
2775     }
2776 
2777     arch = m_arch_spec;
2778     return true;
2779 }
2780 
2781 ObjectFile::Type
2782 ObjectFileELF::CalculateType()
2783 {
2784     switch (m_header.e_type)
2785     {
2786         case llvm::ELF::ET_NONE:
2787             // 0 - No file type
2788             return eTypeUnknown;
2789 
2790         case llvm::ELF::ET_REL:
2791             // 1 - Relocatable file
2792             return eTypeObjectFile;
2793 
2794         case llvm::ELF::ET_EXEC:
2795             // 2 - Executable file
2796             return eTypeExecutable;
2797 
2798         case llvm::ELF::ET_DYN:
2799             // 3 - Shared object file
2800             return eTypeSharedLibrary;
2801 
2802         case ET_CORE:
2803             // 4 - Core file
2804             return eTypeCoreFile;
2805 
2806         default:
2807             break;
2808     }
2809     return eTypeUnknown;
2810 }
2811 
2812 ObjectFile::Strata
2813 ObjectFileELF::CalculateStrata()
2814 {
2815     switch (m_header.e_type)
2816     {
2817         case llvm::ELF::ET_NONE:
2818             // 0 - No file type
2819             return eStrataUnknown;
2820 
2821         case llvm::ELF::ET_REL:
2822             // 1 - Relocatable file
2823             return eStrataUnknown;
2824 
2825         case llvm::ELF::ET_EXEC:
2826             // 2 - Executable file
2827             // TODO: is there any way to detect that an executable is a kernel
2828             // related executable by inspecting the program headers, section
2829             // headers, symbols, or any other flag bits???
2830             return eStrataUser;
2831 
2832         case llvm::ELF::ET_DYN:
2833             // 3 - Shared object file
2834             // TODO: is there any way to detect that an shared library is a kernel
2835             // related executable by inspecting the program headers, section
2836             // headers, symbols, or any other flag bits???
2837             return eStrataUnknown;
2838 
2839         case ET_CORE:
2840             // 4 - Core file
2841             // TODO: is there any way to detect that an core file is a kernel
2842             // related executable by inspecting the program headers, section
2843             // headers, symbols, or any other flag bits???
2844             return eStrataUnknown;
2845 
2846         default:
2847             break;
2848     }
2849     return eStrataUnknown;
2850 }
2851 
2852