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