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