1 //===-- ObjectFileELF.cpp ------------------------------------- -*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #include "ObjectFileELF.h"
13 #include <unordered_map>
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/Symbol/DWARFCallFrameInfo.h"
22 #include "lldb/Symbol/SymbolContext.h"
23 #include "lldb/Target/SectionLoadList.h"
24 #include "lldb/Target/Target.h"
25 #include "lldb/Utility/ArchSpec.h"
26 #include "lldb/Utility/DataBufferHeap.h"
27 #include "lldb/Utility/Log.h"
28 #include "lldb/Utility/RangeMap.h"
29 #include "lldb/Utility/Status.h"
30 #include "lldb/Utility/Stream.h"
31 #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/Object/Decompressor.h"
37 #include "llvm/Support/ARMBuildAttributes.h"
38 #include "llvm/Support/MathExtras.h"
39 #include "llvm/Support/MemoryBuffer.h"
40 #include "llvm/Support/MipsABIFlags.h"
42 #define CASE_AND_STREAM(s, def, width) \
44 s->Printf("%-*s", width, #def); \
48 using namespace lldb_private;
50 using namespace llvm::ELF;
54 // ELF note owner definitions
55 const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
56 const char *const LLDB_NT_OWNER_GNU = "GNU";
57 const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
58 const char *const LLDB_NT_OWNER_NETBSDCORE = "NetBSD-CORE";
59 const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD";
60 const char *const LLDB_NT_OWNER_ANDROID = "Android";
61 const char *const LLDB_NT_OWNER_CORE = "CORE";
62 const char *const LLDB_NT_OWNER_LINUX = "LINUX";
64 // ELF note type definitions
65 const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
66 const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
68 const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
69 const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
71 const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
73 const elf_word LLDB_NT_NETBSD_IDENT_TAG = 1;
74 const elf_word LLDB_NT_NETBSD_IDENT_DESCSZ = 4;
75 const elf_word LLDB_NT_NETBSD_IDENT_NAMESZ = 7;
76 const elf_word LLDB_NT_NETBSD_PROCINFO = 1;
78 // GNU ABI note OS constants
79 const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
80 const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
81 const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
83 // LLDB_NT_OWNER_CORE and LLDB_NT_OWNER_LINUX note contants
87 #define NT_TASKSTRUCT 4
89 #define NT_SIGINFO 0x53494749
90 #define NT_FILE 0x46494c45
91 #define NT_PRXFPREG 0x46e62b7f
92 #define NT_PPC_VMX 0x100
93 #define NT_PPC_SPE 0x101
94 #define NT_PPC_VSX 0x102
95 #define NT_386_TLS 0x200
96 #define NT_386_IOPERM 0x201
97 #define NT_X86_XSTATE 0x202
98 #define NT_S390_HIGH_GPRS 0x300
99 #define NT_S390_TIMER 0x301
100 #define NT_S390_TODCMP 0x302
101 #define NT_S390_TODPREG 0x303
102 #define NT_S390_CTRS 0x304
103 #define NT_S390_PREFIX 0x305
104 #define NT_S390_LAST_BREAK 0x306
105 #define NT_S390_SYSTEM_CALL 0x307
106 #define NT_S390_TDB 0x308
107 #define NT_S390_VXRS_LOW 0x309
108 #define NT_S390_VXRS_HIGH 0x30a
109 #define NT_ARM_VFP 0x400
110 #define NT_ARM_TLS 0x401
111 #define NT_ARM_HW_BREAK 0x402
112 #define NT_ARM_HW_WATCH 0x403
113 #define NT_ARM_SYSTEM_CALL 0x404
114 #define NT_METAG_CBUF 0x500
115 #define NT_METAG_RPIPE 0x501
116 #define NT_METAG_TLS 0x502
118 //===----------------------------------------------------------------------===//
119 /// \class ELFRelocation
120 /// Generic wrapper for ELFRel and ELFRela.
122 /// This helper class allows us to parse both ELFRel and ELFRela relocation
123 /// entries in a generic manner.
124 class ELFRelocation {
126 /// Constructs an ELFRelocation entry with a personality as given by @p
129 /// \param type Either DT_REL or DT_RELA. Any other value is invalid.
130 ELFRelocation(unsigned type);
134 bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
136 static unsigned RelocType32(const ELFRelocation &rel);
138 static unsigned RelocType64(const ELFRelocation &rel);
140 static unsigned RelocSymbol32(const ELFRelocation &rel);
142 static unsigned RelocSymbol64(const ELFRelocation &rel);
144 static unsigned RelocOffset32(const ELFRelocation &rel);
146 static unsigned RelocOffset64(const ELFRelocation &rel);
148 static unsigned RelocAddend32(const ELFRelocation &rel);
150 static unsigned RelocAddend64(const ELFRelocation &rel);
153 typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion;
158 ELFRelocation::ELFRelocation(unsigned type) {
159 if (type == DT_REL || type == SHT_REL)
160 reloc = new ELFRel();
161 else if (type == DT_RELA || type == SHT_RELA)
162 reloc = new ELFRela();
164 assert(false && "unexpected relocation type");
165 reloc = static_cast<ELFRel *>(nullptr);
169 ELFRelocation::~ELFRelocation() {
170 if (reloc.is<ELFRel *>())
171 delete reloc.get<ELFRel *>();
173 delete reloc.get<ELFRela *>();
176 bool ELFRelocation::Parse(const lldb_private::DataExtractor &data,
177 lldb::offset_t *offset) {
178 if (reloc.is<ELFRel *>())
179 return reloc.get<ELFRel *>()->Parse(data, offset);
181 return reloc.get<ELFRela *>()->Parse(data, offset);
184 unsigned ELFRelocation::RelocType32(const ELFRelocation &rel) {
185 if (rel.reloc.is<ELFRel *>())
186 return ELFRel::RelocType32(*rel.reloc.get<ELFRel *>());
188 return ELFRela::RelocType32(*rel.reloc.get<ELFRela *>());
191 unsigned ELFRelocation::RelocType64(const ELFRelocation &rel) {
192 if (rel.reloc.is<ELFRel *>())
193 return ELFRel::RelocType64(*rel.reloc.get<ELFRel *>());
195 return ELFRela::RelocType64(*rel.reloc.get<ELFRela *>());
198 unsigned ELFRelocation::RelocSymbol32(const ELFRelocation &rel) {
199 if (rel.reloc.is<ELFRel *>())
200 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel *>());
202 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela *>());
205 unsigned ELFRelocation::RelocSymbol64(const ELFRelocation &rel) {
206 if (rel.reloc.is<ELFRel *>())
207 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel *>());
209 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela *>());
212 unsigned ELFRelocation::RelocOffset32(const ELFRelocation &rel) {
213 if (rel.reloc.is<ELFRel *>())
214 return rel.reloc.get<ELFRel *>()->r_offset;
216 return rel.reloc.get<ELFRela *>()->r_offset;
219 unsigned ELFRelocation::RelocOffset64(const ELFRelocation &rel) {
220 if (rel.reloc.is<ELFRel *>())
221 return rel.reloc.get<ELFRel *>()->r_offset;
223 return rel.reloc.get<ELFRela *>()->r_offset;
226 unsigned ELFRelocation::RelocAddend32(const ELFRelocation &rel) {
227 if (rel.reloc.is<ELFRel *>())
230 return rel.reloc.get<ELFRela *>()->r_addend;
233 unsigned ELFRelocation::RelocAddend64(const ELFRelocation &rel) {
234 if (rel.reloc.is<ELFRel *>())
237 return rel.reloc.get<ELFRela *>()->r_addend;
240 } // end anonymous namespace
242 static user_id_t SegmentID(size_t PHdrIndex) { return ~PHdrIndex; }
244 bool ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) {
246 if (data.GetU32(offset, &n_namesz, 3) == nullptr)
249 // The name field is required to be nul-terminated, and n_namesz includes the
250 // terminating nul in observed implementations (contrary to the ELF-64 spec).
251 // A special case is needed for cores generated by some older Linux versions,
252 // which write a note named "CORE" without a nul terminator and n_namesz = 4.
255 if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4)
257 if (strncmp(buf, "CORE", 4) == 0) {
264 const char *cstr = data.GetCStr(offset, llvm::alignTo(n_namesz, 4));
265 if (cstr == nullptr) {
266 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS));
268 log->Printf("Failed to parse note name lacking nul terminator");
276 static uint32_t mipsVariantFromElfFlags (const elf::ELFHeader &header) {
277 const uint32_t mips_arch = header.e_flags & llvm::ELF::EF_MIPS_ARCH;
278 uint32_t endian = header.e_ident[EI_DATA];
279 uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown;
280 uint32_t fileclass = header.e_ident[EI_CLASS];
282 // If there aren't any elf flags available (e.g core elf file) then return
284 // 32 or 64 bit arch (without any architecture revision) based on object file's class.
285 if (header.e_type == ET_CORE) {
287 case llvm::ELF::ELFCLASS32:
288 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
289 : ArchSpec::eMIPSSubType_mips32;
290 case llvm::ELF::ELFCLASS64:
291 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
292 : ArchSpec::eMIPSSubType_mips64;
299 case llvm::ELF::EF_MIPS_ARCH_1:
300 case llvm::ELF::EF_MIPS_ARCH_2:
301 case llvm::ELF::EF_MIPS_ARCH_32:
302 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
303 : ArchSpec::eMIPSSubType_mips32;
304 case llvm::ELF::EF_MIPS_ARCH_32R2:
305 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r2el
306 : ArchSpec::eMIPSSubType_mips32r2;
307 case llvm::ELF::EF_MIPS_ARCH_32R6:
308 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r6el
309 : ArchSpec::eMIPSSubType_mips32r6;
310 case llvm::ELF::EF_MIPS_ARCH_3:
311 case llvm::ELF::EF_MIPS_ARCH_4:
312 case llvm::ELF::EF_MIPS_ARCH_5:
313 case llvm::ELF::EF_MIPS_ARCH_64:
314 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
315 : ArchSpec::eMIPSSubType_mips64;
316 case llvm::ELF::EF_MIPS_ARCH_64R2:
317 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r2el
318 : ArchSpec::eMIPSSubType_mips64r2;
319 case llvm::ELF::EF_MIPS_ARCH_64R6:
320 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r6el
321 : ArchSpec::eMIPSSubType_mips64r6;
329 static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) {
330 if (header.e_machine == llvm::ELF::EM_MIPS)
331 return mipsVariantFromElfFlags(header);
333 return LLDB_INVALID_CPUTYPE;
336 // Arbitrary constant used as UUID prefix for core files.
337 const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C);
340 void ObjectFileELF::Initialize() {
341 PluginManager::RegisterPlugin(GetPluginNameStatic(),
342 GetPluginDescriptionStatic(), CreateInstance,
343 CreateMemoryInstance, GetModuleSpecifications);
346 void ObjectFileELF::Terminate() {
347 PluginManager::UnregisterPlugin(CreateInstance);
350 lldb_private::ConstString ObjectFileELF::GetPluginNameStatic() {
351 static ConstString g_name("elf");
355 const char *ObjectFileELF::GetPluginDescriptionStatic() {
356 return "ELF object file reader.";
359 ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp,
360 DataBufferSP &data_sp,
361 lldb::offset_t data_offset,
362 const lldb_private::FileSpec *file,
363 lldb::offset_t file_offset,
364 lldb::offset_t length) {
366 data_sp = MapFileData(*file, length, file_offset);
374 if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset))
377 const uint8_t *magic = data_sp->GetBytes() + data_offset;
378 if (!ELFHeader::MagicBytesMatch(magic))
381 // Update the data to contain the entire file if it doesn't already
382 if (data_sp->GetByteSize() < length) {
383 data_sp = MapFileData(*file, length, file_offset);
387 magic = data_sp->GetBytes();
390 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
391 if (address_size == 4 || address_size == 8) {
392 std::unique_ptr<ObjectFileELF> objfile_up(new ObjectFileELF(
393 module_sp, data_sp, data_offset, file, file_offset, length));
394 ArchSpec spec = objfile_up->GetArchitecture();
395 if (spec && objfile_up->SetModulesArchitecture(spec))
396 return objfile_up.release();
402 ObjectFile *ObjectFileELF::CreateMemoryInstance(
403 const lldb::ModuleSP &module_sp, DataBufferSP &data_sp,
404 const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) {
405 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT)) {
406 const uint8_t *magic = data_sp->GetBytes();
407 if (ELFHeader::MagicBytesMatch(magic)) {
408 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
409 if (address_size == 4 || address_size == 8) {
410 std::unique_ptr<ObjectFileELF> objfile_up(
411 new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
412 ArchSpec spec = objfile_up->GetArchitecture();
413 if (spec && objfile_up->SetModulesArchitecture(spec))
414 return objfile_up.release();
421 bool ObjectFileELF::MagicBytesMatch(DataBufferSP &data_sp,
422 lldb::addr_t data_offset,
423 lldb::addr_t data_length) {
425 data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) {
426 const uint8_t *magic = data_sp->GetBytes() + data_offset;
427 return ELFHeader::MagicBytesMatch(magic);
433 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
435 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
436 * code or tables extracted from it, as desired without restriction.
438 static uint32_t calc_crc32(uint32_t crc, const void *buf, size_t size) {
439 static const uint32_t g_crc32_tab[] = {
440 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
441 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
442 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
443 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
444 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
445 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
446 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
447 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
448 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
449 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
450 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
451 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
452 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
453 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
454 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
455 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
456 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
457 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
458 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
459 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
460 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
461 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
462 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
463 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
464 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
465 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
466 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
467 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
468 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
469 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
470 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
471 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
472 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
473 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
474 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
475 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
476 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
477 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
478 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
479 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
480 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
481 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
482 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
483 const uint8_t *p = (const uint8_t *)buf;
487 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
491 static uint32_t calc_gnu_debuglink_crc32(const void *buf, size_t size) {
492 return calc_crc32(0U, buf, size);
495 uint32_t ObjectFileELF::CalculateELFNotesSegmentsCRC32(
496 const ProgramHeaderColl &program_headers, DataExtractor &object_data) {
498 uint32_t core_notes_crc = 0;
500 for (const ELFProgramHeader &H : program_headers) {
501 if (H.p_type == llvm::ELF::PT_NOTE) {
502 const elf_off ph_offset = H.p_offset;
503 const size_t ph_size = H.p_filesz;
505 DataExtractor segment_data;
506 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size) {
507 // The ELF program header contained incorrect data, probably corefile
508 // is incomplete or corrupted.
512 core_notes_crc = calc_crc32(core_notes_crc, segment_data.GetDataStart(),
513 segment_data.GetByteSize());
517 return core_notes_crc;
520 static const char *OSABIAsCString(unsigned char osabi_byte) {
521 #define _MAKE_OSABI_CASE(x) \
524 switch (osabi_byte) {
525 _MAKE_OSABI_CASE(ELFOSABI_NONE);
526 _MAKE_OSABI_CASE(ELFOSABI_HPUX);
527 _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
528 _MAKE_OSABI_CASE(ELFOSABI_GNU);
529 _MAKE_OSABI_CASE(ELFOSABI_HURD);
530 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
531 _MAKE_OSABI_CASE(ELFOSABI_AIX);
532 _MAKE_OSABI_CASE(ELFOSABI_IRIX);
533 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
534 _MAKE_OSABI_CASE(ELFOSABI_TRU64);
535 _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
536 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
537 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
538 _MAKE_OSABI_CASE(ELFOSABI_NSK);
539 _MAKE_OSABI_CASE(ELFOSABI_AROS);
540 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
541 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
542 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
543 _MAKE_OSABI_CASE(ELFOSABI_ARM);
544 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
546 return "<unknown-osabi>";
548 #undef _MAKE_OSABI_CASE
552 // WARNING : This function is being deprecated
553 // It's functionality has moved to ArchSpec::SetArchitecture This function is
554 // only being kept to validate the move.
556 // TODO : Remove this function
557 static bool GetOsFromOSABI(unsigned char osabi_byte,
558 llvm::Triple::OSType &ostype) {
559 switch (osabi_byte) {
561 ostype = llvm::Triple::OSType::AIX;
563 case ELFOSABI_FREEBSD:
564 ostype = llvm::Triple::OSType::FreeBSD;
567 ostype = llvm::Triple::OSType::Linux;
569 case ELFOSABI_NETBSD:
570 ostype = llvm::Triple::OSType::NetBSD;
572 case ELFOSABI_OPENBSD:
573 ostype = llvm::Triple::OSType::OpenBSD;
575 case ELFOSABI_SOLARIS:
576 ostype = llvm::Triple::OSType::Solaris;
579 ostype = llvm::Triple::OSType::UnknownOS;
581 return ostype != llvm::Triple::OSType::UnknownOS;
584 size_t ObjectFileELF::GetModuleSpecifications(
585 const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp,
586 lldb::offset_t data_offset, lldb::offset_t file_offset,
587 lldb::offset_t length, lldb_private::ModuleSpecList &specs) {
588 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
590 const size_t initial_count = specs.GetSize();
592 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) {
594 data.SetData(data_sp);
595 elf::ELFHeader header;
596 lldb::offset_t header_offset = data_offset;
597 if (header.Parse(data, &header_offset)) {
599 ModuleSpec spec(file);
601 const uint32_t sub_type = subTypeFromElfHeader(header);
602 spec.GetArchitecture().SetArchitecture(
603 eArchTypeELF, header.e_machine, sub_type, header.e_ident[EI_OSABI]);
605 if (spec.GetArchitecture().IsValid()) {
606 llvm::Triple::OSType ostype;
607 llvm::Triple::VendorType vendor;
608 llvm::Triple::OSType spec_ostype =
609 spec.GetArchitecture().GetTriple().getOS();
612 log->Printf("ObjectFileELF::%s file '%s' module OSABI: %s",
613 __FUNCTION__, file.GetPath().c_str(),
614 OSABIAsCString(header.e_ident[EI_OSABI]));
616 // SetArchitecture should have set the vendor to unknown
617 vendor = spec.GetArchitecture().GetTriple().getVendor();
618 assert(vendor == llvm::Triple::UnknownVendor);
619 UNUSED_IF_ASSERT_DISABLED(vendor);
622 // Validate it is ok to remove GetOsFromOSABI
623 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
624 assert(spec_ostype == ostype);
625 if (spec_ostype != llvm::Triple::OSType::UnknownOS) {
627 log->Printf("ObjectFileELF::%s file '%s' set ELF module OS type "
628 "from ELF header OSABI.",
629 __FUNCTION__, file.GetPath().c_str());
632 data_sp = MapFileData(file, -1, file_offset);
634 data.SetData(data_sp);
635 // In case there is header extension in the section #0, the header we
636 // parsed above could have sentinel values for e_phnum, e_shnum, and
637 // e_shstrndx. In this case we need to reparse the header with a
638 // bigger data source to get the actual values.
639 if (header.HasHeaderExtension()) {
640 lldb::offset_t header_offset = data_offset;
641 header.Parse(data, &header_offset);
644 uint32_t gnu_debuglink_crc = 0;
645 std::string gnu_debuglink_file;
646 SectionHeaderColl section_headers;
647 lldb_private::UUID &uuid = spec.GetUUID();
649 GetSectionHeaderInfo(section_headers, data, header, uuid,
650 gnu_debuglink_file, gnu_debuglink_crc,
651 spec.GetArchitecture());
653 llvm::Triple &spec_triple = spec.GetArchitecture().GetTriple();
656 log->Printf("ObjectFileELF::%s file '%s' module set to triple: %s "
658 __FUNCTION__, file.GetPath().c_str(),
659 spec_triple.getTriple().c_str(),
660 spec.GetArchitecture().GetArchitectureName());
662 if (!uuid.IsValid()) {
663 uint32_t core_notes_crc = 0;
665 if (!gnu_debuglink_crc) {
666 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
667 lldb_private::Timer scoped_timer(
669 "Calculating module crc32 %s with size %" PRIu64 " KiB",
670 file.GetLastPathComponent().AsCString(),
671 (FileSystem::Instance().GetByteSize(file) - file_offset) /
674 // For core files - which usually don't happen to have a
675 // gnu_debuglink, and are pretty bulky - calculating whole
676 // contents crc32 would be too much of luxury. Thus we will need
677 // to fallback to something simpler.
678 if (header.e_type == llvm::ELF::ET_CORE) {
679 ProgramHeaderColl program_headers;
680 GetProgramHeaderInfo(program_headers, data, header);
683 CalculateELFNotesSegmentsCRC32(program_headers, data);
685 gnu_debuglink_crc = calc_gnu_debuglink_crc32(
686 data.GetDataStart(), data.GetByteSize());
689 using u32le = llvm::support::ulittle32_t;
690 if (gnu_debuglink_crc) {
691 // Use 4 bytes of crc from the .gnu_debuglink section.
692 u32le data(gnu_debuglink_crc);
693 uuid = UUID::fromData(&data, sizeof(data));
694 } else if (core_notes_crc) {
695 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make
696 // it look different form .gnu_debuglink crc followed by 4 bytes
697 // of note segments crc.
698 u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)};
699 uuid = UUID::fromData(data, sizeof(data));
709 return specs.GetSize() - initial_count;
712 // PluginInterface protocol
713 lldb_private::ConstString ObjectFileELF::GetPluginName() {
714 return GetPluginNameStatic();
717 uint32_t ObjectFileELF::GetPluginVersion() { return m_plugin_version; }
718 // ObjectFile protocol
720 ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
721 DataBufferSP &data_sp, lldb::offset_t data_offset,
722 const FileSpec *file, lldb::offset_t file_offset,
723 lldb::offset_t length)
724 : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
725 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
726 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
727 m_filespec_up(), m_entry_point_address(), m_arch_spec() {
730 ::memset(&m_header, 0, sizeof(m_header));
733 ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
734 DataBufferSP &header_data_sp,
735 const lldb::ProcessSP &process_sp,
737 : ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
738 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
739 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
740 m_filespec_up(), m_entry_point_address(), m_arch_spec() {
741 ::memset(&m_header, 0, sizeof(m_header));
744 ObjectFileELF::~ObjectFileELF() {}
746 bool ObjectFileELF::IsExecutable() const {
747 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
750 bool ObjectFileELF::SetLoadAddress(Target &target, lldb::addr_t value,
751 bool value_is_offset) {
752 ModuleSP module_sp = GetModule();
754 size_t num_loaded_sections = 0;
755 SectionList *section_list = GetSectionList();
757 if (!value_is_offset) {
758 addr_t base = GetBaseAddress().GetFileAddress();
759 if (base == LLDB_INVALID_ADDRESS)
764 const size_t num_sections = section_list->GetSize();
767 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
768 // Iterate through the object file sections to find all of the sections
769 // that have SHF_ALLOC in their flag bits.
770 SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
771 if (section_sp->Test(SHF_ALLOC) ||
772 section_sp->GetType() == eSectionTypeContainer) {
773 lldb::addr_t load_addr = section_sp->GetFileAddress();
774 // We don't want to update the load address of a section with type
775 // eSectionTypeAbsoluteAddress as they already have the absolute load
776 // address already specified
777 if (section_sp->GetType() != eSectionTypeAbsoluteAddress)
780 // On 32-bit systems the load address have to fit into 4 bytes. The
781 // rest of the bytes are the overflow from the addition.
782 if (GetAddressByteSize() == 4)
783 load_addr &= 0xFFFFFFFF;
785 if (target.GetSectionLoadList().SetSectionLoadAddress(section_sp,
787 ++num_loaded_sections;
790 return num_loaded_sections > 0;
796 ByteOrder ObjectFileELF::GetByteOrder() const {
797 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
798 return eByteOrderBig;
799 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
800 return eByteOrderLittle;
801 return eByteOrderInvalid;
804 uint32_t ObjectFileELF::GetAddressByteSize() const {
805 return m_data.GetAddressByteSize();
808 AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) {
809 Symtab *symtab = GetSymtab();
811 return AddressClass::eUnknown;
813 // The address class is determined based on the symtab. Ask it from the
814 // object file what contains the symtab information.
815 ObjectFile *symtab_objfile = symtab->GetObjectFile();
816 if (symtab_objfile != nullptr && symtab_objfile != this)
817 return symtab_objfile->GetAddressClass(file_addr);
819 auto res = ObjectFile::GetAddressClass(file_addr);
820 if (res != AddressClass::eCode)
823 auto ub = m_address_class_map.upper_bound(file_addr);
824 if (ub == m_address_class_map.begin()) {
825 // No entry in the address class map before the address. Return default
826 // address class for an address in a code section.
827 return AddressClass::eCode;
830 // Move iterator to the address class entry preceding address
836 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
837 return std::distance(m_section_headers.begin(), I);
840 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const {
841 return std::distance(m_section_headers.begin(), I);
844 bool ObjectFileELF::ParseHeader() {
845 lldb::offset_t offset = 0;
846 return m_header.Parse(m_data, &offset);
849 UUID ObjectFileELF::GetUUID() {
850 // Need to parse the section list to get the UUIDs, so make sure that's been
852 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
856 using u32le = llvm::support::ulittle32_t;
857 if (GetType() == ObjectFile::eTypeCoreFile) {
858 uint32_t core_notes_crc = 0;
860 if (!ParseProgramHeaders())
864 CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
866 if (core_notes_crc) {
867 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
868 // look different form .gnu_debuglink crc - followed by 4 bytes of note
870 u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)};
871 m_uuid = UUID::fromData(data, sizeof(data));
874 if (!m_gnu_debuglink_crc)
875 m_gnu_debuglink_crc = calc_gnu_debuglink_crc32(m_data.GetDataStart(),
876 m_data.GetByteSize());
877 if (m_gnu_debuglink_crc) {
878 // Use 4 bytes of crc from the .gnu_debuglink section.
879 u32le data(m_gnu_debuglink_crc);
880 m_uuid = UUID::fromData(&data, sizeof(data));
888 lldb_private::FileSpecList ObjectFileELF::GetDebugSymbolFilePaths() {
889 FileSpecList file_spec_list;
891 if (!m_gnu_debuglink_file.empty()) {
892 FileSpec file_spec(m_gnu_debuglink_file);
893 file_spec_list.Append(file_spec);
895 return file_spec_list;
898 uint32_t ObjectFileELF::GetDependentModules(FileSpecList &files) {
899 size_t num_modules = ParseDependentModules();
900 uint32_t num_specs = 0;
902 for (unsigned i = 0; i < num_modules; ++i) {
903 if (files.AppendIfUnique(m_filespec_up->GetFileSpecAtIndex(i)))
910 Address ObjectFileELF::GetImageInfoAddress(Target *target) {
911 if (!ParseDynamicSymbols())
914 SectionList *section_list = GetSectionList();
918 // Find the SHT_DYNAMIC (.dynamic) section.
919 SectionSP dynsym_section_sp(
920 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true));
921 if (!dynsym_section_sp)
923 assert(dynsym_section_sp->GetObjectFile() == this);
925 user_id_t dynsym_id = dynsym_section_sp->GetID();
926 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
930 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) {
931 ELFDynamic &symbol = m_dynamic_symbols[i];
933 if (symbol.d_tag == DT_DEBUG) {
934 // Compute the offset as the number of previous entries plus the size of
936 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
937 return Address(dynsym_section_sp, offset);
939 // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP
940 // exists in non-PIE.
941 else if ((symbol.d_tag == DT_MIPS_RLD_MAP ||
942 symbol.d_tag == DT_MIPS_RLD_MAP_REL) &&
944 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
945 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
946 if (dyn_base == LLDB_INVALID_ADDRESS)
950 if (symbol.d_tag == DT_MIPS_RLD_MAP) {
951 // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer.
953 if (target->ReadPointerFromMemory(dyn_base + offset, false, error,
957 if (symbol.d_tag == DT_MIPS_RLD_MAP_REL) {
958 // DT_MIPS_RLD_MAP_REL tag stores the offset to the debug pointer,
959 // relative to the address of the tag.
961 rel_offset = target->ReadUnsignedIntegerFromMemory(
962 dyn_base + offset, false, GetAddressByteSize(), UINT64_MAX, error);
963 if (error.Success() && rel_offset != UINT64_MAX) {
965 addr_t debug_ptr_address =
966 dyn_base + (offset - GetAddressByteSize()) + rel_offset;
967 addr.SetOffset(debug_ptr_address);
977 lldb_private::Address ObjectFileELF::GetEntryPointAddress() {
978 if (m_entry_point_address.IsValid())
979 return m_entry_point_address;
981 if (!ParseHeader() || !IsExecutable())
982 return m_entry_point_address;
984 SectionList *section_list = GetSectionList();
985 addr_t offset = m_header.e_entry;
988 m_entry_point_address.SetOffset(offset);
990 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
991 return m_entry_point_address;
994 Address ObjectFileELF::GetBaseAddress() {
995 for (const auto &EnumPHdr : llvm::enumerate(ProgramHeaders())) {
996 const ELFProgramHeader &H = EnumPHdr.value();
997 if (H.p_type != PT_LOAD)
1001 GetSectionList()->FindSectionByID(SegmentID(EnumPHdr.index())), 0);
1003 return LLDB_INVALID_ADDRESS;
1006 // ParseDependentModules
1007 size_t ObjectFileELF::ParseDependentModules() {
1009 return m_filespec_up->GetSize();
1011 m_filespec_up.reset(new FileSpecList());
1013 if (!ParseSectionHeaders())
1016 SectionList *section_list = GetSectionList();
1020 // Find the SHT_DYNAMIC section.
1022 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
1026 assert(dynsym->GetObjectFile() == this);
1028 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex(dynsym->GetID());
1031 // sh_link: section header index of string table used by entries in the
1033 Section *dynstr = section_list->FindSectionByID(header->sh_link).get();
1037 DataExtractor dynsym_data;
1038 DataExtractor dynstr_data;
1039 if (ReadSectionData(dynsym, dynsym_data) &&
1040 ReadSectionData(dynstr, dynstr_data)) {
1042 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1043 lldb::offset_t offset = 0;
1045 // The only type of entries we are concerned with are tagged DT_NEEDED,
1046 // yielding the name of a required library.
1047 while (offset < section_size) {
1048 if (!symbol.Parse(dynsym_data, &offset))
1051 if (symbol.d_tag != DT_NEEDED)
1054 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1055 const char *lib_name = dynstr_data.PeekCStr(str_index);
1056 FileSpec file_spec(lib_name);
1057 FileSystem::Instance().Resolve(file_spec);
1058 m_filespec_up->Append(file_spec);
1062 return m_filespec_up->GetSize();
1065 // GetProgramHeaderInfo
1066 size_t ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
1067 DataExtractor &object_data,
1068 const ELFHeader &header) {
1069 // We have already parsed the program headers
1070 if (!program_headers.empty())
1071 return program_headers.size();
1073 // If there are no program headers to read we are done.
1074 if (header.e_phnum == 0)
1077 program_headers.resize(header.e_phnum);
1078 if (program_headers.size() != header.e_phnum)
1081 const size_t ph_size = header.e_phnum * header.e_phentsize;
1082 const elf_off ph_offset = header.e_phoff;
1084 if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
1088 lldb::offset_t offset;
1089 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx) {
1090 if (!program_headers[idx].Parse(data, &offset))
1094 if (idx < program_headers.size())
1095 program_headers.resize(idx);
1097 return program_headers.size();
1100 // ParseProgramHeaders
1101 bool ObjectFileELF::ParseProgramHeaders() {
1102 return GetProgramHeaderInfo(m_program_headers, m_data, m_header) != 0;
1105 lldb_private::Status
1106 ObjectFileELF::RefineModuleDetailsFromNote(lldb_private::DataExtractor &data,
1107 lldb_private::ArchSpec &arch_spec,
1108 lldb_private::UUID &uuid) {
1109 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
1112 lldb::offset_t offset = 0;
1115 // Parse the note header. If this fails, bail out.
1116 const lldb::offset_t note_offset = offset;
1117 ELFNote note = ELFNote();
1118 if (!note.Parse(data, &offset)) {
1124 log->Printf("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32,
1125 __FUNCTION__, note.n_name.c_str(), note.n_type);
1127 // Process FreeBSD ELF notes.
1128 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1129 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1130 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE)) {
1131 // Pull out the min version info.
1132 uint32_t version_info;
1133 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1134 error.SetErrorString("failed to read FreeBSD ABI note payload");
1138 // Convert the version info into a major/minor number.
1139 const uint32_t version_major = version_info / 100000;
1140 const uint32_t version_minor = (version_info / 1000) % 100;
1143 snprintf(os_name, sizeof(os_name), "freebsd%" PRIu32 ".%" PRIu32,
1144 version_major, version_minor);
1146 // Set the elf OS version to FreeBSD. Also clear the vendor.
1147 arch_spec.GetTriple().setOSName(os_name);
1148 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1151 log->Printf("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32
1153 __FUNCTION__, version_major, version_minor,
1154 static_cast<uint32_t>(version_info % 1000));
1156 // Process GNU ELF notes.
1157 else if (note.n_name == LLDB_NT_OWNER_GNU) {
1158 switch (note.n_type) {
1159 case LLDB_NT_GNU_ABI_TAG:
1160 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE) {
1161 // Pull out the min OS version supporting the ABI.
1162 uint32_t version_info[4];
1163 if (data.GetU32(&offset, &version_info[0], note.n_descsz / 4) ==
1165 error.SetErrorString("failed to read GNU ABI note payload");
1169 // Set the OS per the OS field.
1170 switch (version_info[0]) {
1171 case LLDB_NT_GNU_ABI_OS_LINUX:
1172 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1173 arch_spec.GetTriple().setVendor(
1174 llvm::Triple::VendorType::UnknownVendor);
1177 "ObjectFileELF::%s detected Linux, min version %" PRIu32
1178 ".%" PRIu32 ".%" PRIu32,
1179 __FUNCTION__, version_info[1], version_info[2],
1181 // FIXME we have the minimal version number, we could be propagating
1182 // that. version_info[1] = OS Major, version_info[2] = OS Minor,
1183 // version_info[3] = Revision.
1185 case LLDB_NT_GNU_ABI_OS_HURD:
1186 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1187 arch_spec.GetTriple().setVendor(
1188 llvm::Triple::VendorType::UnknownVendor);
1190 log->Printf("ObjectFileELF::%s detected Hurd (unsupported), min "
1191 "version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1192 __FUNCTION__, version_info[1], version_info[2],
1195 case LLDB_NT_GNU_ABI_OS_SOLARIS:
1196 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Solaris);
1197 arch_spec.GetTriple().setVendor(
1198 llvm::Triple::VendorType::UnknownVendor);
1201 "ObjectFileELF::%s detected Solaris, min version %" PRIu32
1202 ".%" PRIu32 ".%" PRIu32,
1203 __FUNCTION__, version_info[1], version_info[2],
1209 "ObjectFileELF::%s unrecognized OS in note, id %" PRIu32
1210 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1211 __FUNCTION__, version_info[0], version_info[1],
1212 version_info[2], version_info[3]);
1218 case LLDB_NT_GNU_BUILD_ID_TAG:
1219 // Only bother processing this if we don't already have the uuid set.
1220 if (!uuid.IsValid()) {
1221 // 16 bytes is UUID|MD5, 20 bytes is SHA1. Other linkers may produce a
1222 // build-id of a different length. Accept it as long as it's at least
1223 // 4 bytes as it will be better than our own crc32.
1224 if (note.n_descsz >= 4) {
1225 if (const uint8_t *buf = data.PeekData(offset, note.n_descsz)) {
1226 // Save the build id as the UUID for the module.
1227 uuid = UUID::fromData(buf, note.n_descsz);
1229 error.SetErrorString("failed to read GNU_BUILD_ID note payload");
1236 if (arch_spec.IsMIPS() &&
1237 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
1238 // The note.n_name == LLDB_NT_OWNER_GNU is valid for Linux platform
1239 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1241 // Process NetBSD ELF executables and shared libraries
1242 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
1243 (note.n_type == LLDB_NT_NETBSD_IDENT_TAG) &&
1244 (note.n_descsz == LLDB_NT_NETBSD_IDENT_DESCSZ) &&
1245 (note.n_namesz == LLDB_NT_NETBSD_IDENT_NAMESZ)) {
1246 // Pull out the version info.
1247 uint32_t version_info;
1248 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1249 error.SetErrorString("failed to read NetBSD ABI note payload");
1252 // Convert the version info into a major/minor/patch number.
1253 // #define __NetBSD_Version__ MMmmrrpp00
1255 // M = major version
1256 // m = minor version; a minor number of 99 indicates current.
1257 // r = 0 (since NetBSD 3.0 not used)
1259 const uint32_t version_major = version_info / 100000000;
1260 const uint32_t version_minor = (version_info % 100000000) / 1000000;
1261 const uint32_t version_patch = (version_info % 10000) / 100;
1262 // Set the elf OS version to NetBSD. Also clear the vendor.
1263 arch_spec.GetTriple().setOSName(
1264 llvm::formatv("netbsd{0}.{1}.{2}", version_major, version_minor,
1265 version_patch).str());
1266 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1268 // Process NetBSD ELF core(5) notes
1269 else if ((note.n_name == LLDB_NT_OWNER_NETBSDCORE) &&
1270 (note.n_type == LLDB_NT_NETBSD_PROCINFO)) {
1271 // Set the elf OS version to NetBSD. Also clear the vendor.
1272 arch_spec.GetTriple().setOS(llvm::Triple::OSType::NetBSD);
1273 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1275 // Process OpenBSD ELF notes.
1276 else if (note.n_name == LLDB_NT_OWNER_OPENBSD) {
1277 // Set the elf OS version to OpenBSD. Also clear the vendor.
1278 arch_spec.GetTriple().setOS(llvm::Triple::OSType::OpenBSD);
1279 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1280 } else if (note.n_name == LLDB_NT_OWNER_ANDROID) {
1281 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1282 arch_spec.GetTriple().setEnvironment(
1283 llvm::Triple::EnvironmentType::Android);
1284 } else if (note.n_name == LLDB_NT_OWNER_LINUX) {
1285 // This is sometimes found in core files and usually contains extended
1287 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1288 } else if (note.n_name == LLDB_NT_OWNER_CORE) {
1289 // Parse the NT_FILE to look for stuff in paths to shared libraries As
1290 // the contents look like this in a 64 bit ELF core file: count =
1291 // 0x000000000000000a (10) page_size = 0x0000000000001000 (4096) Index
1292 // start end file_ofs path =====
1293 // 0x0000000000401000 0x0000000000000000 /tmp/a.out [ 1]
1294 // 0x0000000000600000 0x0000000000601000 0x0000000000000000 /tmp/a.out [
1295 // 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001 /tmp/a.out
1296 // [ 3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000
1297 // /lib/x86_64-linux-gnu/libc-2.19.so [ 4] 0x00007fa79cba8000
1298 // 0x00007fa79cda7000 0x00000000000001bb /lib/x86_64-linux-
1299 // gnu/libc-2.19.so [ 5] 0x00007fa79cda7000 0x00007fa79cdab000
1300 // 0x00000000000001ba /lib/x86_64-linux-gnu/libc-2.19.so [ 6]
1301 // 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be /lib/x86_64
1302 // -linux-gnu/libc-2.19.so [ 7] 0x00007fa79cdb2000 0x00007fa79cdd5000
1303 // 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.19.so [ 8]
1304 // 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022 /lib/x86_64
1305 // -linux-gnu/ld-2.19.so [ 9] 0x00007fa79cfd5000 0x00007fa79cfd6000
1306 // 0x0000000000000023 /lib/x86_64-linux-gnu/ld-2.19.so In the 32 bit ELFs
1307 // the count, page_size, start, end, file_ofs are uint32_t For reference:
1308 // see readelf source code (in binutils).
1309 if (note.n_type == NT_FILE) {
1310 uint64_t count = data.GetAddress(&offset);
1312 data.GetAddress(&offset); // Skip page size
1313 offset += count * 3 *
1314 data.GetAddressByteSize(); // Skip all start/end/file_ofs
1315 for (size_t i = 0; i < count; ++i) {
1316 cstr = data.GetCStr(&offset);
1317 if (cstr == nullptr) {
1318 error.SetErrorStringWithFormat("ObjectFileELF::%s trying to read "
1319 "at an offset after the end "
1320 "(GetCStr returned nullptr)",
1324 llvm::StringRef path(cstr);
1325 if (path.contains("/lib/x86_64-linux-gnu") || path.contains("/lib/i386-linux-gnu")) {
1326 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1330 if (arch_spec.IsMIPS() &&
1331 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
1332 // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing for some
1333 // cases (e.g. compile with -nostdlib) Hence set OS to Linux
1334 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1338 // Calculate the offset of the next note just in case "offset" has been
1339 // used to poke at the contents of the note data
1340 offset = note_offset + note.GetByteSize();
1346 void ObjectFileELF::ParseARMAttributes(DataExtractor &data, uint64_t length,
1347 ArchSpec &arch_spec) {
1348 lldb::offset_t Offset = 0;
1350 uint8_t FormatVersion = data.GetU8(&Offset);
1351 if (FormatVersion != llvm::ARMBuildAttrs::Format_Version)
1354 Offset = Offset + sizeof(uint32_t); // Section Length
1355 llvm::StringRef VendorName = data.GetCStr(&Offset);
1357 if (VendorName != "aeabi")
1360 if (arch_spec.GetTriple().getEnvironment() ==
1361 llvm::Triple::UnknownEnvironment)
1362 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
1364 while (Offset < length) {
1365 uint8_t Tag = data.GetU8(&Offset);
1366 uint32_t Size = data.GetU32(&Offset);
1368 if (Tag != llvm::ARMBuildAttrs::File || Size == 0)
1371 while (Offset < length) {
1372 uint64_t Tag = data.GetULEB128(&Offset);
1376 data.GetULEB128(&Offset);
1377 else if (Tag % 2 == 0)
1378 data.GetULEB128(&Offset);
1380 data.GetCStr(&Offset);
1384 case llvm::ARMBuildAttrs::CPU_raw_name:
1385 case llvm::ARMBuildAttrs::CPU_name:
1386 data.GetCStr(&Offset);
1390 case llvm::ARMBuildAttrs::ABI_VFP_args: {
1391 uint64_t VFPArgs = data.GetULEB128(&Offset);
1393 if (VFPArgs == llvm::ARMBuildAttrs::BaseAAPCS) {
1394 if (arch_spec.GetTriple().getEnvironment() ==
1395 llvm::Triple::UnknownEnvironment ||
1396 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABIHF)
1397 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
1399 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1400 } else if (VFPArgs == llvm::ARMBuildAttrs::HardFPAAPCS) {
1401 if (arch_spec.GetTriple().getEnvironment() ==
1402 llvm::Triple::UnknownEnvironment ||
1403 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABI)
1404 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABIHF);
1406 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
1416 // GetSectionHeaderInfo
1417 size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_headers,
1418 DataExtractor &object_data,
1419 const elf::ELFHeader &header,
1420 lldb_private::UUID &uuid,
1421 std::string &gnu_debuglink_file,
1422 uint32_t &gnu_debuglink_crc,
1423 ArchSpec &arch_spec) {
1424 // Don't reparse the section headers if we already did that.
1425 if (!section_headers.empty())
1426 return section_headers.size();
1428 // Only initialize the arch_spec to okay defaults if they're not already set.
1429 // We'll refine this with note data as we parse the notes.
1430 if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) {
1431 llvm::Triple::OSType ostype;
1432 llvm::Triple::OSType spec_ostype;
1433 const uint32_t sub_type = subTypeFromElfHeader(header);
1434 arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type,
1435 header.e_ident[EI_OSABI]);
1437 // Validate if it is ok to remove GetOsFromOSABI. Note, that now the OS is
1438 // determined based on EI_OSABI flag and the info extracted from ELF notes
1439 // (see RefineModuleDetailsFromNote). However in some cases that still
1440 // might be not enough: for example a shared library might not have any
1441 // notes at all and have EI_OSABI flag set to System V, as result the OS
1442 // will be set to UnknownOS.
1443 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
1444 spec_ostype = arch_spec.GetTriple().getOS();
1445 assert(spec_ostype == ostype);
1446 UNUSED_IF_ASSERT_DISABLED(spec_ostype);
1449 if (arch_spec.GetMachine() == llvm::Triple::mips ||
1450 arch_spec.GetMachine() == llvm::Triple::mipsel ||
1451 arch_spec.GetMachine() == llvm::Triple::mips64 ||
1452 arch_spec.GetMachine() == llvm::Triple::mips64el) {
1453 switch (header.e_flags & llvm::ELF::EF_MIPS_ARCH_ASE) {
1454 case llvm::ELF::EF_MIPS_MICROMIPS:
1455 arch_spec.SetFlags(ArchSpec::eMIPSAse_micromips);
1457 case llvm::ELF::EF_MIPS_ARCH_ASE_M16:
1458 arch_spec.SetFlags(ArchSpec::eMIPSAse_mips16);
1460 case llvm::ELF::EF_MIPS_ARCH_ASE_MDMX:
1461 arch_spec.SetFlags(ArchSpec::eMIPSAse_mdmx);
1468 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1469 arch_spec.GetMachine() == llvm::Triple::thumb) {
1470 if (header.e_flags & llvm::ELF::EF_ARM_SOFT_FLOAT)
1471 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1472 else if (header.e_flags & llvm::ELF::EF_ARM_VFP_FLOAT)
1473 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
1476 // If there are no section headers we are done.
1477 if (header.e_shnum == 0)
1480 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
1482 section_headers.resize(header.e_shnum);
1483 if (section_headers.size() != header.e_shnum)
1486 const size_t sh_size = header.e_shnum * header.e_shentsize;
1487 const elf_off sh_offset = header.e_shoff;
1488 DataExtractor sh_data;
1489 if (sh_data.SetData(object_data, sh_offset, sh_size) != sh_size)
1493 lldb::offset_t offset;
1494 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) {
1495 if (!section_headers[idx].Parse(sh_data, &offset))
1498 if (idx < section_headers.size())
1499 section_headers.resize(idx);
1501 const unsigned strtab_idx = header.e_shstrndx;
1502 if (strtab_idx && strtab_idx < section_headers.size()) {
1503 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1504 const size_t byte_size = sheader.sh_size;
1505 const Elf64_Off offset = sheader.sh_offset;
1506 lldb_private::DataExtractor shstr_data;
1508 if (shstr_data.SetData(object_data, offset, byte_size) == byte_size) {
1509 for (SectionHeaderCollIter I = section_headers.begin();
1510 I != section_headers.end(); ++I) {
1511 static ConstString g_sect_name_gnu_debuglink(".gnu_debuglink");
1512 const ELFSectionHeaderInfo &sheader = *I;
1513 const uint64_t section_size =
1514 sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size;
1515 ConstString name(shstr_data.PeekCStr(I->sh_name));
1517 I->section_name = name;
1519 if (arch_spec.IsMIPS()) {
1520 uint32_t arch_flags = arch_spec.GetFlags();
1522 if (sheader.sh_type == SHT_MIPS_ABIFLAGS) {
1524 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1525 section_size) == section_size)) {
1526 // MIPS ASE Mask is at offset 12 in MIPS.abiflags section
1527 lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0
1528 arch_flags |= data.GetU32(&offset);
1530 // The floating point ABI is at offset 7
1532 switch (data.GetU8(&offset)) {
1533 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY:
1534 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY;
1536 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE:
1537 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE;
1539 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE:
1540 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE;
1542 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT:
1543 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT;
1545 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64:
1546 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64;
1548 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX:
1549 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX;
1551 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64:
1552 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64;
1554 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A:
1555 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A;
1560 // Settings appropriate ArchSpec ABI Flags
1561 switch (header.e_flags & llvm::ELF::EF_MIPS_ABI) {
1562 case llvm::ELF::EF_MIPS_ABI_O32:
1563 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32;
1565 case EF_MIPS_ABI_O64:
1566 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64;
1568 case EF_MIPS_ABI_EABI32:
1569 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32;
1571 case EF_MIPS_ABI_EABI64:
1572 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64;
1575 // ABI Mask doesn't cover N32 and N64 ABI.
1576 if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64)
1577 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64;
1578 else if (header.e_flags & llvm::ELF::EF_MIPS_ABI2)
1579 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32;
1582 arch_spec.SetFlags(arch_flags);
1585 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1586 arch_spec.GetMachine() == llvm::Triple::thumb) {
1589 if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 &&
1590 data.SetData(object_data, sheader.sh_offset, section_size) == section_size)
1591 ParseARMAttributes(data, section_size, arch_spec);
1594 if (name == g_sect_name_gnu_debuglink) {
1596 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1597 section_size) == section_size)) {
1598 lldb::offset_t gnu_debuglink_offset = 0;
1599 gnu_debuglink_file = data.GetCStr(&gnu_debuglink_offset);
1600 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4);
1601 data.GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1605 // Process ELF note section entries.
1606 bool is_note_header = (sheader.sh_type == SHT_NOTE);
1608 // The section header ".note.android.ident" is stored as a
1609 // PROGBITS type header but it is actually a note header.
1610 static ConstString g_sect_name_android_ident(".note.android.ident");
1611 if (!is_note_header && name == g_sect_name_android_ident)
1612 is_note_header = true;
1614 if (is_note_header) {
1615 // Allow notes to refine module info.
1617 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1618 section_size) == section_size)) {
1619 Status error = RefineModuleDetailsFromNote(data, arch_spec, uuid);
1622 log->Printf("ObjectFileELF::%s ELF note processing failed: %s",
1623 __FUNCTION__, error.AsCString());
1629 // Make any unknown triple components to be unspecified unknowns.
1630 if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor)
1631 arch_spec.GetTriple().setVendorName(llvm::StringRef());
1632 if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS)
1633 arch_spec.GetTriple().setOSName(llvm::StringRef());
1635 return section_headers.size();
1639 section_headers.clear();
1644 ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const {
1645 size_t pos = symbol_name.find('@');
1646 return symbol_name.substr(0, pos);
1649 // ParseSectionHeaders
1650 size_t ObjectFileELF::ParseSectionHeaders() {
1651 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid,
1652 m_gnu_debuglink_file, m_gnu_debuglink_crc,
1656 const ObjectFileELF::ELFSectionHeaderInfo *
1657 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) {
1658 if (!ParseSectionHeaders())
1661 if (id < m_section_headers.size())
1662 return &m_section_headers[id];
1667 lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) {
1668 if (!name || !name[0] || !ParseSectionHeaders())
1670 for (size_t i = 1; i < m_section_headers.size(); ++i)
1671 if (m_section_headers[i].section_name == ConstString(name))
1676 static SectionType GetSectionTypeFromName(llvm::StringRef Name) {
1677 if (Name.consume_front(".debug_") || Name.consume_front(".zdebug_")) {
1678 return llvm::StringSwitch<SectionType>(Name)
1679 .Case("abbrev", eSectionTypeDWARFDebugAbbrev)
1680 .Case("abbrev.dwo", eSectionTypeDWARFDebugAbbrevDwo)
1681 .Case("addr", eSectionTypeDWARFDebugAddr)
1682 .Case("aranges", eSectionTypeDWARFDebugAranges)
1683 .Case("cu_index", eSectionTypeDWARFDebugCuIndex)
1684 .Case("frame", eSectionTypeDWARFDebugFrame)
1685 .Case("info", eSectionTypeDWARFDebugInfo)
1686 .Case("info.dwo", eSectionTypeDWARFDebugInfoDwo)
1687 .Cases("line", "line.dwo", eSectionTypeDWARFDebugLine)
1688 .Cases("line_str", "line_str.dwo", eSectionTypeDWARFDebugLineStr)
1689 .Cases("loc", "loc.dwo", eSectionTypeDWARFDebugLoc)
1690 .Cases("loclists", "loclists.dwo", eSectionTypeDWARFDebugLocLists)
1691 .Case("macinfo", eSectionTypeDWARFDebugMacInfo)
1692 .Cases("macro", "macro.dwo", eSectionTypeDWARFDebugMacro)
1693 .Case("names", eSectionTypeDWARFDebugNames)
1694 .Case("pubnames", eSectionTypeDWARFDebugPubNames)
1695 .Case("pubtypes", eSectionTypeDWARFDebugPubTypes)
1696 .Case("ranges", eSectionTypeDWARFDebugRanges)
1697 .Case("rnglists", eSectionTypeDWARFDebugRngLists)
1698 .Case("str", eSectionTypeDWARFDebugStr)
1699 .Case("str.dwo", eSectionTypeDWARFDebugStrDwo)
1700 .Case("str_offsets", eSectionTypeDWARFDebugStrOffsets)
1701 .Case("str_offsets.dwo", eSectionTypeDWARFDebugStrOffsetsDwo)
1702 .Case("types", eSectionTypeDWARFDebugTypes)
1703 .Case("types.dwo", eSectionTypeDWARFDebugTypesDwo)
1704 .Default(eSectionTypeOther);
1706 return llvm::StringSwitch<SectionType>(Name)
1707 .Case(".ARM.exidx", eSectionTypeARMexidx)
1708 .Case(".ARM.extab", eSectionTypeARMextab)
1709 .Cases(".bss", ".tbss", eSectionTypeZeroFill)
1710 .Cases(".data", ".tdata", eSectionTypeData)
1711 .Case(".eh_frame", eSectionTypeEHFrame)
1712 .Case(".gnu_debugaltlink", eSectionTypeDWARFGNUDebugAltLink)
1713 .Case(".gosymtab", eSectionTypeGoSymtab)
1714 .Case(".text", eSectionTypeCode)
1715 .Default(eSectionTypeOther);
1718 SectionType ObjectFileELF::GetSectionType(const ELFSectionHeaderInfo &H) const {
1719 switch (H.sh_type) {
1721 if (H.sh_flags & SHF_EXECINSTR)
1722 return eSectionTypeCode;
1725 return eSectionTypeELFSymbolTable;
1727 return eSectionTypeELFDynamicSymbols;
1730 return eSectionTypeELFRelocationEntries;
1732 return eSectionTypeELFDynamicLinkInfo;
1734 return GetSectionTypeFromName(H.section_name.GetStringRef());
1737 static uint32_t GetTargetByteSize(SectionType Type, const ArchSpec &arch) {
1739 case eSectionTypeData:
1740 case eSectionTypeZeroFill:
1741 return arch.GetDataByteSize();
1742 case eSectionTypeCode:
1743 return arch.GetCodeByteSize();
1749 static Permissions GetPermissions(const ELFSectionHeader &H) {
1750 Permissions Perm = Permissions(0);
1751 if (H.sh_flags & SHF_ALLOC)
1752 Perm |= ePermissionsReadable;
1753 if (H.sh_flags & SHF_WRITE)
1754 Perm |= ePermissionsWritable;
1755 if (H.sh_flags & SHF_EXECINSTR)
1756 Perm |= ePermissionsExecutable;
1760 static Permissions GetPermissions(const ELFProgramHeader &H) {
1761 Permissions Perm = Permissions(0);
1762 if (H.p_flags & PF_R)
1763 Perm |= ePermissionsReadable;
1764 if (H.p_flags & PF_W)
1765 Perm |= ePermissionsWritable;
1766 if (H.p_flags & PF_X)
1767 Perm |= ePermissionsExecutable;
1773 using VMRange = lldb_private::Range<addr_t, addr_t>;
1775 struct SectionAddressInfo {
1780 // (Unlinked) ELF object files usually have 0 for every section address, meaning
1781 // we need to compute synthetic addresses in order for "file addresses" from
1782 // different sections to not overlap. This class handles that logic.
1783 class VMAddressProvider {
1784 using VMMap = llvm::IntervalMap<addr_t, SectionSP, 4,
1785 llvm::IntervalMapHalfOpenInfo<addr_t>>;
1787 ObjectFile::Type ObjectType;
1788 addr_t NextVMAddress = 0;
1789 VMMap::Allocator Alloc;
1790 VMMap Segments = VMMap(Alloc);
1791 VMMap Sections = VMMap(Alloc);
1792 lldb_private::Log *Log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES);
1794 VMRange GetVMRange(const ELFSectionHeader &H) {
1795 addr_t Address = H.sh_addr;
1796 addr_t Size = H.sh_flags & SHF_ALLOC ? H.sh_size : 0;
1797 if (ObjectType == ObjectFile::Type::eTypeObjectFile && Segments.empty() && (H.sh_flags & SHF_ALLOC)) {
1799 llvm::alignTo(NextVMAddress, std::max<addr_t>(H.sh_addralign, 1));
1800 Address = NextVMAddress;
1801 NextVMAddress += Size;
1803 return VMRange(Address, Size);
1807 VMAddressProvider(ObjectFile::Type Type) : ObjectType(Type) {}
1809 llvm::Optional<VMRange> GetAddressInfo(const ELFProgramHeader &H) {
1810 if (H.p_memsz == 0) {
1812 "Ignoring zero-sized PT_LOAD segment. Corrupt object file?");
1816 if (Segments.overlaps(H.p_vaddr, H.p_vaddr + H.p_memsz)) {
1818 "Ignoring overlapping PT_LOAD segment. Corrupt object file?");
1821 return VMRange(H.p_vaddr, H.p_memsz);
1824 llvm::Optional<SectionAddressInfo> GetAddressInfo(const ELFSectionHeader &H) {
1825 VMRange Range = GetVMRange(H);
1827 auto It = Segments.find(Range.GetRangeBase());
1828 if ((H.sh_flags & SHF_ALLOC) && It.valid()) {
1830 if (It.start() <= Range.GetRangeBase()) {
1831 MaxSize = It.stop() - Range.GetRangeBase();
1834 MaxSize = It.start() - Range.GetRangeBase();
1835 if (Range.GetByteSize() > MaxSize) {
1836 LLDB_LOG(Log, "Shortening section crossing segment boundaries. "
1837 "Corrupt object file?");
1838 Range.SetByteSize(MaxSize);
1841 if (Range.GetByteSize() > 0 &&
1842 Sections.overlaps(Range.GetRangeBase(), Range.GetRangeEnd())) {
1843 LLDB_LOG(Log, "Ignoring overlapping section. Corrupt object file?");
1847 Range.Slide(-Segment->GetFileAddress());
1848 return SectionAddressInfo{Segment, Range};
1851 void AddSegment(const VMRange &Range, SectionSP Seg) {
1852 Segments.insert(Range.GetRangeBase(), Range.GetRangeEnd(), std::move(Seg));
1855 void AddSection(SectionAddressInfo Info, SectionSP Sect) {
1856 if (Info.Range.GetByteSize() == 0)
1859 Info.Range.Slide(Info.Segment->GetFileAddress());
1860 Sections.insert(Info.Range.GetRangeBase(), Info.Range.GetRangeEnd(),
1866 void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
1870 m_sections_up = llvm::make_unique<SectionList>();
1871 VMAddressProvider address_provider(GetType());
1874 for (const auto &EnumPHdr : llvm::enumerate(ProgramHeaders())) {
1875 const ELFProgramHeader &PHdr = EnumPHdr.value();
1876 if (PHdr.p_type != PT_LOAD)
1879 auto InfoOr = address_provider.GetAddressInfo(PHdr);
1883 ConstString Name(("PT_LOAD[" + llvm::Twine(LoadID++) + "]").str());
1884 uint32_t Log2Align = llvm::Log2_64(std::max<elf_xword>(PHdr.p_align, 1));
1885 SectionSP Segment = std::make_shared<Section>(
1886 GetModule(), this, SegmentID(EnumPHdr.index()), Name,
1887 eSectionTypeContainer, InfoOr->GetRangeBase(), InfoOr->GetByteSize(),
1888 PHdr.p_offset, PHdr.p_filesz, Log2Align, /*flags*/ 0);
1889 Segment->SetPermissions(GetPermissions(PHdr));
1890 m_sections_up->AddSection(Segment);
1892 address_provider.AddSegment(*InfoOr, std::move(Segment));
1895 ParseSectionHeaders();
1896 if (m_section_headers.empty())
1899 for (SectionHeaderCollIter I = std::next(m_section_headers.begin());
1900 I != m_section_headers.end(); ++I) {
1901 const ELFSectionHeaderInfo &header = *I;
1903 ConstString &name = I->section_name;
1904 const uint64_t file_size =
1905 header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1907 auto InfoOr = address_provider.GetAddressInfo(header);
1911 SectionType sect_type = GetSectionType(header);
1913 const uint32_t target_bytes_size =
1914 GetTargetByteSize(sect_type, m_arch_spec);
1916 elf::elf_xword log2align =
1917 (header.sh_addralign == 0) ? 0 : llvm::Log2_64(header.sh_addralign);
1919 SectionSP section_sp(new Section(
1920 InfoOr->Segment, GetModule(), // Module to which this section belongs.
1921 this, // ObjectFile to which this section belongs and should
1922 // read section data from.
1923 SectionIndex(I), // Section ID.
1924 name, // Section name.
1925 sect_type, // Section type.
1926 InfoOr->Range.GetRangeBase(), // VM address.
1927 InfoOr->Range.GetByteSize(), // VM size in bytes of this section.
1928 header.sh_offset, // Offset of this section in the file.
1929 file_size, // Size of the section as found in the file.
1930 log2align, // Alignment of the section
1931 header.sh_flags, // Flags for this section.
1932 target_bytes_size)); // Number of host bytes per target byte
1934 section_sp->SetPermissions(GetPermissions(header));
1935 section_sp->SetIsThreadSpecific(header.sh_flags & SHF_TLS);
1936 (InfoOr->Segment ? InfoOr->Segment->GetChildren() : *m_sections_up)
1937 .AddSection(section_sp);
1938 address_provider.AddSection(std::move(*InfoOr), std::move(section_sp));
1941 // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the
1942 // unified section list.
1943 if (GetType() != eTypeDebugInfo)
1944 unified_section_list = *m_sections_up;
1947 // Find the arm/aarch64 mapping symbol character in the given symbol name.
1948 // Mapping symbols have the form of "$<char>[.<any>]*". Additionally we
1949 // recognize cases when the mapping symbol prefixed by an arbitrary string
1950 // because if a symbol prefix added to each symbol in the object file with
1951 // objcopy then the mapping symbols are also prefixed.
1952 static char FindArmAarch64MappingSymbol(const char *symbol_name) {
1956 const char *dollar_pos = ::strchr(symbol_name, '$');
1957 if (!dollar_pos || dollar_pos[1] == '\0')
1960 if (dollar_pos[2] == '\0' || dollar_pos[2] == '.')
1961 return dollar_pos[1];
1965 #define STO_MIPS_ISA (3 << 6)
1966 #define STO_MICROMIPS (2 << 6)
1967 #define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS)
1970 unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
1971 SectionList *section_list,
1972 const size_t num_symbols,
1973 const DataExtractor &symtab_data,
1974 const DataExtractor &strtab_data) {
1976 lldb::offset_t offset = 0;
1978 static ConstString text_section_name(".text");
1979 static ConstString init_section_name(".init");
1980 static ConstString fini_section_name(".fini");
1981 static ConstString ctors_section_name(".ctors");
1982 static ConstString dtors_section_name(".dtors");
1984 static ConstString data_section_name(".data");
1985 static ConstString rodata_section_name(".rodata");
1986 static ConstString rodata1_section_name(".rodata1");
1987 static ConstString data2_section_name(".data1");
1988 static ConstString bss_section_name(".bss");
1989 static ConstString opd_section_name(".opd"); // For ppc64
1991 // On Android the oatdata and the oatexec symbols in the oat and odex files
1992 // covers the full .text section what causes issues with displaying unusable
1993 // symbol name to the user and very slow unwinding speed because the
1994 // instruction emulation based unwind plans try to emulate all instructions
1995 // in these symbols. Don't add these symbols to the symbol list as they have
1996 // no use for the debugger and they are causing a lot of trouble. Filtering
1997 // can't be restricted to Android because this special object file don't
1998 // contain the note section specifying the environment to Android but the
1999 // custom extension and file name makes it highly unlikely that this will
2000 // collide with anything else.
2001 ConstString file_extension = m_file.GetFileNameExtension();
2002 bool skip_oatdata_oatexec =
2003 file_extension == ".oat" || file_extension == ".odex";
2005 ArchSpec arch = GetArchitecture();
2006 ModuleSP module_sp(GetModule());
2007 SectionList *module_section_list =
2008 module_sp ? module_sp->GetSectionList() : nullptr;
2010 // Local cache to avoid doing a FindSectionByName for each symbol. The "const
2011 // char*" key must came from a ConstString object so they can be compared by
2013 std::unordered_map<const char *, lldb::SectionSP> section_name_to_section;
2016 for (i = 0; i < num_symbols; ++i) {
2017 if (!symbol.Parse(symtab_data, &offset))
2020 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2024 // No need to add non-section symbols that have no names
2025 if (symbol.getType() != STT_SECTION &&
2026 (symbol_name == nullptr || symbol_name[0] == '\0'))
2029 // Skipping oatdata and oatexec sections if it is requested. See details
2030 // above the definition of skip_oatdata_oatexec for the reasons.
2031 if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
2032 ::strcmp(symbol_name, "oatexec") == 0))
2035 SectionSP symbol_section_sp;
2036 SymbolType symbol_type = eSymbolTypeInvalid;
2037 Elf64_Half shndx = symbol.st_shndx;
2041 symbol_type = eSymbolTypeAbsolute;
2044 symbol_type = eSymbolTypeUndefined;
2047 symbol_section_sp = section_list->FindSectionByID(shndx);
2051 // If a symbol is undefined do not process it further even if it has a STT
2053 if (symbol_type != eSymbolTypeUndefined) {
2054 switch (symbol.getType()) {
2057 // The symbol's type is not specified.
2061 // The symbol is associated with a data object, such as a variable, an
2063 symbol_type = eSymbolTypeData;
2067 // The symbol is associated with a function or other executable code.
2068 symbol_type = eSymbolTypeCode;
2072 // The symbol is associated with a section. Symbol table entries of
2073 // this type exist primarily for relocation and normally have STB_LOCAL
2078 // Conventionally, the symbol's name gives the name of the source file
2079 // associated with the object file. A file symbol has STB_LOCAL
2080 // binding, its section index is SHN_ABS, and it precedes the other
2081 // STB_LOCAL symbols for the file, if it is present.
2082 symbol_type = eSymbolTypeSourceFile;
2086 // The symbol is associated with an indirect function. The actual
2087 // function will be resolved if it is referenced.
2088 symbol_type = eSymbolTypeResolver;
2093 if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION) {
2094 if (symbol_section_sp) {
2095 ConstString sect_name = symbol_section_sp->GetName();
2096 if (sect_name == text_section_name || sect_name == init_section_name ||
2097 sect_name == fini_section_name || sect_name == ctors_section_name ||
2098 sect_name == dtors_section_name) {
2099 symbol_type = eSymbolTypeCode;
2100 } else if (sect_name == data_section_name ||
2101 sect_name == data2_section_name ||
2102 sect_name == rodata_section_name ||
2103 sect_name == rodata1_section_name ||
2104 sect_name == bss_section_name) {
2105 symbol_type = eSymbolTypeData;
2110 int64_t symbol_value_offset = 0;
2111 uint32_t additional_flags = 0;
2113 if (arch.IsValid()) {
2114 if (arch.GetMachine() == llvm::Triple::arm) {
2115 if (symbol.getBinding() == STB_LOCAL) {
2116 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2117 if (symbol_type == eSymbolTypeCode) {
2118 switch (mapping_symbol) {
2120 // $a[.<any>]* - marks an ARM instruction sequence
2121 m_address_class_map[symbol.st_value] = AddressClass::eCode;
2125 // $b[.<any>]* - marks a THUMB BL instruction sequence
2126 // $t[.<any>]* - marks a THUMB instruction sequence
2127 m_address_class_map[symbol.st_value] =
2128 AddressClass::eCodeAlternateISA;
2131 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2132 m_address_class_map[symbol.st_value] = AddressClass::eData;
2139 } else if (arch.GetMachine() == llvm::Triple::aarch64) {
2140 if (symbol.getBinding() == STB_LOCAL) {
2141 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2142 if (symbol_type == eSymbolTypeCode) {
2143 switch (mapping_symbol) {
2145 // $x[.<any>]* - marks an A64 instruction sequence
2146 m_address_class_map[symbol.st_value] = AddressClass::eCode;
2149 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2150 m_address_class_map[symbol.st_value] = AddressClass::eData;
2159 if (arch.GetMachine() == llvm::Triple::arm) {
2160 if (symbol_type == eSymbolTypeCode) {
2161 if (symbol.st_value & 1) {
2162 // Subtracting 1 from the address effectively unsets the low order
2163 // bit, which results in the address actually pointing to the
2164 // beginning of the symbol. This delta will be used below in
2165 // conjunction with symbol.st_value to produce the final
2166 // symbol_value that we store in the symtab.
2167 symbol_value_offset = -1;
2168 m_address_class_map[symbol.st_value ^ 1] =
2169 AddressClass::eCodeAlternateISA;
2171 // This address is ARM
2172 m_address_class_map[symbol.st_value] = AddressClass::eCode;
2179 * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for
2181 * This allows processor to switch between microMIPS and MIPS without any
2183 * for special mode-control register. However, apart from .debug_line,
2185 * the ELF/DWARF sections set the ISA bit (for symbol or section). Use
2187 * flag to check whether the symbol is microMIPS and then set the address
2191 if (arch.IsMIPS()) {
2192 if (IS_MICROMIPS(symbol.st_other))
2193 m_address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA;
2194 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) {
2195 symbol.st_value = symbol.st_value & (~1ull);
2196 m_address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA;
2198 if (symbol_type == eSymbolTypeCode)
2199 m_address_class_map[symbol.st_value] = AddressClass::eCode;
2200 else if (symbol_type == eSymbolTypeData)
2201 m_address_class_map[symbol.st_value] = AddressClass::eData;
2203 m_address_class_map[symbol.st_value] = AddressClass::eUnknown;
2208 // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB
2209 // symbols. See above for more details.
2210 uint64_t symbol_value = symbol.st_value + symbol_value_offset;
2212 if (symbol_section_sp == nullptr && shndx == SHN_ABS &&
2213 symbol.st_size != 0) {
2214 // We don't have a section for a symbol with non-zero size. Create a new
2215 // section for it so the address range covered by the symbol is also
2216 // covered by the module (represented through the section list). It is
2217 // needed so module lookup for the addresses covered by this symbol will
2218 // be successfull. This case happens for absolute symbols.
2219 ConstString fake_section_name(std::string(".absolute.") + symbol_name);
2221 std::make_shared<Section>(module_sp, this, SHN_ABS, fake_section_name,
2222 eSectionTypeAbsoluteAddress, symbol_value,
2223 symbol.st_size, 0, 0, 0, SHF_ALLOC);
2225 module_section_list->AddSection(symbol_section_sp);
2226 section_list->AddSection(symbol_section_sp);
2229 if (symbol_section_sp &&
2230 CalculateType() != ObjectFile::Type::eTypeObjectFile)
2231 symbol_value -= symbol_section_sp->GetFileAddress();
2233 if (symbol_section_sp && module_section_list &&
2234 module_section_list != section_list) {
2235 ConstString sect_name = symbol_section_sp->GetName();
2236 auto section_it = section_name_to_section.find(sect_name.GetCString());
2237 if (section_it == section_name_to_section.end())
2239 section_name_to_section
2240 .emplace(sect_name.GetCString(),
2241 module_section_list->FindSectionByName(sect_name))
2243 if (section_it->second)
2244 symbol_section_sp = section_it->second;
2247 bool is_global = symbol.getBinding() == STB_GLOBAL;
2248 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
2249 bool is_mangled = (symbol_name[0] == '_' && symbol_name[1] == 'Z');
2251 llvm::StringRef symbol_ref(symbol_name);
2253 // Symbol names may contain @VERSION suffixes. Find those and strip them
2255 size_t version_pos = symbol_ref.find('@');
2256 bool has_suffix = version_pos != llvm::StringRef::npos;
2257 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos);
2258 Mangled mangled(ConstString(symbol_bare), is_mangled);
2260 // Now append the suffix back to mangled and unmangled names. Only do it if
2261 // the demangling was successful (string is not empty).
2263 llvm::StringRef suffix = symbol_ref.substr(version_pos);
2265 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef();
2266 if (!mangled_name.empty())
2267 mangled.SetMangledName(ConstString((mangled_name + suffix).str()));
2269 ConstString demangled =
2270 mangled.GetDemangledName(lldb::eLanguageTypeUnknown);
2271 llvm::StringRef demangled_name = demangled.GetStringRef();
2272 if (!demangled_name.empty())
2273 mangled.SetDemangledName(ConstString((demangled_name + suffix).str()));
2276 // In ELF all symbol should have a valid size but it is not true for some
2277 // function symbols coming from hand written assembly. As none of the
2278 // function symbol should have 0 size we try to calculate the size for
2279 // these symbols in the symtab with saying that their original size is not
2281 bool symbol_size_valid =
2282 symbol.st_size != 0 || symbol.getType() != STT_FUNC;
2285 i + start_id, // ID is the original symbol table index.
2287 symbol_type, // Type of this symbol
2288 is_global, // Is this globally visible?
2289 false, // Is this symbol debug info?
2290 false, // Is this symbol a trampoline?
2291 false, // Is this symbol artificial?
2292 AddressRange(symbol_section_sp, // Section in which this symbol is
2294 symbol_value, // Offset in section or symbol value.
2295 symbol.st_size), // Size in bytes of this symbol.
2296 symbol_size_valid, // Symbol size is valid
2297 has_suffix, // Contains linker annotations?
2298 flags); // Symbol flags.
2299 symtab->AddSymbol(dc_symbol);
2304 unsigned ObjectFileELF::ParseSymbolTable(Symtab *symbol_table,
2306 lldb_private::Section *symtab) {
2307 if (symtab->GetObjectFile() != this) {
2308 // If the symbol table section is owned by a different object file, have it
2310 ObjectFileELF *obj_file_elf =
2311 static_cast<ObjectFileELF *>(symtab->GetObjectFile());
2312 return obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab);
2315 // Get section list for this object file.
2316 SectionList *section_list = m_sections_up.get();
2320 user_id_t symtab_id = symtab->GetID();
2321 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2322 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
2323 symtab_hdr->sh_type == SHT_DYNSYM);
2325 // sh_link: section header index of associated string table.
2326 user_id_t strtab_id = symtab_hdr->sh_link;
2327 Section *strtab = section_list->FindSectionByID(strtab_id).get();
2329 if (symtab && strtab) {
2330 assert(symtab->GetObjectFile() == this);
2331 assert(strtab->GetObjectFile() == this);
2333 DataExtractor symtab_data;
2334 DataExtractor strtab_data;
2335 if (ReadSectionData(symtab, symtab_data) &&
2336 ReadSectionData(strtab, strtab_data)) {
2337 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
2339 return ParseSymbols(symbol_table, start_id, section_list, num_symbols,
2340 symtab_data, strtab_data);
2347 size_t ObjectFileELF::ParseDynamicSymbols() {
2348 if (m_dynamic_symbols.size())
2349 return m_dynamic_symbols.size();
2351 SectionList *section_list = GetSectionList();
2355 // Find the SHT_DYNAMIC section.
2357 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
2361 assert(dynsym->GetObjectFile() == this);
2364 DataExtractor dynsym_data;
2365 if (ReadSectionData(dynsym, dynsym_data)) {
2366 const lldb::offset_t section_size = dynsym_data.GetByteSize();
2367 lldb::offset_t cursor = 0;
2369 while (cursor < section_size) {
2370 if (!symbol.Parse(dynsym_data, &cursor))
2373 m_dynamic_symbols.push_back(symbol);
2377 return m_dynamic_symbols.size();
2380 const ELFDynamic *ObjectFileELF::FindDynamicSymbol(unsigned tag) {
2381 if (!ParseDynamicSymbols())
2384 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2385 DynamicSymbolCollIter E = m_dynamic_symbols.end();
2386 for (; I != E; ++I) {
2387 ELFDynamic *symbol = &*I;
2389 if (symbol->d_tag == tag)
2396 unsigned ObjectFileELF::PLTRelocationType() {
2398 // This member specifies the type of relocation entry to which the
2399 // procedure linkage table refers. The d_val member holds DT_REL or
2400 // DT_RELA, as appropriate. All relocations in a procedure linkage table
2401 // must use the same relocation.
2402 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2405 return symbol->d_val;
2410 // Returns the size of the normal plt entries and the offset of the first
2411 // normal plt entry. The 0th entry in the plt table is usually a resolution
2412 // entry which have different size in some architectures then the rest of the
2414 static std::pair<uint64_t, uint64_t>
2415 GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr,
2416 const ELFSectionHeader *plt_hdr) {
2417 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2419 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are
2420 // 16 bytes. So round the entsize up by the alignment if addralign is set.
2421 elf_xword plt_entsize =
2422 plt_hdr->sh_addralign
2423 ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign)
2424 : plt_hdr->sh_entsize;
2426 // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly.
2427 // PLT entries relocation code in general requires multiple instruction and
2428 // should be greater than 4 bytes in most cases. Try to guess correct size
2430 if (plt_entsize <= 4) {
2431 // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the
2432 // size of the plt entries based on the number of entries and the size of
2433 // the plt section with the assumption that the size of the 0th entry is at
2434 // least as big as the size of the normal entries and it isn't much bigger
2436 if (plt_hdr->sh_addralign)
2437 plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign /
2438 (num_relocations + 1) * plt_hdr->sh_addralign;
2440 plt_entsize = plt_hdr->sh_size / (num_relocations + 1);
2443 elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize;
2445 return std::make_pair(plt_entsize, plt_offset);
2448 static unsigned ParsePLTRelocations(
2449 Symtab *symbol_table, user_id_t start_id, unsigned rel_type,
2450 const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2451 const ELFSectionHeader *plt_hdr, const ELFSectionHeader *sym_hdr,
2452 const lldb::SectionSP &plt_section_sp, DataExtractor &rel_data,
2453 DataExtractor &symtab_data, DataExtractor &strtab_data) {
2454 ELFRelocation rel(rel_type);
2456 lldb::offset_t offset = 0;
2458 uint64_t plt_offset, plt_entsize;
2459 std::tie(plt_entsize, plt_offset) =
2460 GetPltEntrySizeAndOffset(rel_hdr, plt_hdr);
2461 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2463 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2464 reloc_info_fn reloc_type;
2465 reloc_info_fn reloc_symbol;
2467 if (hdr->Is32Bit()) {
2468 reloc_type = ELFRelocation::RelocType32;
2469 reloc_symbol = ELFRelocation::RelocSymbol32;
2471 reloc_type = ELFRelocation::RelocType64;
2472 reloc_symbol = ELFRelocation::RelocSymbol64;
2475 unsigned slot_type = hdr->GetRelocationJumpSlotType();
2477 for (i = 0; i < num_relocations; ++i) {
2478 if (!rel.Parse(rel_data, &offset))
2481 if (reloc_type(rel) != slot_type)
2484 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
2485 if (!symbol.Parse(symtab_data, &symbol_offset))
2488 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2490 symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
2491 uint64_t plt_index = plt_offset + i * plt_entsize;
2494 i + start_id, // Symbol table index
2495 symbol_name, // symbol name.
2496 is_mangled, // is the symbol name mangled?
2497 eSymbolTypeTrampoline, // Type of this symbol
2498 false, // Is this globally visible?
2499 false, // Is this symbol debug info?
2500 true, // Is this symbol a trampoline?
2501 true, // Is this symbol artificial?
2502 plt_section_sp, // Section in which this symbol is defined or null.
2503 plt_index, // Offset in section or symbol value.
2504 plt_entsize, // Size in bytes of this symbol.
2505 true, // Size is valid
2506 false, // Contains linker annotations?
2507 0); // Symbol flags.
2509 symbol_table->AddSymbol(jump_symbol);
2516 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, user_id_t start_id,
2517 const ELFSectionHeaderInfo *rel_hdr,
2519 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2521 // The link field points to the associated symbol table.
2522 user_id_t symtab_id = rel_hdr->sh_link;
2524 // If the link field doesn't point to the appropriate symbol name table then
2525 // try to find it by name as some compiler don't fill in the link fields.
2527 symtab_id = GetSectionIndexByName(".dynsym");
2529 // Get PLT section. We cannot use rel_hdr->sh_info, since current linkers
2530 // point that to the .got.plt or .got section instead of .plt.
2531 user_id_t plt_id = GetSectionIndexByName(".plt");
2533 if (!symtab_id || !plt_id)
2536 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
2540 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
2544 SectionList *section_list = m_sections_up.get();
2548 Section *rel_section = section_list->FindSectionByID(rel_id).get();
2552 SectionSP plt_section_sp(section_list->FindSectionByID(plt_id));
2553 if (!plt_section_sp)
2556 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2560 // sh_link points to associated string table.
2561 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link).get();
2565 DataExtractor rel_data;
2566 if (!ReadSectionData(rel_section, rel_data))
2569 DataExtractor symtab_data;
2570 if (!ReadSectionData(symtab, symtab_data))
2573 DataExtractor strtab_data;
2574 if (!ReadSectionData(strtab, strtab_data))
2577 unsigned rel_type = PLTRelocationType();
2581 return ParsePLTRelocations(symbol_table, start_id, rel_type, &m_header,
2582 rel_hdr, plt_hdr, sym_hdr, plt_section_sp,
2583 rel_data, symtab_data, strtab_data);
2586 unsigned ObjectFileELF::ApplyRelocations(
2587 Symtab *symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2588 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2589 DataExtractor &rel_data, DataExtractor &symtab_data,
2590 DataExtractor &debug_data, Section *rel_section) {
2591 ELFRelocation rel(rel_hdr->sh_type);
2592 lldb::addr_t offset = 0;
2593 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2594 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2595 reloc_info_fn reloc_type;
2596 reloc_info_fn reloc_symbol;
2598 if (hdr->Is32Bit()) {
2599 reloc_type = ELFRelocation::RelocType32;
2600 reloc_symbol = ELFRelocation::RelocSymbol32;
2602 reloc_type = ELFRelocation::RelocType64;
2603 reloc_symbol = ELFRelocation::RelocSymbol64;
2606 for (unsigned i = 0; i < num_relocations; ++i) {
2607 if (!rel.Parse(rel_data, &offset))
2610 Symbol *symbol = nullptr;
2612 if (hdr->Is32Bit()) {
2613 switch (reloc_type(rel)) {
2617 // FIXME: This asserts with this input:
2620 // int main(int argc, char **argv) { return 0; }
2622 // clang++.exe --target=i686-unknown-linux-gnu -g -c foo.cpp -o foo.o
2624 // and running this on the foo.o module.
2625 assert(false && "unexpected relocation type");
2628 switch (reloc_type(rel)) {
2629 case R_AARCH64_ABS64:
2631 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2633 addr_t value = symbol->GetAddressRef().GetFileAddress();
2634 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2635 uint64_t *dst = reinterpret_cast<uint64_t *>(
2636 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2637 ELFRelocation::RelocOffset64(rel));
2638 uint64_t val_offset = value + ELFRelocation::RelocAddend64(rel);
2639 memcpy(dst, &val_offset, sizeof(uint64_t));
2645 case R_AARCH64_ABS32: {
2646 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2648 addr_t value = symbol->GetAddressRef().GetFileAddress();
2649 value += ELFRelocation::RelocAddend32(rel);
2650 if ((reloc_type(rel) == R_X86_64_32 && (value > UINT32_MAX)) ||
2651 (reloc_type(rel) == R_X86_64_32S &&
2652 ((int64_t)value > INT32_MAX && (int64_t)value < INT32_MIN)) ||
2653 (reloc_type(rel) == R_AARCH64_ABS32 &&
2654 ((int64_t)value > INT32_MAX && (int64_t)value < INT32_MIN))) {
2656 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES);
2657 log->Printf("Failed to apply debug info relocations");
2660 uint32_t truncated_addr = (value & 0xFFFFFFFF);
2661 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2662 uint32_t *dst = reinterpret_cast<uint32_t *>(
2663 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2664 ELFRelocation::RelocOffset32(rel));
2665 memcpy(dst, &truncated_addr, sizeof(uint32_t));
2671 assert(false && "unexpected relocation type");
2679 unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr,
2681 lldb_private::Symtab *thetab) {
2682 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2684 // Parse in the section list if needed.
2685 SectionList *section_list = GetSectionList();
2689 user_id_t symtab_id = rel_hdr->sh_link;
2690 user_id_t debug_id = rel_hdr->sh_info;
2692 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2696 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2700 Section *rel = section_list->FindSectionByID(rel_id).get();
2704 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2708 Section *debug = section_list->FindSectionByID(debug_id).get();
2712 DataExtractor rel_data;
2713 DataExtractor symtab_data;
2714 DataExtractor debug_data;
2716 if (GetData(rel->GetFileOffset(), rel->GetFileSize(), rel_data) &&
2717 GetData(symtab->GetFileOffset(), symtab->GetFileSize(), symtab_data) &&
2718 GetData(debug->GetFileOffset(), debug->GetFileSize(), debug_data)) {
2719 ApplyRelocations(thetab, &m_header, rel_hdr, symtab_hdr, debug_hdr,
2720 rel_data, symtab_data, debug_data, debug);
2726 Symtab *ObjectFileELF::GetSymtab() {
2727 ModuleSP module_sp(GetModule());
2731 // We always want to use the main object file so we (hopefully) only have one
2732 // cached copy of our symtab, dynamic sections, etc.
2733 ObjectFile *module_obj_file = module_sp->GetObjectFile();
2734 if (module_obj_file && module_obj_file != this)
2735 return module_obj_file->GetSymtab();
2737 if (m_symtab_up == nullptr) {
2738 SectionList *section_list = module_sp->GetSectionList();
2742 uint64_t symbol_id = 0;
2743 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
2745 // Sharable objects and dynamic executables usually have 2 distinct symbol
2746 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a
2747 // smaller version of the symtab that only contains global symbols. The
2748 // information found in the dynsym is therefore also found in the symtab,
2749 // while the reverse is not necessarily true.
2751 section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get();
2753 // The symtab section is non-allocable and can be stripped, so if it
2754 // doesn't exist then use the dynsym section which should always be
2757 section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true)
2761 m_symtab_up.reset(new Symtab(symtab->GetObjectFile()));
2762 symbol_id += ParseSymbolTable(m_symtab_up.get(), symbol_id, symtab);
2766 // If present, this entry's d_ptr member holds the address of
2768 // entries associated solely with the procedure linkage table.
2770 // these relocation entries lets the dynamic linker ignore them during
2771 // process initialization, if lazy binding is enabled. If this entry is
2772 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2774 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2776 // Synthesize trampoline symbols to help navigate the PLT.
2777 addr_t addr = symbol->d_ptr;
2778 Section *reloc_section =
2779 section_list->FindSectionContainingFileAddress(addr).get();
2780 if (reloc_section) {
2781 user_id_t reloc_id = reloc_section->GetID();
2782 const ELFSectionHeaderInfo *reloc_header =
2783 GetSectionHeaderByIndex(reloc_id);
2784 assert(reloc_header);
2786 if (m_symtab_up == nullptr)
2787 m_symtab_up.reset(new Symtab(reloc_section->GetObjectFile()));
2789 ParseTrampolineSymbols(m_symtab_up.get(), symbol_id, reloc_header,
2794 if (DWARFCallFrameInfo *eh_frame =
2795 GetModule()->GetUnwindTable().GetEHFrameInfo()) {
2796 if (m_symtab_up == nullptr)
2797 m_symtab_up.reset(new Symtab(this));
2798 ParseUnwindSymbols(m_symtab_up.get(), eh_frame);
2801 // If we still don't have any symtab then create an empty instance to avoid
2802 // do the section lookup next time.
2803 if (m_symtab_up == nullptr)
2804 m_symtab_up.reset(new Symtab(this));
2806 m_symtab_up->CalculateSymbolSizes();
2809 return m_symtab_up.get();
2812 void ObjectFileELF::RelocateSection(lldb_private::Section *section)
2814 static const char *debug_prefix = ".debug";
2816 // Set relocated bit so we stop getting called, regardless of whether we
2817 // actually relocate.
2818 section->SetIsRelocated(true);
2820 // We only relocate in ELF relocatable files
2821 if (CalculateType() != eTypeObjectFile)
2824 const char *section_name = section->GetName().GetCString();
2825 // Can't relocate that which can't be named
2826 if (section_name == nullptr)
2829 // We don't relocate non-debug sections at the moment
2830 if (strncmp(section_name, debug_prefix, strlen(debug_prefix)))
2833 // Relocation section names to look for
2834 std::string needle = std::string(".rel") + section_name;
2835 std::string needlea = std::string(".rela") + section_name;
2837 for (SectionHeaderCollIter I = m_section_headers.begin();
2838 I != m_section_headers.end(); ++I) {
2839 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) {
2840 const char *hay_name = I->section_name.GetCString();
2841 if (hay_name == nullptr)
2843 if (needle == hay_name || needlea == hay_name) {
2844 const ELFSectionHeader &reloc_header = *I;
2845 user_id_t reloc_id = SectionIndex(I);
2846 RelocateDebugSections(&reloc_header, reloc_id, GetSymtab());
2853 void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table,
2854 DWARFCallFrameInfo *eh_frame) {
2855 SectionList *section_list = GetSectionList();
2859 // First we save the new symbols into a separate list and add them to the
2860 // symbol table after we colleced all symbols we want to add. This is
2861 // neccessary because adding a new symbol invalidates the internal index of
2862 // the symtab what causing the next lookup to be slow because it have to
2863 // recalculate the index first.
2864 std::vector<Symbol> new_symbols;
2866 eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols](
2867 lldb::addr_t file_addr, uint32_t size, dw_offset_t) {
2868 Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
2870 if (!symbol->GetByteSizeIsValid()) {
2871 symbol->SetByteSize(size);
2872 symbol->SetSizeIsSynthesized(true);
2875 SectionSP section_sp =
2876 section_list->FindSectionContainingFileAddress(file_addr);
2878 addr_t offset = file_addr - section_sp->GetFileAddress();
2879 const char *symbol_name = GetNextSyntheticSymbolName().GetCString();
2880 uint64_t symbol_id = symbol_table->GetNumSymbols();
2882 symbol_id, // Symbol table index.
2883 symbol_name, // Symbol name.
2884 false, // Is the symbol name mangled?
2885 eSymbolTypeCode, // Type of this symbol.
2886 true, // Is this globally visible?
2887 false, // Is this symbol debug info?
2888 false, // Is this symbol a trampoline?
2889 true, // Is this symbol artificial?
2890 section_sp, // Section in which this symbol is defined or null.
2891 offset, // Offset in section or symbol value.
2892 0, // Size: Don't specify the size as an FDE can
2893 false, // Size is valid: cover multiple symbols.
2894 false, // Contains linker annotations?
2895 0); // Symbol flags.
2896 new_symbols.push_back(eh_symbol);
2902 for (const Symbol &s : new_symbols)
2903 symbol_table->AddSymbol(s);
2906 bool ObjectFileELF::IsStripped() {
2907 // TODO: determine this for ELF
2911 //===----------------------------------------------------------------------===//
2914 // Dump the specifics of the runtime file container (such as any headers
2915 // segments, sections, etc).
2916 void ObjectFileELF::Dump(Stream *s) {
2917 ModuleSP module_sp(GetModule());
2922 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
2923 s->Printf("%p: ", static_cast<void *>(this));
2925 s->PutCString("ObjectFileELF");
2927 ArchSpec header_arch = GetArchitecture();
2929 *s << ", file = '" << m_file
2930 << "', arch = " << header_arch.GetArchitectureName() << "\n";
2932 DumpELFHeader(s, m_header);
2934 DumpELFProgramHeaders(s);
2936 DumpELFSectionHeaders(s);
2938 SectionList *section_list = GetSectionList();
2940 section_list->Dump(s, nullptr, true, UINT32_MAX);
2941 Symtab *symtab = GetSymtab();
2943 symtab->Dump(s, nullptr, eSortOrderNone);
2945 DumpDependentModules(s);
2951 // Dump the ELF header to the specified output stream
2952 void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) {
2953 s->PutCString("ELF Header\n");
2954 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2955 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1],
2956 header.e_ident[EI_MAG1]);
2957 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2],
2958 header.e_ident[EI_MAG2]);
2959 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3],
2960 header.e_ident[EI_MAG3]);
2962 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2963 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
2964 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2965 s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2966 s->Printf("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
2968 s->Printf("e_type = 0x%4.4x ", header.e_type);
2969 DumpELFHeader_e_type(s, header.e_type);
2970 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
2971 s->Printf("e_version = 0x%8.8x\n", header.e_version);
2972 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
2973 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
2974 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
2975 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
2976 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
2977 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
2978 s->Printf("e_phnum = 0x%8.8x\n", header.e_phnum);
2979 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
2980 s->Printf("e_shnum = 0x%8.8x\n", header.e_shnum);
2981 s->Printf("e_shstrndx = 0x%8.8x\n", header.e_shstrndx);
2984 // DumpELFHeader_e_type
2986 // Dump an token value for the ELF header member e_type
2987 void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) {
3009 // DumpELFHeader_e_ident_EI_DATA
3011 // Dump an token value for the ELF header member e_ident[EI_DATA]
3012 void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s,
3013 unsigned char ei_data) {
3016 *s << "ELFDATANONE";
3019 *s << "ELFDATA2LSB - Little Endian";
3022 *s << "ELFDATA2MSB - Big Endian";
3029 // DumpELFProgramHeader
3031 // Dump a single ELF program header to the specified output stream
3032 void ObjectFileELF::DumpELFProgramHeader(Stream *s,
3033 const ELFProgramHeader &ph) {
3034 DumpELFProgramHeader_p_type(s, ph.p_type);
3035 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset,
3036 ph.p_vaddr, ph.p_paddr);
3037 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz,
3040 DumpELFProgramHeader_p_flags(s, ph.p_flags);
3041 s->Printf(") %8.8" PRIx64, ph.p_align);
3044 // DumpELFProgramHeader_p_type
3046 // Dump an token value for the ELF program header member p_type which describes
3047 // the type of the program header
3048 void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) {
3049 const int kStrWidth = 15;
3051 CASE_AND_STREAM(s, PT_NULL, kStrWidth);
3052 CASE_AND_STREAM(s, PT_LOAD, kStrWidth);
3053 CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth);
3054 CASE_AND_STREAM(s, PT_INTERP, kStrWidth);
3055 CASE_AND_STREAM(s, PT_NOTE, kStrWidth);
3056 CASE_AND_STREAM(s, PT_SHLIB, kStrWidth);
3057 CASE_AND_STREAM(s, PT_PHDR, kStrWidth);
3058 CASE_AND_STREAM(s, PT_TLS, kStrWidth);
3059 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
3061 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
3066 // DumpELFProgramHeader_p_flags
3068 // Dump an token value for the ELF program header member p_flags
3069 void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) {
3070 *s << ((p_flags & PF_X) ? "PF_X" : " ")
3071 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
3072 << ((p_flags & PF_W) ? "PF_W" : " ")
3073 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
3074 << ((p_flags & PF_R) ? "PF_R" : " ");
3077 // DumpELFProgramHeaders
3079 // Dump all of the ELF program header to the specified output stream
3080 void ObjectFileELF::DumpELFProgramHeaders(Stream *s) {
3081 if (!ParseProgramHeaders())
3084 s->PutCString("Program Headers\n");
3085 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
3086 "p_filesz p_memsz p_flags p_align\n");
3087 s->PutCString("==== --------------- -------- -------- -------- "
3088 "-------- -------- ------------------------- --------\n");
3090 for (const auto &H : llvm::enumerate(m_program_headers)) {
3091 s->Format("[{0,2}] ", H.index());
3092 ObjectFileELF::DumpELFProgramHeader(s, H.value());
3097 // DumpELFSectionHeader
3099 // Dump a single ELF section header to the specified output stream
3100 void ObjectFileELF::DumpELFSectionHeader(Stream *s,
3101 const ELFSectionHeaderInfo &sh) {
3102 s->Printf("%8.8x ", sh.sh_name);
3103 DumpELFSectionHeader_sh_type(s, sh.sh_type);
3104 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
3105 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
3106 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr,
3107 sh.sh_offset, sh.sh_size);
3108 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
3109 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
3112 // DumpELFSectionHeader_sh_type
3114 // Dump an token value for the ELF section header member sh_type which
3115 // describes the type of the section
3116 void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) {
3117 const int kStrWidth = 12;
3119 CASE_AND_STREAM(s, SHT_NULL, kStrWidth);
3120 CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth);
3121 CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth);
3122 CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth);
3123 CASE_AND_STREAM(s, SHT_RELA, kStrWidth);
3124 CASE_AND_STREAM(s, SHT_HASH, kStrWidth);
3125 CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth);
3126 CASE_AND_STREAM(s, SHT_NOTE, kStrWidth);
3127 CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth);
3128 CASE_AND_STREAM(s, SHT_REL, kStrWidth);
3129 CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth);
3130 CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth);
3131 CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth);
3132 CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth);
3133 CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth);
3134 CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth);
3136 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
3141 // DumpELFSectionHeader_sh_flags
3143 // Dump an token value for the ELF section header member sh_flags
3144 void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s,
3145 elf_xword sh_flags) {
3146 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
3147 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
3148 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
3149 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
3150 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
3153 // DumpELFSectionHeaders
3155 // Dump all of the ELF section header to the specified output stream
3156 void ObjectFileELF::DumpELFSectionHeaders(Stream *s) {
3157 if (!ParseSectionHeaders())
3160 s->PutCString("Section Headers\n");
3161 s->PutCString("IDX name type flags "
3162 "addr offset size link info addralgn "
3164 s->PutCString("==== -------- ------------ -------------------------------- "
3165 "-------- -------- -------- -------- -------- -------- "
3166 "-------- ====================\n");
3169 for (SectionHeaderCollConstIter I = m_section_headers.begin();
3170 I != m_section_headers.end(); ++I, ++idx) {
3171 s->Printf("[%2u] ", idx);
3172 ObjectFileELF::DumpELFSectionHeader(s, *I);
3173 const char *section_name = I->section_name.AsCString("");
3175 *s << ' ' << section_name << "\n";
3179 void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) {
3180 size_t num_modules = ParseDependentModules();
3182 if (num_modules > 0) {
3183 s->PutCString("Dependent Modules:\n");
3184 for (unsigned i = 0; i < num_modules; ++i) {
3185 const FileSpec &spec = m_filespec_up->GetFileSpecAtIndex(i);
3186 s->Printf(" %s\n", spec.GetFilename().GetCString());
3191 ArchSpec ObjectFileELF::GetArchitecture() {
3195 if (m_section_headers.empty()) {
3196 // Allow elf notes to be parsed which may affect the detected architecture.
3197 ParseSectionHeaders();
3200 if (CalculateType() == eTypeCoreFile &&
3201 !m_arch_spec.TripleOSWasSpecified()) {
3202 // Core files don't have section headers yet they have PT_NOTE program
3203 // headers that might shed more light on the architecture
3204 for (const elf::ELFProgramHeader &H : ProgramHeaders()) {
3205 if (H.p_type != PT_NOTE || H.p_offset == 0 || H.p_filesz == 0)
3208 if (data.SetData(m_data, H.p_offset, H.p_filesz) == H.p_filesz) {
3210 RefineModuleDetailsFromNote(data, m_arch_spec, uuid);
3217 ObjectFile::Type ObjectFileELF::CalculateType() {
3218 switch (m_header.e_type) {
3219 case llvm::ELF::ET_NONE:
3221 return eTypeUnknown;
3223 case llvm::ELF::ET_REL:
3224 // 1 - Relocatable file
3225 return eTypeObjectFile;
3227 case llvm::ELF::ET_EXEC:
3228 // 2 - Executable file
3229 return eTypeExecutable;
3231 case llvm::ELF::ET_DYN:
3232 // 3 - Shared object file
3233 return eTypeSharedLibrary;
3237 return eTypeCoreFile;
3242 return eTypeUnknown;
3245 ObjectFile::Strata ObjectFileELF::CalculateStrata() {
3246 switch (m_header.e_type) {
3247 case llvm::ELF::ET_NONE:
3249 return eStrataUnknown;
3251 case llvm::ELF::ET_REL:
3252 // 1 - Relocatable file
3253 return eStrataUnknown;
3255 case llvm::ELF::ET_EXEC:
3256 // 2 - Executable file
3257 // TODO: is there any way to detect that an executable is a kernel
3258 // related executable by inspecting the program headers, section headers,
3259 // symbols, or any other flag bits???
3262 case llvm::ELF::ET_DYN:
3263 // 3 - Shared object file
3264 // TODO: is there any way to detect that an shared library is a kernel
3265 // related executable by inspecting the program headers, section headers,
3266 // symbols, or any other flag bits???
3267 return eStrataUnknown;
3271 // TODO: is there any way to detect that an core file is a kernel
3272 // related executable by inspecting the program headers, section headers,
3273 // symbols, or any other flag bits???
3274 return eStrataUnknown;
3279 return eStrataUnknown;
3282 size_t ObjectFileELF::ReadSectionData(Section *section,
3283 lldb::offset_t section_offset, void *dst,
3285 // If some other objectfile owns this data, pass this to them.
3286 if (section->GetObjectFile() != this)
3287 return section->GetObjectFile()->ReadSectionData(section, section_offset,
3290 if (!section->Test(SHF_COMPRESSED))
3291 return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len);
3293 // For compressed sections we need to read to full data to be able to
3296 ReadSectionData(section, data);
3297 return data.CopyData(section_offset, dst_len, dst);
3300 size_t ObjectFileELF::ReadSectionData(Section *section,
3301 DataExtractor §ion_data) {
3302 // If some other objectfile owns this data, pass this to them.
3303 if (section->GetObjectFile() != this)
3304 return section->GetObjectFile()->ReadSectionData(section, section_data);
3306 size_t result = ObjectFile::ReadSectionData(section, section_data);
3307 if (result == 0 || !llvm::object::Decompressor::isCompressedELFSection(
3308 section->Get(), section->GetName().GetStringRef()))
3311 auto Decompressor = llvm::object::Decompressor::create(
3312 section->GetName().GetStringRef(),
3313 {reinterpret_cast<const char *>(section_data.GetDataStart()),
3314 size_t(section_data.GetByteSize())},
3315 GetByteOrder() == eByteOrderLittle, GetAddressByteSize() == 8);
3316 if (!Decompressor) {
3317 GetModule()->ReportWarning(
3318 "Unable to initialize decompressor for section '%s': %s",
3319 section->GetName().GetCString(),
3320 llvm::toString(Decompressor.takeError()).c_str());
3321 section_data.Clear();
3326 std::make_shared<DataBufferHeap>(Decompressor->getDecompressedSize(), 0);
3327 if (auto error = Decompressor->decompress(
3328 {reinterpret_cast<char *>(buffer_sp->GetBytes()),
3329 size_t(buffer_sp->GetByteSize())})) {
3330 GetModule()->ReportWarning(
3331 "Decompression of section '%s' failed: %s",
3332 section->GetName().GetCString(),
3333 llvm::toString(std::move(error)).c_str());
3334 section_data.Clear();
3338 section_data.SetData(buffer_sp);
3339 return buffer_sp->GetByteSize();
3342 llvm::ArrayRef<ELFProgramHeader> ObjectFileELF::ProgramHeaders() {
3343 ParseProgramHeaders();
3344 return m_program_headers;
3347 DataExtractor ObjectFileELF::GetSegmentData(const ELFProgramHeader &H) {
3348 return DataExtractor(m_data, H.p_offset, H.p_filesz);
3351 bool ObjectFileELF::AnySegmentHasPhysicalAddress() {
3352 for (const ELFProgramHeader &H : ProgramHeaders()) {
3359 std::vector<ObjectFile::LoadableData>
3360 ObjectFileELF::GetLoadableData(Target &target) {
3361 // Create a list of loadable data from loadable segments, using physical
3362 // addresses if they aren't all null
3363 std::vector<LoadableData> loadables;
3364 bool should_use_paddr = AnySegmentHasPhysicalAddress();
3365 for (const ELFProgramHeader &H : ProgramHeaders()) {
3366 LoadableData loadable;
3367 if (H.p_type != llvm::ELF::PT_LOAD)
3369 loadable.Dest = should_use_paddr ? H.p_paddr : H.p_vaddr;
3370 if (loadable.Dest == LLDB_INVALID_ADDRESS)
3372 if (H.p_filesz == 0)
3374 auto segment_data = GetSegmentData(H);
3375 loadable.Contents = llvm::ArrayRef<uint8_t>(segment_data.GetDataStart(),
3376 segment_data.GetByteSize());
3377 loadables.push_back(loadable);