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