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
49 using namespace lldb;
50 using namespace lldb_private;
51 using namespace elf;
52 using namespace llvm::ELF;
53
54 LLDB_PLUGIN_DEFINE(ObjectFileELF)
55
56 namespace {
57
58 // ELF note owner definitions
59 const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
60 const char *const LLDB_NT_OWNER_GNU = "GNU";
61 const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
62 const char *const LLDB_NT_OWNER_NETBSDCORE = "NetBSD-CORE";
63 const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD";
64 const char *const LLDB_NT_OWNER_ANDROID = "Android";
65 const char *const LLDB_NT_OWNER_CORE = "CORE";
66 const char *const LLDB_NT_OWNER_LINUX = "LINUX";
67
68 // ELF note type definitions
69 const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
70 const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
71
72 const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
73 const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
74
75 const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
76
77 const elf_word LLDB_NT_NETBSD_IDENT_TAG = 1;
78 const elf_word LLDB_NT_NETBSD_IDENT_DESCSZ = 4;
79 const elf_word LLDB_NT_NETBSD_IDENT_NAMESZ = 7;
80 const elf_word LLDB_NT_NETBSD_PROCINFO = 1;
81
82 // GNU ABI note OS constants
83 const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
84 const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
85 const 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.
93 class ELFRelocation {
94 public:
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
121 private:
122 typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion;
123
124 RelocUnion reloc;
125 };
126
ELFRelocation(unsigned type)127 ELFRelocation::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
~ELFRelocation()138 ELFRelocation::~ELFRelocation() {
139 if (reloc.is<ELFRel *>())
140 delete reloc.get<ELFRel *>();
141 else
142 delete reloc.get<ELFRela *>();
143 }
144
Parse(const lldb_private::DataExtractor & data,lldb::offset_t * offset)145 bool 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
RelocType32(const ELFRelocation & rel)153 unsigned 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
RelocType64(const ELFRelocation & rel)160 unsigned 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
RelocSymbol32(const ELFRelocation & rel)167 unsigned 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
RelocSymbol64(const ELFRelocation & rel)174 unsigned 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
RelocOffset32(const ELFRelocation & rel)181 unsigned 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
RelocOffset64(const ELFRelocation & rel)188 unsigned 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
RelocAddend32(const ELFRelocation & rel)195 unsigned 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
RelocAddend64(const ELFRelocation & rel)202 unsigned 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
SegmentID(size_t PHdrIndex)211 static user_id_t SegmentID(size_t PHdrIndex) {
212 return ~user_id_t(PHdrIndex);
213 }
214
Parse(const DataExtractor & data,lldb::offset_t * offset)215 bool 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
mipsVariantFromElfFlags(const elf::ELFHeader & header)246 static 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
subTypeFromElfHeader(const elf::ELFHeader & header)299 static 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
306 char ObjectFileELF::ID;
307
308 // Arbitrary constant used as UUID prefix for core files.
309 const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C);
310
311 // Static methods.
Initialize()312 void ObjectFileELF::Initialize() {
313 PluginManager::RegisterPlugin(GetPluginNameStatic(),
314 GetPluginDescriptionStatic(), CreateInstance,
315 CreateMemoryInstance, GetModuleSpecifications);
316 }
317
Terminate()318 void ObjectFileELF::Terminate() {
319 PluginManager::UnregisterPlugin(CreateInstance);
320 }
321
GetPluginNameStatic()322 lldb_private::ConstString ObjectFileELF::GetPluginNameStatic() {
323 static ConstString g_name("elf");
324 return g_name;
325 }
326
GetPluginDescriptionStatic()327 const char *ObjectFileELF::GetPluginDescriptionStatic() {
328 return "ELF object file reader.";
329 }
330
CreateInstance(const lldb::ModuleSP & module_sp,DataBufferSP & data_sp,lldb::offset_t data_offset,const lldb_private::FileSpec * file,lldb::offset_t file_offset,lldb::offset_t length)331 ObjectFile *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
CreateMemoryInstance(const lldb::ModuleSP & module_sp,DataBufferSP & data_sp,const lldb::ProcessSP & process_sp,lldb::addr_t header_addr)374 ObjectFile *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
MagicBytesMatch(DataBufferSP & data_sp,lldb::addr_t data_offset,lldb::addr_t data_length)393 bool 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
calc_crc32(uint32_t init,const DataExtractor & data)404 static uint32_t calc_crc32(uint32_t init, const DataExtractor &data) {
405 return llvm::crc32(
406 init, llvm::makeArrayRef(data.GetDataStart(), data.GetByteSize()));
407 }
408
CalculateELFNotesSegmentsCRC32(const ProgramHeaderColl & program_headers,DataExtractor & object_data)409 uint32_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
OSABIAsCString(unsigned char osabi_byte)433 static 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
GetOsFromOSABI(unsigned char osabi_byte,llvm::Triple::OSType & ostype)470 static 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
GetModuleSpecifications(const lldb_private::FileSpec & file,lldb::DataBufferSP & data_sp,lldb::offset_t data_offset,lldb::offset_t file_offset,lldb::offset_t length,lldb_private::ModuleSpecList & specs)497 size_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
GetPluginName()624 lldb_private::ConstString ObjectFileELF::GetPluginName() {
625 return GetPluginNameStatic();
626 }
627
GetPluginVersion()628 uint32_t ObjectFileELF::GetPluginVersion() { return m_plugin_version; }
629 // ObjectFile protocol
630
ObjectFileELF(const lldb::ModuleSP & module_sp,DataBufferSP & data_sp,lldb::offset_t data_offset,const FileSpec * file,lldb::offset_t file_offset,lldb::offset_t length)631 ObjectFileELF::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
ObjectFileELF(const lldb::ModuleSP & module_sp,DataBufferSP & header_data_sp,const lldb::ProcessSP & process_sp,addr_t header_addr)640 ObjectFileELF::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
IsExecutable() const646 bool ObjectFileELF::IsExecutable() const {
647 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
648 }
649
SetLoadAddress(Target & target,lldb::addr_t value,bool value_is_offset)650 bool 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
GetByteOrder() const696 ByteOrder 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
GetAddressByteSize() const704 uint32_t ObjectFileELF::GetAddressByteSize() const {
705 return m_data.GetAddressByteSize();
706 }
707
GetAddressClass(addr_t file_addr)708 AddressClass 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
SectionIndex(const SectionHeaderCollIter & I)736 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
737 return std::distance(m_section_headers.begin(), I);
738 }
739
SectionIndex(const SectionHeaderCollConstIter & I) const740 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const {
741 return std::distance(m_section_headers.begin(), I);
742 }
743
ParseHeader()744 bool ObjectFileELF::ParseHeader() {
745 lldb::offset_t offset = 0;
746 return m_header.Parse(m_data, &offset);
747 }
748
GetUUID()749 UUID 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
GetDebugLink()787 llvm::Optional<FileSpec> ObjectFileELF::GetDebugLink() {
788 if (m_gnu_debuglink_file.empty())
789 return llvm::None;
790 return FileSpec(m_gnu_debuglink_file);
791 }
792
GetDependentModules(FileSpecList & files)793 uint32_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
GetImageInfoAddress(Target * target)805 Address 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
GetEntryPointAddress()872 lldb_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
GetBaseAddress()889 Address 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
ParseDependentModules()902 size_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
GetProgramHeaderInfo(ProgramHeaderColl & program_headers,DataExtractor & object_data,const ELFHeader & header)961 size_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
ParseProgramHeaders()996 bool ObjectFileELF::ParseProgramHeaders() {
997 return GetProgramHeaderInfo(m_program_headers, m_data, m_header) != 0;
998 }
999
1000 lldb_private::Status
RefineModuleDetailsFromNote(lldb_private::DataExtractor & data,lldb_private::ArchSpec & arch_spec,lldb_private::UUID & uuid)1001 ObjectFileELF::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
ParseARMAttributes(DataExtractor & data,uint64_t length,ArchSpec & arch_spec)1237 void 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
GetSectionHeaderInfo(SectionHeaderColl & section_headers,DataExtractor & object_data,const elf::ELFHeader & header,lldb_private::UUID & uuid,std::string & gnu_debuglink_file,uint32_t & gnu_debuglink_crc,ArchSpec & arch_spec)1308 size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_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
1533 llvm::StringRef
StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const1534 ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const {
1535 size_t pos = symbol_name.find('@');
1536 return symbol_name.substr(0, pos);
1537 }
1538
1539 // ParseSectionHeaders
ParseSectionHeaders()1540 size_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
1546 const ObjectFileELF::ELFSectionHeaderInfo *
GetSectionHeaderByIndex(lldb::user_id_t id)1547 ObjectFileELF::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
GetSectionIndexByName(const char * name)1557 lldb::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
GetSectionTypeFromName(llvm::StringRef Name)1566 static 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
GetSectionType(const ELFSectionHeaderInfo & H) const1612 SectionType 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
GetTargetByteSize(SectionType Type,const ArchSpec & arch)1631 static 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
GetPermissions(const ELFSectionHeader & H)1643 static 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
GetPermissions(const ELFProgramHeader & H)1654 static 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
1665 namespace {
1666
1667 using VMRange = lldb_private::Range<addr_t, addr_t>;
1668
1669 struct 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.
1677 class 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
GetVMRange(const ELFSectionHeader & H)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
1702 public:
VMAddressProvider(ObjectFile::Type Type,llvm::StringRef SegmentName)1703 VMAddressProvider(ObjectFile::Type Type, llvm::StringRef SegmentName)
1704 : ObjectType(Type), SegmentName(std::string(SegmentName)) {}
1705
GetNextSegmentName() const1706 std::string GetNextSegmentName() const {
1707 return llvm::formatv("{0}[{1}]", SegmentName, SegmentCount).str();
1708 }
1709
GetAddressInfo(const ELFProgramHeader & H)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
GetAddressInfo(const ELFSectionHeader & H)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
AddSegment(const VMRange & Range,SectionSP Seg)1752 void AddSegment(const VMRange &Range, SectionSP Seg) {
1753 Segments.insert(Range.GetRangeBase(), Range.GetRangeEnd(), std::move(Seg));
1754 ++SegmentCount;
1755 }
1756
AddSection(SectionAddressInfo Info,SectionSP Sect)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
CreateSections(SectionList & unified_section_list)1768 void 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
GetGnuDebugDataObjectFile()1873 std::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.
FindArmAarch64MappingSymbol(const char * symbol_name)1923 static 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
ParseSymbols(Symtab * symtab,user_id_t start_id,SectionList * section_list,const size_t num_symbols,const DataExtractor & symtab_data,const DataExtractor & strtab_data)1941 unsigned 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
ParseSymbolTable(Symtab * symbol_table,user_id_t start_id,lldb_private::Section * symtab)2274 unsigned 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
ParseDynamicSymbols()2317 size_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
FindDynamicSymbol(unsigned tag)2350 const 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
PLTRelocationType()2366 unsigned 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.
2384 static std::pair<uint64_t, uint64_t>
GetPltEntrySizeAndOffset(const ELFSectionHeader * rel_hdr,const ELFSectionHeader * plt_hdr)2385 GetPltEntrySizeAndOffset(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
ParsePLTRelocations(Symtab * symbol_table,user_id_t start_id,unsigned rel_type,const ELFHeader * hdr,const ELFSectionHeader * rel_hdr,const ELFSectionHeader * plt_hdr,const ELFSectionHeader * sym_hdr,const lldb::SectionSP & plt_section_sp,DataExtractor & rel_data,DataExtractor & symtab_data,DataExtractor & strtab_data)2418 static 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
2482 unsigned
ParseTrampolineSymbols(Symtab * symbol_table,user_id_t start_id,const ELFSectionHeaderInfo * rel_hdr,user_id_t rel_id)2483 ObjectFileELF::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
ApplyRelocations(Symtab * symtab,const ELFHeader * hdr,const ELFSectionHeader * rel_hdr,const ELFSectionHeader * symtab_hdr,const ELFSectionHeader * debug_hdr,DataExtractor & rel_data,DataExtractor & symtab_data,DataExtractor & debug_data,Section * rel_section)2553 unsigned 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
RelocateDebugSections(const ELFSectionHeader * rel_hdr,user_id_t rel_id,lldb_private::Symtab * thetab)2646 unsigned 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
GetSymtab()2693 Symtab *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
RelocateSection(lldb_private::Section * section)2834 void 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
ParseUnwindSymbols(Symtab * symbol_table,DWARFCallFrameInfo * eh_frame)2875 void 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
IsStripped()2927 bool 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).
Dump(Stream * s)2937 void 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
DumpELFHeader(Stream * s,const ELFHeader & header)2974 void 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
DumpELFHeader_e_type(Stream * s,elf_half e_type)3009 void 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]
DumpELFHeader_e_ident_EI_DATA(Stream * s,unsigned char ei_data)3034 void 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
DumpELFProgramHeader(Stream * s,const ELFProgramHeader & ph)3054 void 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
DumpELFProgramHeader_p_type(Stream * s,elf_word p_type)3070 void 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
DumpELFProgramHeader_p_flags(Stream * s,elf_word p_flags)3091 void 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
DumpELFProgramHeaders(Stream * s)3102 void 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
DumpELFSectionHeader(Stream * s,const ELFSectionHeaderInfo & sh)3122 void 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
DumpELFSectionHeader_sh_type(Stream * s,elf_word sh_type)3138 void 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
DumpELFSectionHeader_sh_flags(Stream * s,elf_xword sh_flags)3166 void 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
DumpELFSectionHeaders(Stream * s)3178 void 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
DumpDependentModules(lldb_private::Stream * s)3201 void 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
GetArchitecture()3213 ArchSpec 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
CalculateType()3239 ObjectFile::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
CalculateStrata()3267 ObjectFile::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
ReadSectionData(Section * section,lldb::offset_t section_offset,void * dst,size_t dst_len)3304 size_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
ReadSectionData(Section * section,DataExtractor & section_data)3322 size_t ObjectFileELF::ReadSectionData(Section *section,
3323 DataExtractor §ion_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
ProgramHeaders()3364 llvm::ArrayRef<ELFProgramHeader> ObjectFileELF::ProgramHeaders() {
3365 ParseProgramHeaders();
3366 return m_program_headers;
3367 }
3368
GetSegmentData(const ELFProgramHeader & H)3369 DataExtractor ObjectFileELF::GetSegmentData(const ELFProgramHeader &H) {
3370 return DataExtractor(m_data, H.p_offset, H.p_filesz);
3371 }
3372
AnySegmentHasPhysicalAddress()3373 bool ObjectFileELF::AnySegmentHasPhysicalAddress() {
3374 for (const ELFProgramHeader &H : ProgramHeaders()) {
3375 if (H.p_paddr != 0)
3376 return true;
3377 }
3378 return false;
3379 }
3380
3381 std::vector<ObjectFile::LoadableData>
GetLoadableData(Target & target)3382 ObjectFileELF::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