1 //===-- ObjectFileELF.cpp ------------------------------------- -*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "ObjectFileELF.h"
11 
12 #include <cassert>
13 #include <algorithm>
14 
15 #include "lldb/Core/ArchSpec.h"
16 #include "lldb/Core/DataBuffer.h"
17 #include "lldb/Core/Error.h"
18 #include "lldb/Core/FileSpecList.h"
19 #include "lldb/Core/Log.h"
20 #include "lldb/Core/Module.h"
21 #include "lldb/Core/ModuleSpec.h"
22 #include "lldb/Core/PluginManager.h"
23 #include "lldb/Core/Section.h"
24 #include "lldb/Core/Stream.h"
25 #include "lldb/Core/Timer.h"
26 #include "lldb/Symbol/DWARFCallFrameInfo.h"
27 #include "lldb/Symbol/SymbolContext.h"
28 #include "lldb/Target/SectionLoadList.h"
29 #include "lldb/Target/Target.h"
30 #include "lldb/Host/HostInfo.h"
31 
32 #include "llvm/ADT/PointerUnion.h"
33 #include "llvm/ADT/StringRef.h"
34 #include "llvm/Support/MathExtras.h"
35 
36 #define CASE_AND_STREAM(s, def, width)                  \
37     case def: s->Printf("%-*s", width, #def); break;
38 
39 using namespace lldb;
40 using namespace lldb_private;
41 using namespace elf;
42 using namespace llvm::ELF;
43 
44 namespace {
45 
46 // ELF note owner definitions
47 const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
48 const char *const LLDB_NT_OWNER_GNU     = "GNU";
49 const char *const LLDB_NT_OWNER_NETBSD  = "NetBSD";
50 const char *const LLDB_NT_OWNER_CSR     = "csr";
51 
52 // ELF note type definitions
53 const elf_word LLDB_NT_FREEBSD_ABI_TAG  = 0x01;
54 const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
55 
56 const elf_word LLDB_NT_GNU_ABI_TAG      = 0x01;
57 const elf_word LLDB_NT_GNU_ABI_SIZE     = 16;
58 
59 const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
60 
61 const elf_word LLDB_NT_NETBSD_ABI_TAG   = 0x01;
62 const elf_word LLDB_NT_NETBSD_ABI_SIZE  = 4;
63 
64 // GNU ABI note OS constants
65 const elf_word LLDB_NT_GNU_ABI_OS_LINUX   = 0x00;
66 const elf_word LLDB_NT_GNU_ABI_OS_HURD    = 0x01;
67 const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
68 
69 //===----------------------------------------------------------------------===//
70 /// @class ELFRelocation
71 /// @brief Generic wrapper for ELFRel and ELFRela.
72 ///
73 /// This helper class allows us to parse both ELFRel and ELFRela relocation
74 /// entries in a generic manner.
75 class ELFRelocation
76 {
77 public:
78 
79     /// Constructs an ELFRelocation entry with a personality as given by @p
80     /// type.
81     ///
82     /// @param type Either DT_REL or DT_RELA.  Any other value is invalid.
83     ELFRelocation(unsigned type);
84 
85     ~ELFRelocation();
86 
87     bool
88     Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
89 
90     static unsigned
91     RelocType32(const ELFRelocation &rel);
92 
93     static unsigned
94     RelocType64(const ELFRelocation &rel);
95 
96     static unsigned
97     RelocSymbol32(const ELFRelocation &rel);
98 
99     static unsigned
100     RelocSymbol64(const ELFRelocation &rel);
101 
102     static unsigned
103     RelocOffset32(const ELFRelocation &rel);
104 
105     static unsigned
106     RelocOffset64(const ELFRelocation &rel);
107 
108     static unsigned
109     RelocAddend32(const ELFRelocation &rel);
110 
111     static unsigned
112     RelocAddend64(const ELFRelocation &rel);
113 
114 private:
115     typedef llvm::PointerUnion<ELFRel*, ELFRela*> RelocUnion;
116 
117     RelocUnion reloc;
118 };
119 
120 ELFRelocation::ELFRelocation(unsigned type)
121 {
122     if (type == DT_REL || type == SHT_REL)
123         reloc = new ELFRel();
124     else if (type == DT_RELA || type == SHT_RELA)
125         reloc = new ELFRela();
126     else {
127         assert(false && "unexpected relocation type");
128         reloc = static_cast<ELFRel*>(NULL);
129     }
130 }
131 
132 ELFRelocation::~ELFRelocation()
133 {
134     if (reloc.is<ELFRel*>())
135         delete reloc.get<ELFRel*>();
136     else
137         delete reloc.get<ELFRela*>();
138 }
139 
140 bool
141 ELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
142 {
143     if (reloc.is<ELFRel*>())
144         return reloc.get<ELFRel*>()->Parse(data, offset);
145     else
146         return reloc.get<ELFRela*>()->Parse(data, offset);
147 }
148 
149 unsigned
150 ELFRelocation::RelocType32(const ELFRelocation &rel)
151 {
152     if (rel.reloc.is<ELFRel*>())
153         return ELFRel::RelocType32(*rel.reloc.get<ELFRel*>());
154     else
155         return ELFRela::RelocType32(*rel.reloc.get<ELFRela*>());
156 }
157 
158 unsigned
159 ELFRelocation::RelocType64(const ELFRelocation &rel)
160 {
161     if (rel.reloc.is<ELFRel*>())
162         return ELFRel::RelocType64(*rel.reloc.get<ELFRel*>());
163     else
164         return ELFRela::RelocType64(*rel.reloc.get<ELFRela*>());
165 }
166 
167 unsigned
168 ELFRelocation::RelocSymbol32(const ELFRelocation &rel)
169 {
170     if (rel.reloc.is<ELFRel*>())
171         return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel*>());
172     else
173         return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela*>());
174 }
175 
176 unsigned
177 ELFRelocation::RelocSymbol64(const ELFRelocation &rel)
178 {
179     if (rel.reloc.is<ELFRel*>())
180         return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel*>());
181     else
182         return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela*>());
183 }
184 
185 unsigned
186 ELFRelocation::RelocOffset32(const ELFRelocation &rel)
187 {
188     if (rel.reloc.is<ELFRel*>())
189         return rel.reloc.get<ELFRel*>()->r_offset;
190     else
191         return rel.reloc.get<ELFRela*>()->r_offset;
192 }
193 
194 unsigned
195 ELFRelocation::RelocOffset64(const ELFRelocation &rel)
196 {
197     if (rel.reloc.is<ELFRel*>())
198         return rel.reloc.get<ELFRel*>()->r_offset;
199     else
200         return rel.reloc.get<ELFRela*>()->r_offset;
201 }
202 
203 unsigned
204 ELFRelocation::RelocAddend32(const ELFRelocation &rel)
205 {
206     if (rel.reloc.is<ELFRel*>())
207         return 0;
208     else
209         return rel.reloc.get<ELFRela*>()->r_addend;
210 }
211 
212 unsigned
213 ELFRelocation::RelocAddend64(const ELFRelocation &rel)
214 {
215     if (rel.reloc.is<ELFRel*>())
216         return 0;
217     else
218         return rel.reloc.get<ELFRela*>()->r_addend;
219 }
220 
221 } // end anonymous namespace
222 
223 bool
224 ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset)
225 {
226     // Read all fields.
227     if (data.GetU32(offset, &n_namesz, 3) == NULL)
228         return false;
229 
230     // The name field is required to be nul-terminated, and n_namesz
231     // includes the terminating nul in observed implementations (contrary
232     // to the ELF-64 spec).  A special case is needed for cores generated
233     // by some older Linux versions, which write a note named "CORE"
234     // without a nul terminator and n_namesz = 4.
235     if (n_namesz == 4)
236     {
237         char buf[4];
238         if (data.ExtractBytes (*offset, 4, data.GetByteOrder(), buf) != 4)
239             return false;
240         if (strncmp (buf, "CORE", 4) == 0)
241         {
242             n_name = "CORE";
243             *offset += 4;
244             return true;
245         }
246     }
247 
248     const char *cstr = data.GetCStr(offset, llvm::RoundUpToAlignment (n_namesz, 4));
249     if (cstr == NULL)
250     {
251         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS));
252         if (log)
253             log->Printf("Failed to parse note name lacking nul terminator");
254 
255         return false;
256     }
257     n_name = cstr;
258     return true;
259 }
260 
261 // Arbitrary constant used as UUID prefix for core files.
262 const uint32_t
263 ObjectFileELF::g_core_uuid_magic(0xE210C);
264 
265 //------------------------------------------------------------------
266 // Static methods.
267 //------------------------------------------------------------------
268 void
269 ObjectFileELF::Initialize()
270 {
271     PluginManager::RegisterPlugin(GetPluginNameStatic(),
272                                   GetPluginDescriptionStatic(),
273                                   CreateInstance,
274                                   CreateMemoryInstance,
275                                   GetModuleSpecifications);
276 }
277 
278 void
279 ObjectFileELF::Terminate()
280 {
281     PluginManager::UnregisterPlugin(CreateInstance);
282 }
283 
284 lldb_private::ConstString
285 ObjectFileELF::GetPluginNameStatic()
286 {
287     static ConstString g_name("elf");
288     return g_name;
289 }
290 
291 const char *
292 ObjectFileELF::GetPluginDescriptionStatic()
293 {
294     return "ELF object file reader.";
295 }
296 
297 ObjectFile *
298 ObjectFileELF::CreateInstance (const lldb::ModuleSP &module_sp,
299                                DataBufferSP &data_sp,
300                                lldb::offset_t data_offset,
301                                const lldb_private::FileSpec* file,
302                                lldb::offset_t file_offset,
303                                lldb::offset_t length)
304 {
305     if (!data_sp)
306     {
307         data_sp = file->MemoryMapFileContents(file_offset, length);
308         data_offset = 0;
309     }
310 
311     if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
312     {
313         const uint8_t *magic = data_sp->GetBytes() + data_offset;
314         if (ELFHeader::MagicBytesMatch(magic))
315         {
316             // Update the data to contain the entire file if it doesn't already
317             if (data_sp->GetByteSize() < length) {
318                 data_sp = file->MemoryMapFileContents(file_offset, length);
319                 data_offset = 0;
320                 magic = data_sp->GetBytes();
321             }
322             unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
323             if (address_size == 4 || address_size == 8)
324             {
325                 std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, data_offset, file, file_offset, length));
326                 ArchSpec spec;
327                 if (objfile_ap->GetArchitecture(spec) &&
328                     objfile_ap->SetModulesArchitecture(spec))
329                     return objfile_ap.release();
330             }
331         }
332     }
333     return NULL;
334 }
335 
336 
337 ObjectFile*
338 ObjectFileELF::CreateMemoryInstance (const lldb::ModuleSP &module_sp,
339                                      DataBufferSP& data_sp,
340                                      const lldb::ProcessSP &process_sp,
341                                      lldb::addr_t header_addr)
342 {
343     if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT))
344     {
345         const uint8_t *magic = data_sp->GetBytes();
346         if (ELFHeader::MagicBytesMatch(magic))
347         {
348             unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
349             if (address_size == 4 || address_size == 8)
350             {
351                 std::auto_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
352                 ArchSpec spec;
353                 if (objfile_ap->GetArchitecture(spec) &&
354                     objfile_ap->SetModulesArchitecture(spec))
355                     return objfile_ap.release();
356             }
357         }
358     }
359     return NULL;
360 }
361 
362 bool
363 ObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp,
364                                   lldb::addr_t data_offset,
365                                   lldb::addr_t data_length)
366 {
367     if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
368     {
369         const uint8_t *magic = data_sp->GetBytes() + data_offset;
370         return ELFHeader::MagicBytesMatch(magic);
371     }
372     return false;
373 }
374 
375 /*
376  * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
377  *
378  *   COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
379  *   code or tables extracted from it, as desired without restriction.
380  */
381 static uint32_t
382 calc_crc32(uint32_t crc, const void *buf, size_t size)
383 {
384     static const uint32_t g_crc32_tab[] =
385     {
386         0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
387         0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
388         0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
389         0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
390         0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
391         0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
392         0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
393         0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
394         0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
395         0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
396         0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
397         0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
398         0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
399         0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
400         0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
401         0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
402         0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
403         0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
404         0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
405         0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
406         0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
407         0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
408         0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
409         0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
410         0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
411         0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
412         0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
413         0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
414         0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
415         0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
416         0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
417         0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
418         0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
419         0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
420         0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
421         0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
422         0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
423         0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
424         0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
425         0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
426         0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
427         0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
428         0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
429     };
430     const uint8_t *p = (const uint8_t *)buf;
431 
432     crc = crc ^ ~0U;
433     while (size--)
434         crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
435     return crc ^ ~0U;
436 }
437 
438 static uint32_t
439 calc_gnu_debuglink_crc32(const void *buf, size_t size)
440 {
441     return calc_crc32(0U, buf, size);
442 }
443 
444 uint32_t
445 ObjectFileELF::CalculateELFNotesSegmentsCRC32 (const ProgramHeaderColl& program_headers,
446                                                DataExtractor& object_data)
447 {
448     typedef ProgramHeaderCollConstIter Iter;
449 
450     uint32_t core_notes_crc = 0;
451 
452     for (Iter I = program_headers.begin(); I != program_headers.end(); ++I)
453     {
454         if (I->p_type == llvm::ELF::PT_NOTE)
455         {
456             const elf_off ph_offset = I->p_offset;
457             const size_t ph_size = I->p_filesz;
458 
459             DataExtractor segment_data;
460             if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size)
461             {
462                 // The ELF program header contained incorrect data,
463                 // probably corefile is incomplete or corrupted.
464                 break;
465             }
466 
467             core_notes_crc = calc_crc32(core_notes_crc,
468                                         segment_data.GetDataStart(),
469                                         segment_data.GetByteSize());
470         }
471     }
472 
473     return core_notes_crc;
474 }
475 
476 static const char*
477 OSABIAsCString (unsigned char osabi_byte)
478 {
479 #define _MAKE_OSABI_CASE(x) case x: return #x
480     switch (osabi_byte)
481     {
482         _MAKE_OSABI_CASE(ELFOSABI_NONE);
483         _MAKE_OSABI_CASE(ELFOSABI_HPUX);
484         _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
485         _MAKE_OSABI_CASE(ELFOSABI_GNU);
486         _MAKE_OSABI_CASE(ELFOSABI_HURD);
487         _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
488         _MAKE_OSABI_CASE(ELFOSABI_AIX);
489         _MAKE_OSABI_CASE(ELFOSABI_IRIX);
490         _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
491         _MAKE_OSABI_CASE(ELFOSABI_TRU64);
492         _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
493         _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
494         _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
495         _MAKE_OSABI_CASE(ELFOSABI_NSK);
496         _MAKE_OSABI_CASE(ELFOSABI_AROS);
497         _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
498         _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
499         _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
500         _MAKE_OSABI_CASE(ELFOSABI_ARM);
501         _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
502         default:
503             return "<unknown-osabi>";
504     }
505 #undef _MAKE_OSABI_CASE
506 }
507 
508 static bool
509 GetOsFromOSABI (unsigned char osabi_byte, llvm::Triple::OSType &ostype)
510 {
511     switch (osabi_byte)
512     {
513         case ELFOSABI_AIX:      ostype = llvm::Triple::OSType::AIX; break;
514         case ELFOSABI_FREEBSD:  ostype = llvm::Triple::OSType::FreeBSD; break;
515         case ELFOSABI_GNU:      ostype = llvm::Triple::OSType::Linux; break;
516         case ELFOSABI_NETBSD:   ostype = llvm::Triple::OSType::NetBSD; break;
517         case ELFOSABI_OPENBSD:  ostype = llvm::Triple::OSType::OpenBSD; break;
518         case ELFOSABI_SOLARIS:  ostype = llvm::Triple::OSType::Solaris; break;
519         default:
520             ostype = llvm::Triple::OSType::UnknownOS;
521     }
522     return ostype != llvm::Triple::OSType::UnknownOS;
523 }
524 
525 size_t
526 ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec& file,
527                                         lldb::DataBufferSP& data_sp,
528                                         lldb::offset_t data_offset,
529                                         lldb::offset_t file_offset,
530                                         lldb::offset_t length,
531                                         lldb_private::ModuleSpecList &specs)
532 {
533     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
534 
535     const size_t initial_count = specs.GetSize();
536 
537     if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize()))
538     {
539         DataExtractor data;
540         data.SetData(data_sp);
541         elf::ELFHeader header;
542         if (header.Parse(data, &data_offset))
543         {
544             if (data_sp)
545             {
546                 ModuleSpec spec;
547                 spec.GetFileSpec() = file;
548                 spec.GetArchitecture().SetArchitecture(eArchTypeELF,
549                                                        header.e_machine,
550                                                        LLDB_INVALID_CPUTYPE);
551                 if (spec.GetArchitecture().IsValid())
552                 {
553                     llvm::Triple::OSType ostype;
554                     // First try to determine the OS type from the OSABI field in the elf header.
555 
556                     if (log)
557                         log->Printf ("ObjectFileELF::%s file '%s' module OSABI: %s", __FUNCTION__, file.GetPath ().c_str (), OSABIAsCString (header.e_ident[EI_OSABI]));
558                     if (GetOsFromOSABI (header.e_ident[EI_OSABI], ostype) && ostype != llvm::Triple::OSType::UnknownOS)
559                     {
560                         spec.GetArchitecture ().GetTriple ().setOS (ostype);
561 
562                         // Also clear the vendor so we don't end up with situations like
563                         // x86_64-apple-FreeBSD.
564                         spec.GetArchitecture ().GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
565 
566                         if (log)
567                             log->Printf ("ObjectFileELF::%s file '%s' set ELF module OS type from ELF header OSABI.", __FUNCTION__, file.GetPath ().c_str ());
568                     }
569 
570                     // Try to get the UUID from the section list. Usually that's at the end, so
571                     // map the file in if we don't have it already.
572                     size_t section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize;
573                     if (section_header_end > data_sp->GetByteSize())
574                     {
575                         data_sp = file.MemoryMapFileContents (file_offset, section_header_end);
576                         data.SetData(data_sp);
577                     }
578 
579                     uint32_t gnu_debuglink_crc = 0;
580                     std::string gnu_debuglink_file;
581                     SectionHeaderColl section_headers;
582                     lldb_private::UUID &uuid = spec.GetUUID();
583 
584                     GetSectionHeaderInfo(section_headers, data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc, spec.GetArchitecture ());
585 
586                     // If the module vendor is not set and the module OS matches this host OS, set the module vendor to the host vendor.
587                     llvm::Triple &spec_triple = spec.GetArchitecture ().GetTriple ();
588                     if (spec_triple.getVendor () == llvm::Triple::VendorType::UnknownVendor)
589                     {
590                         const llvm::Triple &host_triple = HostInfo::GetArchitecture().GetTriple();
591                         if (spec_triple.getOS () == host_triple.getOS ())
592                             spec_triple.setVendor (host_triple.getVendor ());
593                     }
594 
595                     if (log)
596                         log->Printf ("ObjectFileELF::%s file '%s' module set to triple: %s (architecture %s)", __FUNCTION__, file.GetPath ().c_str (), spec_triple.getTriple ().c_str (), spec.GetArchitecture ().GetArchitectureName ());
597 
598                     if (!uuid.IsValid())
599                     {
600                         uint32_t core_notes_crc = 0;
601 
602                         if (!gnu_debuglink_crc)
603                         {
604                             lldb_private::Timer scoped_timer (__PRETTY_FUNCTION__,
605                                                               "Calculating module crc32 %s with size %" PRIu64 " KiB",
606                                                               file.GetLastPathComponent().AsCString(),
607                                                               (file.GetByteSize()-file_offset)/1024);
608 
609                             // For core files - which usually don't happen to have a gnu_debuglink,
610                             // and are pretty bulky - calculating whole contents crc32 would be too much of luxury.
611                             // Thus we will need to fallback to something simpler.
612                             if (header.e_type == llvm::ELF::ET_CORE)
613                             {
614                                 size_t program_headers_end = header.e_phoff + header.e_phnum * header.e_phentsize;
615                                 if (program_headers_end > data_sp->GetByteSize())
616                                 {
617                                     data_sp = file.MemoryMapFileContents(file_offset, program_headers_end);
618                                     data.SetData(data_sp);
619                                 }
620                                 ProgramHeaderColl program_headers;
621                                 GetProgramHeaderInfo(program_headers, data, header);
622 
623                                 size_t segment_data_end = 0;
624                                 for (ProgramHeaderCollConstIter I = program_headers.begin();
625                                      I != program_headers.end(); ++I)
626                                 {
627                                      segment_data_end = std::max<unsigned long long> (I->p_offset + I->p_filesz, segment_data_end);
628                                 }
629 
630                                 if (segment_data_end > data_sp->GetByteSize())
631                                 {
632                                     data_sp = file.MemoryMapFileContents(file_offset, segment_data_end);
633                                     data.SetData(data_sp);
634                                 }
635 
636                                 core_notes_crc = CalculateELFNotesSegmentsCRC32 (program_headers, data);
637                             }
638                             else
639                             {
640                                 // Need to map entire file into memory to calculate the crc.
641                                 data_sp = file.MemoryMapFileContents (file_offset, SIZE_MAX);
642                                 data.SetData(data_sp);
643                                 gnu_debuglink_crc = calc_gnu_debuglink_crc32 (data.GetDataStart(), data.GetByteSize());
644                             }
645                         }
646                         if (gnu_debuglink_crc)
647                         {
648                             // Use 4 bytes of crc from the .gnu_debuglink section.
649                             uint32_t uuidt[4] = { gnu_debuglink_crc, 0, 0, 0 };
650                             uuid.SetBytes (uuidt, sizeof(uuidt));
651                         }
652                         else if (core_notes_crc)
653                         {
654                             // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it look different form
655                             // .gnu_debuglink crc followed by 4 bytes of note segments crc.
656                             uint32_t uuidt[4] = { g_core_uuid_magic, core_notes_crc, 0, 0 };
657                             uuid.SetBytes (uuidt, sizeof(uuidt));
658                         }
659                     }
660 
661                     specs.Append(spec);
662                 }
663             }
664         }
665     }
666 
667     return specs.GetSize() - initial_count;
668 }
669 
670 //------------------------------------------------------------------
671 // PluginInterface protocol
672 //------------------------------------------------------------------
673 lldb_private::ConstString
674 ObjectFileELF::GetPluginName()
675 {
676     return GetPluginNameStatic();
677 }
678 
679 uint32_t
680 ObjectFileELF::GetPluginVersion()
681 {
682     return m_plugin_version;
683 }
684 //------------------------------------------------------------------
685 // ObjectFile protocol
686 //------------------------------------------------------------------
687 
688 ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
689                               DataBufferSP& data_sp,
690                               lldb::offset_t data_offset,
691                               const FileSpec* file,
692                               lldb::offset_t file_offset,
693                               lldb::offset_t length) :
694     ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
695     m_header(),
696     m_uuid(),
697     m_gnu_debuglink_file(),
698     m_gnu_debuglink_crc(0),
699     m_program_headers(),
700     m_section_headers(),
701     m_dynamic_symbols(),
702     m_filespec_ap(),
703     m_entry_point_address(),
704     m_arch_spec()
705 {
706     if (file)
707         m_file = *file;
708     ::memset(&m_header, 0, sizeof(m_header));
709 }
710 
711 ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
712                               DataBufferSP& data_sp,
713                               const lldb::ProcessSP &process_sp,
714                               addr_t header_addr) :
715     ObjectFile(module_sp, process_sp, LLDB_INVALID_ADDRESS, data_sp),
716     m_header(),
717     m_uuid(),
718     m_gnu_debuglink_file(),
719     m_gnu_debuglink_crc(0),
720     m_program_headers(),
721     m_section_headers(),
722     m_dynamic_symbols(),
723     m_filespec_ap(),
724     m_entry_point_address(),
725     m_arch_spec()
726 {
727     ::memset(&m_header, 0, sizeof(m_header));
728 }
729 
730 ObjectFileELF::~ObjectFileELF()
731 {
732 }
733 
734 bool
735 ObjectFileELF::IsExecutable() const
736 {
737     return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
738 }
739 
740 bool
741 ObjectFileELF::SetLoadAddress (Target &target,
742                                lldb::addr_t value,
743                                bool value_is_offset)
744 {
745     ModuleSP module_sp = GetModule();
746     if (module_sp)
747     {
748         size_t num_loaded_sections = 0;
749         SectionList *section_list = GetSectionList ();
750         if (section_list)
751         {
752             if (value_is_offset)
753             {
754                 const size_t num_sections = section_list->GetSize();
755                 size_t sect_idx = 0;
756 
757                 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
758                 {
759                     // Iterate through the object file sections to find all
760                     // of the sections that have SHF_ALLOC in their flag bits.
761                     SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
762                     // if (section_sp && !section_sp->IsThreadSpecific())
763                     if (section_sp && section_sp->Test(SHF_ALLOC))
764                     {
765                         if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + value))
766                             ++num_loaded_sections;
767                     }
768                 }
769                 return num_loaded_sections > 0;
770             }
771             else
772             {
773                 // Not sure how to slide an ELF file given the base address
774                 // of the ELF file in memory
775             }
776         }
777     }
778     return false; // If it changed
779 }
780 
781 ByteOrder
782 ObjectFileELF::GetByteOrder() const
783 {
784     if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
785         return eByteOrderBig;
786     if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
787         return eByteOrderLittle;
788     return eByteOrderInvalid;
789 }
790 
791 uint32_t
792 ObjectFileELF::GetAddressByteSize() const
793 {
794     return m_data.GetAddressByteSize();
795 }
796 
797 size_t
798 ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I)
799 {
800     return std::distance(m_section_headers.begin(), I) + 1u;
801 }
802 
803 size_t
804 ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const
805 {
806     return std::distance(m_section_headers.begin(), I) + 1u;
807 }
808 
809 bool
810 ObjectFileELF::ParseHeader()
811 {
812     lldb::offset_t offset = 0;
813     return m_header.Parse(m_data, &offset);
814 }
815 
816 bool
817 ObjectFileELF::GetUUID(lldb_private::UUID* uuid)
818 {
819     // Need to parse the section list to get the UUIDs, so make sure that's been done.
820     if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
821         return false;
822 
823     if (m_uuid.IsValid())
824     {
825         // We have the full build id uuid.
826         *uuid = m_uuid;
827         return true;
828     }
829     else if (GetType() == ObjectFile::eTypeCoreFile)
830     {
831         uint32_t core_notes_crc = 0;
832 
833         if (!ParseProgramHeaders())
834             return false;
835 
836         core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
837 
838         if (core_notes_crc)
839         {
840             // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
841             // look different form .gnu_debuglink crc - followed by 4 bytes of note
842             // segments crc.
843             uint32_t uuidt[4] = { g_core_uuid_magic, core_notes_crc, 0, 0 };
844             m_uuid.SetBytes (uuidt, sizeof(uuidt));
845         }
846     }
847     else
848     {
849         if (!m_gnu_debuglink_crc)
850             m_gnu_debuglink_crc = calc_gnu_debuglink_crc32 (m_data.GetDataStart(), m_data.GetByteSize());
851         if (m_gnu_debuglink_crc)
852         {
853             // Use 4 bytes of crc from the .gnu_debuglink section.
854             uint32_t uuidt[4] = { m_gnu_debuglink_crc, 0, 0, 0 };
855             m_uuid.SetBytes (uuidt, sizeof(uuidt));
856         }
857     }
858 
859     if (m_uuid.IsValid())
860     {
861         *uuid = m_uuid;
862         return true;
863     }
864 
865     return false;
866 }
867 
868 lldb_private::FileSpecList
869 ObjectFileELF::GetDebugSymbolFilePaths()
870 {
871     FileSpecList file_spec_list;
872 
873     if (!m_gnu_debuglink_file.empty())
874     {
875         FileSpec file_spec (m_gnu_debuglink_file.c_str(), false);
876         file_spec_list.Append (file_spec);
877     }
878     return file_spec_list;
879 }
880 
881 uint32_t
882 ObjectFileELF::GetDependentModules(FileSpecList &files)
883 {
884     size_t num_modules = ParseDependentModules();
885     uint32_t num_specs = 0;
886 
887     for (unsigned i = 0; i < num_modules; ++i)
888     {
889         if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i)))
890             num_specs++;
891     }
892 
893     return num_specs;
894 }
895 
896 Address
897 ObjectFileELF::GetImageInfoAddress(Target *target)
898 {
899     if (!ParseDynamicSymbols())
900         return Address();
901 
902     SectionList *section_list = GetSectionList();
903     if (!section_list)
904         return Address();
905 
906     // Find the SHT_DYNAMIC (.dynamic) section.
907     SectionSP dynsym_section_sp (section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true));
908     if (!dynsym_section_sp)
909         return Address();
910     assert (dynsym_section_sp->GetObjectFile() == this);
911 
912     user_id_t dynsym_id = dynsym_section_sp->GetID();
913     const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
914     if (!dynsym_hdr)
915         return Address();
916 
917     for (size_t i = 0; i < m_dynamic_symbols.size(); ++i)
918     {
919         ELFDynamic &symbol = m_dynamic_symbols[i];
920 
921         if (symbol.d_tag == DT_DEBUG)
922         {
923             // Compute the offset as the number of previous entries plus the
924             // size of d_tag.
925             addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
926             return Address(dynsym_section_sp, offset);
927         }
928         else if (symbol.d_tag == DT_MIPS_RLD_MAP && target)
929         {
930             addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
931             addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
932             if (dyn_base == LLDB_INVALID_ADDRESS)
933                 return Address();
934             Address addr;
935             Error error;
936             if (target->ReadPointerFromMemory(dyn_base + offset, false, error, addr))
937                 return addr;
938         }
939     }
940 
941     return Address();
942 }
943 
944 lldb_private::Address
945 ObjectFileELF::GetEntryPointAddress ()
946 {
947     if (m_entry_point_address.IsValid())
948         return m_entry_point_address;
949 
950     if (!ParseHeader() || !IsExecutable())
951         return m_entry_point_address;
952 
953     SectionList *section_list = GetSectionList();
954     addr_t offset = m_header.e_entry;
955 
956     if (!section_list)
957         m_entry_point_address.SetOffset(offset);
958     else
959         m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
960     return m_entry_point_address;
961 }
962 
963 //----------------------------------------------------------------------
964 // ParseDependentModules
965 //----------------------------------------------------------------------
966 size_t
967 ObjectFileELF::ParseDependentModules()
968 {
969     if (m_filespec_ap.get())
970         return m_filespec_ap->GetSize();
971 
972     m_filespec_ap.reset(new FileSpecList());
973 
974     if (!ParseSectionHeaders())
975         return 0;
976 
977     SectionList *section_list = GetSectionList();
978     if (!section_list)
979         return 0;
980 
981     // Find the SHT_DYNAMIC section.
982     Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
983     if (!dynsym)
984         return 0;
985     assert (dynsym->GetObjectFile() == this);
986 
987     const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex (dynsym->GetID());
988     if (!header)
989         return 0;
990     // sh_link: section header index of string table used by entries in the section.
991     Section *dynstr = section_list->FindSectionByID (header->sh_link + 1).get();
992     if (!dynstr)
993         return 0;
994 
995     DataExtractor dynsym_data;
996     DataExtractor dynstr_data;
997     if (ReadSectionData(dynsym, dynsym_data) &&
998         ReadSectionData(dynstr, dynstr_data))
999     {
1000         ELFDynamic symbol;
1001         const lldb::offset_t section_size = dynsym_data.GetByteSize();
1002         lldb::offset_t offset = 0;
1003 
1004         // The only type of entries we are concerned with are tagged DT_NEEDED,
1005         // yielding the name of a required library.
1006         while (offset < section_size)
1007         {
1008             if (!symbol.Parse(dynsym_data, &offset))
1009                 break;
1010 
1011             if (symbol.d_tag != DT_NEEDED)
1012                 continue;
1013 
1014             uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1015             const char *lib_name = dynstr_data.PeekCStr(str_index);
1016             m_filespec_ap->Append(FileSpec(lib_name, true));
1017         }
1018     }
1019 
1020     return m_filespec_ap->GetSize();
1021 }
1022 
1023 //----------------------------------------------------------------------
1024 // GetProgramHeaderInfo
1025 //----------------------------------------------------------------------
1026 size_t
1027 ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
1028                                     DataExtractor &object_data,
1029                                     const ELFHeader &header)
1030 {
1031     // We have already parsed the program headers
1032     if (!program_headers.empty())
1033         return program_headers.size();
1034 
1035     // If there are no program headers to read we are done.
1036     if (header.e_phnum == 0)
1037         return 0;
1038 
1039     program_headers.resize(header.e_phnum);
1040     if (program_headers.size() != header.e_phnum)
1041         return 0;
1042 
1043     const size_t ph_size = header.e_phnum * header.e_phentsize;
1044     const elf_off ph_offset = header.e_phoff;
1045     DataExtractor data;
1046     if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
1047         return 0;
1048 
1049     uint32_t idx;
1050     lldb::offset_t offset;
1051     for (idx = 0, offset = 0; idx < header.e_phnum; ++idx)
1052     {
1053         if (program_headers[idx].Parse(data, &offset) == false)
1054             break;
1055     }
1056 
1057     if (idx < program_headers.size())
1058         program_headers.resize(idx);
1059 
1060     return program_headers.size();
1061 
1062 }
1063 
1064 //----------------------------------------------------------------------
1065 // ParseProgramHeaders
1066 //----------------------------------------------------------------------
1067 size_t
1068 ObjectFileELF::ParseProgramHeaders()
1069 {
1070     return GetProgramHeaderInfo(m_program_headers, m_data, m_header);
1071 }
1072 
1073 lldb_private::Error
1074 ObjectFileELF::RefineModuleDetailsFromNote (lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch_spec, lldb_private::UUID &uuid)
1075 {
1076     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1077     Error error;
1078 
1079     lldb::offset_t offset = 0;
1080 
1081     while (true)
1082     {
1083         // Parse the note header.  If this fails, bail out.
1084         ELFNote note = ELFNote();
1085         if (!note.Parse(data, &offset))
1086         {
1087             // We're done.
1088             return error;
1089         }
1090 
1091         // If a tag processor handles the tag, it should set processed to true, and
1092         // the loop will assume the tag processing has moved entirely past the note's payload.
1093         // Otherwise, leave it false and the end of the loop will handle the offset properly.
1094         bool processed = false;
1095 
1096         if (log)
1097             log->Printf ("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32, __FUNCTION__, note.n_name.c_str (), note.n_type);
1098 
1099         // Process FreeBSD ELF notes.
1100         if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1101             (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1102             (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE))
1103         {
1104             // We'll consume the payload below.
1105             processed = true;
1106 
1107             // Pull out the min version info.
1108             uint32_t version_info;
1109             if (data.GetU32 (&offset, &version_info, 1) == nullptr)
1110             {
1111                 error.SetErrorString ("failed to read FreeBSD ABI note payload");
1112                 return error;
1113             }
1114 
1115             // Convert the version info into a major/minor number.
1116             const uint32_t version_major = version_info / 100000;
1117             const uint32_t version_minor = (version_info / 1000) % 100;
1118 
1119             char os_name[32];
1120             snprintf (os_name, sizeof (os_name), "freebsd%" PRIu32 ".%" PRIu32, version_major, version_minor);
1121 
1122             // Set the elf OS version to FreeBSD.  Also clear the vendor.
1123             arch_spec.GetTriple ().setOSName (os_name);
1124             arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1125 
1126             if (log)
1127                 log->Printf ("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_major, version_minor, static_cast<uint32_t> (version_info % 1000));
1128         }
1129         // Process GNU ELF notes.
1130         else if (note.n_name == LLDB_NT_OWNER_GNU)
1131         {
1132             switch (note.n_type)
1133             {
1134                 case LLDB_NT_GNU_ABI_TAG:
1135                     if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE)
1136                     {
1137                         // We'll consume the payload below.
1138                         processed = true;
1139 
1140                         // Pull out the min OS version supporting the ABI.
1141                         uint32_t version_info[4];
1142                         if (data.GetU32 (&offset, &version_info[0], note.n_descsz / 4) == nullptr)
1143                         {
1144                             error.SetErrorString ("failed to read GNU ABI note payload");
1145                             return error;
1146                         }
1147 
1148                         // Set the OS per the OS field.
1149                         switch (version_info[0])
1150                         {
1151                             case LLDB_NT_GNU_ABI_OS_LINUX:
1152                                 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::Linux);
1153                                 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1154                                 if (log)
1155                                     log->Printf ("ObjectFileELF::%s detected Linux, min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1156                                 // FIXME we have the minimal version number, we could be propagating that.  version_info[1] = OS Major, version_info[2] = OS Minor, version_info[3] = Revision.
1157                                 break;
1158                             case LLDB_NT_GNU_ABI_OS_HURD:
1159                                 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::UnknownOS);
1160                                 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1161                                 if (log)
1162                                     log->Printf ("ObjectFileELF::%s detected Hurd (unsupported), min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1163                                 break;
1164                             case LLDB_NT_GNU_ABI_OS_SOLARIS:
1165                                 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::Solaris);
1166                                 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1167                                 if (log)
1168                                     log->Printf ("ObjectFileELF::%s detected Solaris, min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1169                                 break;
1170                             default:
1171                                 if (log)
1172                                     log->Printf ("ObjectFileELF::%s unrecognized OS in note, id %" PRIu32 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[0], version_info[1], version_info[2], version_info[3]);
1173                                 break;
1174                         }
1175                     }
1176                     break;
1177 
1178                 case LLDB_NT_GNU_BUILD_ID_TAG:
1179                     // Only bother processing this if we don't already have the uuid set.
1180                     if (!uuid.IsValid())
1181                     {
1182                         // We'll consume the payload below.
1183                         processed = true;
1184 
1185                         // 16 bytes is UUID|MD5, 20 bytes is SHA1
1186                         if ((note.n_descsz == 16 || note.n_descsz == 20))
1187                         {
1188                             uint8_t uuidbuf[20];
1189                             if (data.GetU8 (&offset, &uuidbuf, note.n_descsz) == nullptr)
1190                             {
1191                                 error.SetErrorString ("failed to read GNU_BUILD_ID note payload");
1192                                 return error;
1193                             }
1194 
1195                             // Save the build id as the UUID for the module.
1196                             uuid.SetBytes (uuidbuf, note.n_descsz);
1197                         }
1198                     }
1199                     break;
1200             }
1201         }
1202         // Process NetBSD ELF notes.
1203         else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
1204                  (note.n_type == LLDB_NT_NETBSD_ABI_TAG) &&
1205                  (note.n_descsz == LLDB_NT_NETBSD_ABI_SIZE))
1206         {
1207 
1208             // We'll consume the payload below.
1209             processed = true;
1210 
1211             // Pull out the min version info.
1212             uint32_t version_info;
1213             if (data.GetU32 (&offset, &version_info, 1) == nullptr)
1214             {
1215                 error.SetErrorString ("failed to read NetBSD ABI note payload");
1216                 return error;
1217             }
1218 
1219             // Set the elf OS version to NetBSD.  Also clear the vendor.
1220             arch_spec.GetTriple ().setOS (llvm::Triple::OSType::NetBSD);
1221             arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1222 
1223             if (log)
1224                 log->Printf ("ObjectFileELF::%s detected NetBSD, min version constant %" PRIu32, __FUNCTION__, version_info);
1225         }
1226         // Process CSR kalimba notes
1227         else if ((note.n_type == LLDB_NT_GNU_ABI_TAG) &&
1228                 (note.n_name == LLDB_NT_OWNER_CSR))
1229         {
1230             // We'll consume the payload below.
1231             processed = true;
1232             arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1233             arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::CSR);
1234 
1235             // TODO At some point the description string could be processed.
1236             // It could provide a steer towards the kalimba variant which
1237             // this ELF targets.
1238             if(note.n_descsz)
1239             {
1240                 const char *cstr = data.GetCStr(&offset, llvm::RoundUpToAlignment (note.n_descsz, 4));
1241                 (void)cstr;
1242             }
1243         }
1244 
1245         if (!processed)
1246             offset += llvm::RoundUpToAlignment(note.n_descsz, 4);
1247     }
1248 
1249     return error;
1250 }
1251 
1252 
1253 //----------------------------------------------------------------------
1254 // GetSectionHeaderInfo
1255 //----------------------------------------------------------------------
1256 size_t
1257 ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
1258                                     lldb_private::DataExtractor &object_data,
1259                                     const elf::ELFHeader &header,
1260                                     lldb_private::UUID &uuid,
1261                                     std::string &gnu_debuglink_file,
1262                                     uint32_t &gnu_debuglink_crc,
1263                                     ArchSpec &arch_spec)
1264 {
1265     // Don't reparse the section headers if we already did that.
1266     if (!section_headers.empty())
1267         return section_headers.size();
1268 
1269     // Only initialize the arch_spec to okay defaults if they're not already set.
1270     // We'll refine this with note data as we parse the notes.
1271     if (arch_spec.GetTriple ().getOS () == llvm::Triple::OSType::UnknownOS)
1272     {
1273         arch_spec.SetArchitecture (eArchTypeELF, header.e_machine, LLDB_INVALID_CPUTYPE);
1274         switch (arch_spec.GetAddressByteSize())
1275         {
1276         case 4:
1277             {
1278                 const ArchSpec host_arch32 = HostInfo::GetArchitecture(HostInfo::eArchKind32);
1279                 if (host_arch32.GetCore() == arch_spec.GetCore())
1280                 {
1281                     arch_spec.GetTriple().setOSName(HostInfo::GetOSString().data());
1282                     arch_spec.GetTriple().setVendorName(HostInfo::GetVendorString().data());
1283                 }
1284             }
1285             break;
1286         case 8:
1287             {
1288                 const ArchSpec host_arch64 = HostInfo::GetArchitecture(HostInfo::eArchKind64);
1289                 if (host_arch64.GetCore() == arch_spec.GetCore())
1290                 {
1291                     arch_spec.GetTriple().setOSName(HostInfo::GetOSString().data());
1292                     arch_spec.GetTriple().setVendorName(HostInfo::GetVendorString().data());
1293                 }
1294             }
1295             break;
1296         }
1297     }
1298 
1299     // If there are no section headers we are done.
1300     if (header.e_shnum == 0)
1301         return 0;
1302 
1303     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1304 
1305     section_headers.resize(header.e_shnum);
1306     if (section_headers.size() != header.e_shnum)
1307         return 0;
1308 
1309     const size_t sh_size = header.e_shnum * header.e_shentsize;
1310     const elf_off sh_offset = header.e_shoff;
1311     DataExtractor sh_data;
1312     if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size)
1313         return 0;
1314 
1315     uint32_t idx;
1316     lldb::offset_t offset;
1317     for (idx = 0, offset = 0; idx < header.e_shnum; ++idx)
1318     {
1319         if (section_headers[idx].Parse(sh_data, &offset) == false)
1320             break;
1321     }
1322     if (idx < section_headers.size())
1323         section_headers.resize(idx);
1324 
1325     const unsigned strtab_idx = header.e_shstrndx;
1326     if (strtab_idx && strtab_idx < section_headers.size())
1327     {
1328         const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1329         const size_t byte_size = sheader.sh_size;
1330         const Elf64_Off offset = sheader.sh_offset;
1331         lldb_private::DataExtractor shstr_data;
1332 
1333         if (shstr_data.SetData (object_data, offset, byte_size) == byte_size)
1334         {
1335             for (SectionHeaderCollIter I = section_headers.begin();
1336                  I != section_headers.end(); ++I)
1337             {
1338                 static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink");
1339                 const ELFSectionHeaderInfo &header = *I;
1340                 const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1341                 ConstString name(shstr_data.PeekCStr(I->sh_name));
1342 
1343                 I->section_name = name;
1344 
1345                 if (name == g_sect_name_gnu_debuglink)
1346                 {
1347                     DataExtractor data;
1348                     if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
1349                     {
1350                         lldb::offset_t gnu_debuglink_offset = 0;
1351                         gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset);
1352                         gnu_debuglink_offset = llvm::RoundUpToAlignment (gnu_debuglink_offset, 4);
1353                         data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1354                     }
1355                 }
1356 
1357                 // Process ELF note section entries.
1358                 if (header.sh_type == SHT_NOTE)
1359                 {
1360                     // Allow notes to refine module info.
1361                     DataExtractor data;
1362                     if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
1363                     {
1364                         Error error = RefineModuleDetailsFromNote (data, arch_spec, uuid);
1365                         if (error.Fail ())
1366                         {
1367                             if (log)
1368                                 log->Printf ("ObjectFileELF::%s ELF note processing failed: %s", __FUNCTION__, error.AsCString ());
1369                         }
1370                     }
1371                 }
1372             }
1373 
1374             return section_headers.size();
1375         }
1376     }
1377 
1378     section_headers.clear();
1379     return 0;
1380 }
1381 
1382 size_t
1383 ObjectFileELF::GetProgramHeaderCount()
1384 {
1385     return ParseProgramHeaders();
1386 }
1387 
1388 const elf::ELFProgramHeader *
1389 ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id)
1390 {
1391     if (!id || !ParseProgramHeaders())
1392         return NULL;
1393 
1394     if (--id < m_program_headers.size())
1395         return &m_program_headers[id];
1396 
1397     return NULL;
1398 }
1399 
1400 DataExtractor
1401 ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id)
1402 {
1403     const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id);
1404     if (segment_header == NULL)
1405         return DataExtractor();
1406     return DataExtractor(m_data, segment_header->p_offset, segment_header->p_filesz);
1407 }
1408 
1409 //----------------------------------------------------------------------
1410 // ParseSectionHeaders
1411 //----------------------------------------------------------------------
1412 size_t
1413 ObjectFileELF::ParseSectionHeaders()
1414 {
1415     return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, m_gnu_debuglink_file, m_gnu_debuglink_crc, m_arch_spec);
1416 }
1417 
1418 const ObjectFileELF::ELFSectionHeaderInfo *
1419 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id)
1420 {
1421     if (!id || !ParseSectionHeaders())
1422         return NULL;
1423 
1424     if (--id < m_section_headers.size())
1425         return &m_section_headers[id];
1426 
1427     return NULL;
1428 }
1429 
1430 void
1431 ObjectFileELF::CreateSections(SectionList &unified_section_list)
1432 {
1433     if (!m_sections_ap.get() && ParseSectionHeaders())
1434     {
1435         m_sections_ap.reset(new SectionList());
1436 
1437         for (SectionHeaderCollIter I = m_section_headers.begin();
1438              I != m_section_headers.end(); ++I)
1439         {
1440             const ELFSectionHeaderInfo &header = *I;
1441 
1442             ConstString& name = I->section_name;
1443             const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1444             const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
1445 
1446             static ConstString g_sect_name_text (".text");
1447             static ConstString g_sect_name_data (".data");
1448             static ConstString g_sect_name_bss (".bss");
1449             static ConstString g_sect_name_tdata (".tdata");
1450             static ConstString g_sect_name_tbss (".tbss");
1451             static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev");
1452             static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges");
1453             static ConstString g_sect_name_dwarf_debug_frame (".debug_frame");
1454             static ConstString g_sect_name_dwarf_debug_info (".debug_info");
1455             static ConstString g_sect_name_dwarf_debug_line (".debug_line");
1456             static ConstString g_sect_name_dwarf_debug_loc (".debug_loc");
1457             static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo");
1458             static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames");
1459             static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes");
1460             static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges");
1461             static ConstString g_sect_name_dwarf_debug_str (".debug_str");
1462             static ConstString g_sect_name_eh_frame (".eh_frame");
1463 
1464             SectionType sect_type = eSectionTypeOther;
1465 
1466             bool is_thread_specific = false;
1467 
1468             if      (name == g_sect_name_text)                  sect_type = eSectionTypeCode;
1469             else if (name == g_sect_name_data)                  sect_type = eSectionTypeData;
1470             else if (name == g_sect_name_bss)                   sect_type = eSectionTypeZeroFill;
1471             else if (name == g_sect_name_tdata)
1472             {
1473                 sect_type = eSectionTypeData;
1474                 is_thread_specific = true;
1475             }
1476             else if (name == g_sect_name_tbss)
1477             {
1478                 sect_type = eSectionTypeZeroFill;
1479                 is_thread_specific = true;
1480             }
1481             // .debug_abbrev – Abbreviations used in the .debug_info section
1482             // .debug_aranges – Lookup table for mapping addresses to compilation units
1483             // .debug_frame – Call frame information
1484             // .debug_info – The core DWARF information section
1485             // .debug_line – Line number information
1486             // .debug_loc – Location lists used in DW_AT_location attributes
1487             // .debug_macinfo – Macro information
1488             // .debug_pubnames – Lookup table for mapping object and function names to compilation units
1489             // .debug_pubtypes – Lookup table for mapping type names to compilation units
1490             // .debug_ranges – Address ranges used in DW_AT_ranges attributes
1491             // .debug_str – String table used in .debug_info
1492             // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
1493             // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
1494             // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
1495             else if (name == g_sect_name_dwarf_debug_abbrev)    sect_type = eSectionTypeDWARFDebugAbbrev;
1496             else if (name == g_sect_name_dwarf_debug_aranges)   sect_type = eSectionTypeDWARFDebugAranges;
1497             else if (name == g_sect_name_dwarf_debug_frame)     sect_type = eSectionTypeDWARFDebugFrame;
1498             else if (name == g_sect_name_dwarf_debug_info)      sect_type = eSectionTypeDWARFDebugInfo;
1499             else if (name == g_sect_name_dwarf_debug_line)      sect_type = eSectionTypeDWARFDebugLine;
1500             else if (name == g_sect_name_dwarf_debug_loc)       sect_type = eSectionTypeDWARFDebugLoc;
1501             else if (name == g_sect_name_dwarf_debug_macinfo)   sect_type = eSectionTypeDWARFDebugMacInfo;
1502             else if (name == g_sect_name_dwarf_debug_pubnames)  sect_type = eSectionTypeDWARFDebugPubNames;
1503             else if (name == g_sect_name_dwarf_debug_pubtypes)  sect_type = eSectionTypeDWARFDebugPubTypes;
1504             else if (name == g_sect_name_dwarf_debug_ranges)    sect_type = eSectionTypeDWARFDebugRanges;
1505             else if (name == g_sect_name_dwarf_debug_str)       sect_type = eSectionTypeDWARFDebugStr;
1506             else if (name == g_sect_name_eh_frame)              sect_type = eSectionTypeEHFrame;
1507 
1508             switch (header.sh_type)
1509             {
1510                 case SHT_SYMTAB:
1511                     assert (sect_type == eSectionTypeOther);
1512                     sect_type = eSectionTypeELFSymbolTable;
1513                     break;
1514                 case SHT_DYNSYM:
1515                     assert (sect_type == eSectionTypeOther);
1516                     sect_type = eSectionTypeELFDynamicSymbols;
1517                     break;
1518                 case SHT_RELA:
1519                 case SHT_REL:
1520                     assert (sect_type == eSectionTypeOther);
1521                     sect_type = eSectionTypeELFRelocationEntries;
1522                     break;
1523                 case SHT_DYNAMIC:
1524                     assert (sect_type == eSectionTypeOther);
1525                     sect_type = eSectionTypeELFDynamicLinkInfo;
1526                     break;
1527             }
1528 
1529             elf::elf_xword log2align = (header.sh_addralign==0)
1530                                         ? 0
1531                                         : llvm::Log2_64(header.sh_addralign);
1532             SectionSP section_sp (new Section(GetModule(),        // Module to which this section belongs.
1533                                               this,               // ObjectFile to which this section belongs and should read section data from.
1534                                               SectionIndex(I),    // Section ID.
1535                                               name,               // Section name.
1536                                               sect_type,          // Section type.
1537                                               header.sh_addr,     // VM address.
1538                                               vm_size,            // VM size in bytes of this section.
1539                                               header.sh_offset,   // Offset of this section in the file.
1540                                               file_size,          // Size of the section as found in the file.
1541                                               log2align,          // Alignment of the section
1542                                               header.sh_flags));  // Flags for this section.
1543 
1544             if (is_thread_specific)
1545                 section_sp->SetIsThreadSpecific (is_thread_specific);
1546             m_sections_ap->AddSection(section_sp);
1547         }
1548     }
1549 
1550     if (m_sections_ap.get())
1551     {
1552         if (GetType() == eTypeDebugInfo)
1553         {
1554             static const SectionType g_sections[] =
1555             {
1556                 eSectionTypeDWARFDebugAranges,
1557                 eSectionTypeDWARFDebugInfo,
1558                 eSectionTypeDWARFDebugAbbrev,
1559                 eSectionTypeDWARFDebugFrame,
1560                 eSectionTypeDWARFDebugLine,
1561                 eSectionTypeDWARFDebugStr,
1562                 eSectionTypeDWARFDebugLoc,
1563                 eSectionTypeDWARFDebugMacInfo,
1564                 eSectionTypeDWARFDebugPubNames,
1565                 eSectionTypeDWARFDebugPubTypes,
1566                 eSectionTypeDWARFDebugRanges,
1567                 eSectionTypeELFSymbolTable,
1568             };
1569             SectionList *elf_section_list = m_sections_ap.get();
1570             for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx)
1571             {
1572                 SectionType section_type = g_sections[idx];
1573                 SectionSP section_sp (elf_section_list->FindSectionByType (section_type, true));
1574                 if (section_sp)
1575                 {
1576                     SectionSP module_section_sp (unified_section_list.FindSectionByType (section_type, true));
1577                     if (module_section_sp)
1578                         unified_section_list.ReplaceSection (module_section_sp->GetID(), section_sp);
1579                     else
1580                         unified_section_list.AddSection (section_sp);
1581                 }
1582             }
1583         }
1584         else
1585         {
1586             unified_section_list = *m_sections_ap;
1587         }
1588     }
1589 }
1590 
1591 // private
1592 unsigned
1593 ObjectFileELF::ParseSymbols (Symtab *symtab,
1594                              user_id_t start_id,
1595                              SectionList *section_list,
1596                              const size_t num_symbols,
1597                              const DataExtractor &symtab_data,
1598                              const DataExtractor &strtab_data)
1599 {
1600     ELFSymbol symbol;
1601     lldb::offset_t offset = 0;
1602 
1603     static ConstString text_section_name(".text");
1604     static ConstString init_section_name(".init");
1605     static ConstString fini_section_name(".fini");
1606     static ConstString ctors_section_name(".ctors");
1607     static ConstString dtors_section_name(".dtors");
1608 
1609     static ConstString data_section_name(".data");
1610     static ConstString rodata_section_name(".rodata");
1611     static ConstString rodata1_section_name(".rodata1");
1612     static ConstString data2_section_name(".data1");
1613     static ConstString bss_section_name(".bss");
1614 
1615     //StreamFile strm(stdout, false);
1616     unsigned i;
1617     for (i = 0; i < num_symbols; ++i)
1618     {
1619         if (symbol.Parse(symtab_data, &offset) == false)
1620             break;
1621 
1622         const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1623 
1624         // No need to add non-section symbols that have no names
1625         if (symbol.getType() != STT_SECTION &&
1626             (symbol_name == NULL || symbol_name[0] == '\0'))
1627             continue;
1628 
1629         //symbol.Dump (&strm, i, &strtab_data, section_list);
1630 
1631         SectionSP symbol_section_sp;
1632         SymbolType symbol_type = eSymbolTypeInvalid;
1633         Elf64_Half symbol_idx = symbol.st_shndx;
1634 
1635         switch (symbol_idx)
1636         {
1637         case SHN_ABS:
1638             symbol_type = eSymbolTypeAbsolute;
1639             break;
1640         case SHN_UNDEF:
1641             symbol_type = eSymbolTypeUndefined;
1642             break;
1643         default:
1644             symbol_section_sp = section_list->GetSectionAtIndex(symbol_idx);
1645             break;
1646         }
1647 
1648         // If a symbol is undefined do not process it further even if it has a STT type
1649         if (symbol_type != eSymbolTypeUndefined)
1650         {
1651             switch (symbol.getType())
1652             {
1653             default:
1654             case STT_NOTYPE:
1655                 // The symbol's type is not specified.
1656                 break;
1657 
1658             case STT_OBJECT:
1659                 // The symbol is associated with a data object, such as a variable,
1660                 // an array, etc.
1661                 symbol_type = eSymbolTypeData;
1662                 break;
1663 
1664             case STT_FUNC:
1665                 // The symbol is associated with a function or other executable code.
1666                 symbol_type = eSymbolTypeCode;
1667                 break;
1668 
1669             case STT_SECTION:
1670                 // The symbol is associated with a section. Symbol table entries of
1671                 // this type exist primarily for relocation and normally have
1672                 // STB_LOCAL binding.
1673                 break;
1674 
1675             case STT_FILE:
1676                 // Conventionally, the symbol's name gives the name of the source
1677                 // file associated with the object file. A file symbol has STB_LOCAL
1678                 // binding, its section index is SHN_ABS, and it precedes the other
1679                 // STB_LOCAL symbols for the file, if it is present.
1680                 symbol_type = eSymbolTypeSourceFile;
1681                 break;
1682 
1683             case STT_GNU_IFUNC:
1684                 // The symbol is associated with an indirect function. The actual
1685                 // function will be resolved if it is referenced.
1686                 symbol_type = eSymbolTypeResolver;
1687                 break;
1688             }
1689         }
1690 
1691         if (symbol_type == eSymbolTypeInvalid)
1692         {
1693             if (symbol_section_sp)
1694             {
1695                 const ConstString &sect_name = symbol_section_sp->GetName();
1696                 if (sect_name == text_section_name ||
1697                     sect_name == init_section_name ||
1698                     sect_name == fini_section_name ||
1699                     sect_name == ctors_section_name ||
1700                     sect_name == dtors_section_name)
1701                 {
1702                     symbol_type = eSymbolTypeCode;
1703                 }
1704                 else if (sect_name == data_section_name ||
1705                          sect_name == data2_section_name ||
1706                          sect_name == rodata_section_name ||
1707                          sect_name == rodata1_section_name ||
1708                          sect_name == bss_section_name)
1709                 {
1710                     symbol_type = eSymbolTypeData;
1711                 }
1712             }
1713         }
1714 
1715         // If the symbol section we've found has no data (SHT_NOBITS), then check the module section
1716         // list. This can happen if we're parsing the debug file and it has no .text section, for example.
1717         if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0))
1718         {
1719             ModuleSP module_sp(GetModule());
1720             if (module_sp)
1721             {
1722                 SectionList *module_section_list = module_sp->GetSectionList();
1723                 if (module_section_list && module_section_list != section_list)
1724                 {
1725                     const ConstString &sect_name = symbol_section_sp->GetName();
1726                     lldb::SectionSP section_sp (module_section_list->FindSectionByName (sect_name));
1727                     if (section_sp && section_sp->GetFileSize())
1728                     {
1729                         symbol_section_sp = section_sp;
1730                     }
1731                 }
1732             }
1733         }
1734 
1735         uint64_t symbol_value = symbol.st_value;
1736         if (symbol_section_sp && CalculateType() != ObjectFile::Type::eTypeObjectFile)
1737             symbol_value -= symbol_section_sp->GetFileAddress();
1738         bool is_global = symbol.getBinding() == STB_GLOBAL;
1739         uint32_t flags = symbol.st_other << 8 | symbol.st_info;
1740         bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
1741         Symbol dc_symbol(
1742             i + start_id,       // ID is the original symbol table index.
1743             symbol_name,        // Symbol name.
1744             is_mangled,         // Is the symbol name mangled?
1745             symbol_type,        // Type of this symbol
1746             is_global,          // Is this globally visible?
1747             false,              // Is this symbol debug info?
1748             false,              // Is this symbol a trampoline?
1749             false,              // Is this symbol artificial?
1750             symbol_section_sp,  // Section in which this symbol is defined or null.
1751             symbol_value,       // Offset in section or symbol value.
1752             symbol.st_size,     // Size in bytes of this symbol.
1753             true,               // Size is valid
1754             flags);             // Symbol flags.
1755         symtab->AddSymbol(dc_symbol);
1756     }
1757 
1758     return i;
1759 }
1760 
1761 unsigned
1762 ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab)
1763 {
1764     if (symtab->GetObjectFile() != this)
1765     {
1766         // If the symbol table section is owned by a different object file, have it do the
1767         // parsing.
1768         ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile());
1769         return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
1770     }
1771 
1772     // Get section list for this object file.
1773     SectionList *section_list = m_sections_ap.get();
1774     if (!section_list)
1775         return 0;
1776 
1777     user_id_t symtab_id = symtab->GetID();
1778     const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
1779     assert(symtab_hdr->sh_type == SHT_SYMTAB ||
1780            symtab_hdr->sh_type == SHT_DYNSYM);
1781 
1782     // sh_link: section header index of associated string table.
1783     // Section ID's are ones based.
1784     user_id_t strtab_id = symtab_hdr->sh_link + 1;
1785     Section *strtab = section_list->FindSectionByID(strtab_id).get();
1786 
1787     if (symtab && strtab)
1788     {
1789         assert (symtab->GetObjectFile() == this);
1790         assert (strtab->GetObjectFile() == this);
1791 
1792         DataExtractor symtab_data;
1793         DataExtractor strtab_data;
1794         if (ReadSectionData(symtab, symtab_data) &&
1795             ReadSectionData(strtab, strtab_data))
1796         {
1797             size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
1798 
1799             return ParseSymbols(symbol_table, start_id, section_list,
1800                                 num_symbols, symtab_data, strtab_data);
1801         }
1802     }
1803 
1804     return 0;
1805 }
1806 
1807 size_t
1808 ObjectFileELF::ParseDynamicSymbols()
1809 {
1810     if (m_dynamic_symbols.size())
1811         return m_dynamic_symbols.size();
1812 
1813     SectionList *section_list = GetSectionList();
1814     if (!section_list)
1815         return 0;
1816 
1817     // Find the SHT_DYNAMIC section.
1818     Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
1819     if (!dynsym)
1820         return 0;
1821     assert (dynsym->GetObjectFile() == this);
1822 
1823     ELFDynamic symbol;
1824     DataExtractor dynsym_data;
1825     if (ReadSectionData(dynsym, dynsym_data))
1826     {
1827         const lldb::offset_t section_size = dynsym_data.GetByteSize();
1828         lldb::offset_t cursor = 0;
1829 
1830         while (cursor < section_size)
1831         {
1832             if (!symbol.Parse(dynsym_data, &cursor))
1833                 break;
1834 
1835             m_dynamic_symbols.push_back(symbol);
1836         }
1837     }
1838 
1839     return m_dynamic_symbols.size();
1840 }
1841 
1842 const ELFDynamic *
1843 ObjectFileELF::FindDynamicSymbol(unsigned tag)
1844 {
1845     if (!ParseDynamicSymbols())
1846         return NULL;
1847 
1848     DynamicSymbolCollIter I = m_dynamic_symbols.begin();
1849     DynamicSymbolCollIter E = m_dynamic_symbols.end();
1850     for ( ; I != E; ++I)
1851     {
1852         ELFDynamic *symbol = &*I;
1853 
1854         if (symbol->d_tag == tag)
1855             return symbol;
1856     }
1857 
1858     return NULL;
1859 }
1860 
1861 unsigned
1862 ObjectFileELF::PLTRelocationType()
1863 {
1864     // DT_PLTREL
1865     //  This member specifies the type of relocation entry to which the
1866     //  procedure linkage table refers. The d_val member holds DT_REL or
1867     //  DT_RELA, as appropriate. All relocations in a procedure linkage table
1868     //  must use the same relocation.
1869     const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
1870 
1871     if (symbol)
1872         return symbol->d_val;
1873 
1874     return 0;
1875 }
1876 
1877 static unsigned
1878 ParsePLTRelocations(Symtab *symbol_table,
1879                     user_id_t start_id,
1880                     unsigned rel_type,
1881                     const ELFHeader *hdr,
1882                     const ELFSectionHeader *rel_hdr,
1883                     const ELFSectionHeader *plt_hdr,
1884                     const ELFSectionHeader *sym_hdr,
1885                     const lldb::SectionSP &plt_section_sp,
1886                     DataExtractor &rel_data,
1887                     DataExtractor &symtab_data,
1888                     DataExtractor &strtab_data)
1889 {
1890     ELFRelocation rel(rel_type);
1891     ELFSymbol symbol;
1892     lldb::offset_t offset = 0;
1893     // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 16 bytes.
1894     // So round the entsize up by the alignment if addralign is set.
1895     const elf_xword plt_entsize = plt_hdr->sh_addralign ?
1896         llvm::RoundUpToAlignment (plt_hdr->sh_entsize, plt_hdr->sh_addralign) : plt_hdr->sh_entsize;
1897     const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
1898 
1899     typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
1900     reloc_info_fn reloc_type;
1901     reloc_info_fn reloc_symbol;
1902 
1903     if (hdr->Is32Bit())
1904     {
1905         reloc_type = ELFRelocation::RelocType32;
1906         reloc_symbol = ELFRelocation::RelocSymbol32;
1907     }
1908     else
1909     {
1910         reloc_type = ELFRelocation::RelocType64;
1911         reloc_symbol = ELFRelocation::RelocSymbol64;
1912     }
1913 
1914     unsigned slot_type = hdr->GetRelocationJumpSlotType();
1915     unsigned i;
1916     for (i = 0; i < num_relocations; ++i)
1917     {
1918         if (rel.Parse(rel_data, &offset) == false)
1919             break;
1920 
1921         if (reloc_type(rel) != slot_type)
1922             continue;
1923 
1924         lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
1925         uint64_t plt_index = (i + 1) * plt_entsize;
1926 
1927         if (!symbol.Parse(symtab_data, &symbol_offset))
1928             break;
1929 
1930         const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1931         bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
1932 
1933         Symbol jump_symbol(
1934             i + start_id,    // Symbol table index
1935             symbol_name,     // symbol name.
1936             is_mangled,      // is the symbol name mangled?
1937             eSymbolTypeTrampoline, // Type of this symbol
1938             false,           // Is this globally visible?
1939             false,           // Is this symbol debug info?
1940             true,            // Is this symbol a trampoline?
1941             true,            // Is this symbol artificial?
1942             plt_section_sp,  // Section in which this symbol is defined or null.
1943             plt_index,       // Offset in section or symbol value.
1944             plt_entsize,     // Size in bytes of this symbol.
1945             true,            // Size is valid
1946             0);              // Symbol flags.
1947 
1948         symbol_table->AddSymbol(jump_symbol);
1949     }
1950 
1951     return i;
1952 }
1953 
1954 unsigned
1955 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table,
1956                                       user_id_t start_id,
1957                                       const ELFSectionHeaderInfo *rel_hdr,
1958                                       user_id_t rel_id)
1959 {
1960     assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
1961 
1962     // The link field points to the associated symbol table. The info field
1963     // points to the section holding the plt.
1964     user_id_t symtab_id = rel_hdr->sh_link;
1965     user_id_t plt_id = rel_hdr->sh_info;
1966 
1967     if (!symtab_id || !plt_id)
1968         return 0;
1969 
1970     // Section ID's are ones based;
1971     symtab_id++;
1972     plt_id++;
1973 
1974     const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
1975     if (!plt_hdr)
1976         return 0;
1977 
1978     const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
1979     if (!sym_hdr)
1980         return 0;
1981 
1982     SectionList *section_list = m_sections_ap.get();
1983     if (!section_list)
1984         return 0;
1985 
1986     Section *rel_section = section_list->FindSectionByID(rel_id).get();
1987     if (!rel_section)
1988         return 0;
1989 
1990     SectionSP plt_section_sp (section_list->FindSectionByID(plt_id));
1991     if (!plt_section_sp)
1992         return 0;
1993 
1994     Section *symtab = section_list->FindSectionByID(symtab_id).get();
1995     if (!symtab)
1996         return 0;
1997 
1998     // sh_link points to associated string table.
1999     Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
2000     if (!strtab)
2001         return 0;
2002 
2003     DataExtractor rel_data;
2004     if (!ReadSectionData(rel_section, rel_data))
2005         return 0;
2006 
2007     DataExtractor symtab_data;
2008     if (!ReadSectionData(symtab, symtab_data))
2009         return 0;
2010 
2011     DataExtractor strtab_data;
2012     if (!ReadSectionData(strtab, strtab_data))
2013         return 0;
2014 
2015     unsigned rel_type = PLTRelocationType();
2016     if (!rel_type)
2017         return 0;
2018 
2019     return ParsePLTRelocations (symbol_table,
2020                                 start_id,
2021                                 rel_type,
2022                                 &m_header,
2023                                 rel_hdr,
2024                                 plt_hdr,
2025                                 sym_hdr,
2026                                 plt_section_sp,
2027                                 rel_data,
2028                                 symtab_data,
2029                                 strtab_data);
2030 }
2031 
2032 unsigned
2033 ObjectFileELF::RelocateSection(Symtab* symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2034                 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2035                 DataExtractor &rel_data, DataExtractor &symtab_data,
2036                 DataExtractor &debug_data, Section* rel_section)
2037 {
2038     ELFRelocation rel(rel_hdr->sh_type);
2039     lldb::addr_t offset = 0;
2040     const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2041     typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2042     reloc_info_fn reloc_type;
2043     reloc_info_fn reloc_symbol;
2044 
2045     if (hdr->Is32Bit())
2046     {
2047         reloc_type = ELFRelocation::RelocType32;
2048         reloc_symbol = ELFRelocation::RelocSymbol32;
2049     }
2050     else
2051     {
2052         reloc_type = ELFRelocation::RelocType64;
2053         reloc_symbol = ELFRelocation::RelocSymbol64;
2054     }
2055 
2056     for (unsigned i = 0; i < num_relocations; ++i)
2057     {
2058         if (rel.Parse(rel_data, &offset) == false)
2059             break;
2060 
2061         Symbol* symbol = NULL;
2062 
2063         if (hdr->Is32Bit())
2064         {
2065             switch (reloc_type(rel)) {
2066             case R_386_32:
2067             case R_386_PC32:
2068             default:
2069                 assert(false && "unexpected relocation type");
2070             }
2071         } else {
2072             switch (reloc_type(rel)) {
2073             case R_X86_64_64:
2074             {
2075                 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2076                 if (symbol)
2077                 {
2078                     addr_t value = symbol->GetAddress().GetFileAddress();
2079                     DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2080                     uint64_t* dst = reinterpret_cast<uint64_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset64(rel));
2081                     *dst = value + ELFRelocation::RelocAddend64(rel);
2082                 }
2083                 break;
2084             }
2085             case R_X86_64_32:
2086             case R_X86_64_32S:
2087             {
2088                 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2089                 if (symbol)
2090                 {
2091                     addr_t value = symbol->GetAddress().GetFileAddress();
2092                     value += ELFRelocation::RelocAddend32(rel);
2093                     assert((reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) ||
2094                            (reloc_type(rel) == R_X86_64_32S &&
2095                             ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN)));
2096                     uint32_t truncated_addr = (value & 0xFFFFFFFF);
2097                     DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2098                     uint32_t* dst = reinterpret_cast<uint32_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel));
2099                     *dst = truncated_addr;
2100                 }
2101                 break;
2102             }
2103             case R_X86_64_PC32:
2104             default:
2105                 assert(false && "unexpected relocation type");
2106             }
2107         }
2108     }
2109 
2110     return 0;
2111 }
2112 
2113 unsigned
2114 ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, user_id_t rel_id)
2115 {
2116     assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2117 
2118     // Parse in the section list if needed.
2119     SectionList *section_list = GetSectionList();
2120     if (!section_list)
2121         return 0;
2122 
2123     // Section ID's are ones based.
2124     user_id_t symtab_id = rel_hdr->sh_link + 1;
2125     user_id_t debug_id = rel_hdr->sh_info + 1;
2126 
2127     const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2128     if (!symtab_hdr)
2129         return 0;
2130 
2131     const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2132     if (!debug_hdr)
2133         return 0;
2134 
2135     Section *rel = section_list->FindSectionByID(rel_id).get();
2136     if (!rel)
2137         return 0;
2138 
2139     Section *symtab = section_list->FindSectionByID(symtab_id).get();
2140     if (!symtab)
2141         return 0;
2142 
2143     Section *debug = section_list->FindSectionByID(debug_id).get();
2144     if (!debug)
2145         return 0;
2146 
2147     DataExtractor rel_data;
2148     DataExtractor symtab_data;
2149     DataExtractor debug_data;
2150 
2151     if (ReadSectionData(rel, rel_data) &&
2152         ReadSectionData(symtab, symtab_data) &&
2153         ReadSectionData(debug, debug_data))
2154     {
2155         RelocateSection(m_symtab_ap.get(), &m_header, rel_hdr, symtab_hdr, debug_hdr,
2156                         rel_data, symtab_data, debug_data, debug);
2157     }
2158 
2159     return 0;
2160 }
2161 
2162 Symtab *
2163 ObjectFileELF::GetSymtab()
2164 {
2165     ModuleSP module_sp(GetModule());
2166     if (!module_sp)
2167         return NULL;
2168 
2169     // We always want to use the main object file so we (hopefully) only have one cached copy
2170     // of our symtab, dynamic sections, etc.
2171     ObjectFile *module_obj_file = module_sp->GetObjectFile();
2172     if (module_obj_file && module_obj_file != this)
2173         return module_obj_file->GetSymtab();
2174 
2175     if (m_symtab_ap.get() == NULL)
2176     {
2177         SectionList *section_list = GetSectionList();
2178         if (!section_list)
2179             return NULL;
2180 
2181         uint64_t symbol_id = 0;
2182         lldb_private::Mutex::Locker locker(module_sp->GetMutex());
2183 
2184         m_symtab_ap.reset(new Symtab(this));
2185 
2186         // Sharable objects and dynamic executables usually have 2 distinct symbol
2187         // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller
2188         // version of the symtab that only contains global symbols. The information found
2189         // in the dynsym is therefore also found in the symtab, while the reverse is not
2190         // necessarily true.
2191         Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get();
2192         if (!symtab)
2193         {
2194             // The symtab section is non-allocable and can be stripped, so if it doesn't exist
2195             // then use the dynsym section which should always be there.
2196             symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get();
2197         }
2198         if (symtab)
2199             symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab);
2200 
2201         // DT_JMPREL
2202         //      If present, this entry's d_ptr member holds the address of relocation
2203         //      entries associated solely with the procedure linkage table. Separating
2204         //      these relocation entries lets the dynamic linker ignore them during
2205         //      process initialization, if lazy binding is enabled. If this entry is
2206         //      present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2207         //      also be present.
2208         const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2209         if (symbol)
2210         {
2211             // Synthesize trampoline symbols to help navigate the PLT.
2212             addr_t addr = symbol->d_ptr;
2213             Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get();
2214             if (reloc_section)
2215             {
2216                 user_id_t reloc_id = reloc_section->GetID();
2217                 const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id);
2218                 assert(reloc_header);
2219 
2220                 ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id);
2221             }
2222         }
2223     }
2224 
2225     for (SectionHeaderCollIter I = m_section_headers.begin();
2226          I != m_section_headers.end(); ++I)
2227     {
2228         if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL)
2229         {
2230             if (CalculateType() == eTypeObjectFile)
2231             {
2232                 const char *section_name = I->section_name.AsCString("");
2233                 if (strstr(section_name, ".rela.debug") ||
2234                     strstr(section_name, ".rel.debug"))
2235                 {
2236                     const ELFSectionHeader &reloc_header = *I;
2237                     user_id_t reloc_id = SectionIndex(I);
2238                     RelocateDebugSections(&reloc_header, reloc_id);
2239                 }
2240             }
2241         }
2242     }
2243     return m_symtab_ap.get();
2244 }
2245 
2246 Symbol *
2247 ObjectFileELF::ResolveSymbolForAddress(const Address& so_addr, bool verify_unique)
2248 {
2249     if (!m_symtab_ap.get())
2250         return nullptr; // GetSymtab() should be called first.
2251 
2252     const SectionList *section_list = GetSectionList();
2253     if (!section_list)
2254         return nullptr;
2255 
2256     if (DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo())
2257     {
2258         AddressRange range;
2259         if (eh_frame->GetAddressRange (so_addr, range))
2260         {
2261             const addr_t file_addr = range.GetBaseAddress().GetFileAddress();
2262             Symbol * symbol = verify_unique ? m_symtab_ap->FindSymbolContainingFileAddress(file_addr) : nullptr;
2263             if (symbol)
2264                 return symbol;
2265 
2266             // Note that a (stripped) symbol won't be found by GetSymtab()...
2267             lldb::SectionSP eh_sym_section_sp = section_list->FindSectionContainingFileAddress(file_addr);
2268             if (eh_sym_section_sp.get())
2269             {
2270                 addr_t section_base = eh_sym_section_sp->GetFileAddress();
2271                 addr_t offset = file_addr - section_base;
2272                 uint64_t symbol_id = m_symtab_ap->GetNumSymbols();
2273 
2274                 Symbol eh_symbol(
2275                         symbol_id,            // Symbol table index.
2276                         "???",                // Symbol name.
2277                         false,                // Is the symbol name mangled?
2278                         eSymbolTypeCode,      // Type of this symbol.
2279                         true,                 // Is this globally visible?
2280                         false,                // Is this symbol debug info?
2281                         false,                // Is this symbol a trampoline?
2282                         true,                 // Is this symbol artificial?
2283                         eh_sym_section_sp,    // Section in which this symbol is defined or null.
2284                         offset,               // Offset in section or symbol value.
2285                         range.GetByteSize(),  // Size in bytes of this symbol.
2286                         true,                 // Size is valid.
2287                         0);                   // Symbol flags.
2288                 if (symbol_id == m_symtab_ap->AddSymbol(eh_symbol))
2289                     return m_symtab_ap->SymbolAtIndex(symbol_id);
2290             }
2291         }
2292     }
2293     return nullptr;
2294 }
2295 
2296 
2297 bool
2298 ObjectFileELF::IsStripped ()
2299 {
2300     // TODO: determine this for ELF
2301     return false;
2302 }
2303 
2304 //===----------------------------------------------------------------------===//
2305 // Dump
2306 //
2307 // Dump the specifics of the runtime file container (such as any headers
2308 // segments, sections, etc).
2309 //----------------------------------------------------------------------
2310 void
2311 ObjectFileELF::Dump(Stream *s)
2312 {
2313     DumpELFHeader(s, m_header);
2314     s->EOL();
2315     DumpELFProgramHeaders(s);
2316     s->EOL();
2317     DumpELFSectionHeaders(s);
2318     s->EOL();
2319     SectionList *section_list = GetSectionList();
2320     if (section_list)
2321         section_list->Dump(s, NULL, true, UINT32_MAX);
2322     Symtab *symtab = GetSymtab();
2323     if (symtab)
2324         symtab->Dump(s, NULL, eSortOrderNone);
2325     s->EOL();
2326     DumpDependentModules(s);
2327     s->EOL();
2328 }
2329 
2330 //----------------------------------------------------------------------
2331 // DumpELFHeader
2332 //
2333 // Dump the ELF header to the specified output stream
2334 //----------------------------------------------------------------------
2335 void
2336 ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header)
2337 {
2338     s->PutCString("ELF Header\n");
2339     s->Printf("e_ident[EI_MAG0   ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2340     s->Printf("e_ident[EI_MAG1   ] = 0x%2.2x '%c'\n",
2341               header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]);
2342     s->Printf("e_ident[EI_MAG2   ] = 0x%2.2x '%c'\n",
2343               header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]);
2344     s->Printf("e_ident[EI_MAG3   ] = 0x%2.2x '%c'\n",
2345               header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]);
2346 
2347     s->Printf("e_ident[EI_CLASS  ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2348     s->Printf("e_ident[EI_DATA   ] = 0x%2.2x ", header.e_ident[EI_DATA]);
2349     DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2350     s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2351     s->Printf ("e_ident[EI_PAD    ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
2352 
2353     s->Printf("e_type      = 0x%4.4x ", header.e_type);
2354     DumpELFHeader_e_type(s, header.e_type);
2355     s->Printf("\ne_machine   = 0x%4.4x\n", header.e_machine);
2356     s->Printf("e_version   = 0x%8.8x\n", header.e_version);
2357     s->Printf("e_entry     = 0x%8.8" PRIx64 "\n", header.e_entry);
2358     s->Printf("e_phoff     = 0x%8.8" PRIx64 "\n", header.e_phoff);
2359     s->Printf("e_shoff     = 0x%8.8" PRIx64 "\n", header.e_shoff);
2360     s->Printf("e_flags     = 0x%8.8x\n", header.e_flags);
2361     s->Printf("e_ehsize    = 0x%4.4x\n", header.e_ehsize);
2362     s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
2363     s->Printf("e_phnum     = 0x%4.4x\n", header.e_phnum);
2364     s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
2365     s->Printf("e_shnum     = 0x%4.4x\n", header.e_shnum);
2366     s->Printf("e_shstrndx  = 0x%4.4x\n", header.e_shstrndx);
2367 }
2368 
2369 //----------------------------------------------------------------------
2370 // DumpELFHeader_e_type
2371 //
2372 // Dump an token value for the ELF header member e_type
2373 //----------------------------------------------------------------------
2374 void
2375 ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type)
2376 {
2377     switch (e_type)
2378     {
2379     case ET_NONE:   *s << "ET_NONE"; break;
2380     case ET_REL:    *s << "ET_REL"; break;
2381     case ET_EXEC:   *s << "ET_EXEC"; break;
2382     case ET_DYN:    *s << "ET_DYN"; break;
2383     case ET_CORE:   *s << "ET_CORE"; break;
2384     default:
2385         break;
2386     }
2387 }
2388 
2389 //----------------------------------------------------------------------
2390 // DumpELFHeader_e_ident_EI_DATA
2391 //
2392 // Dump an token value for the ELF header member e_ident[EI_DATA]
2393 //----------------------------------------------------------------------
2394 void
2395 ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data)
2396 {
2397     switch (ei_data)
2398     {
2399     case ELFDATANONE:   *s << "ELFDATANONE"; break;
2400     case ELFDATA2LSB:   *s << "ELFDATA2LSB - Little Endian"; break;
2401     case ELFDATA2MSB:   *s << "ELFDATA2MSB - Big Endian"; break;
2402     default:
2403         break;
2404     }
2405 }
2406 
2407 
2408 //----------------------------------------------------------------------
2409 // DumpELFProgramHeader
2410 //
2411 // Dump a single ELF program header to the specified output stream
2412 //----------------------------------------------------------------------
2413 void
2414 ObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph)
2415 {
2416     DumpELFProgramHeader_p_type(s, ph.p_type);
2417     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr);
2418     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, ph.p_flags);
2419 
2420     DumpELFProgramHeader_p_flags(s, ph.p_flags);
2421     s->Printf(") %8.8" PRIx64, ph.p_align);
2422 }
2423 
2424 //----------------------------------------------------------------------
2425 // DumpELFProgramHeader_p_type
2426 //
2427 // Dump an token value for the ELF program header member p_type which
2428 // describes the type of the program header
2429 // ----------------------------------------------------------------------
2430 void
2431 ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type)
2432 {
2433     const int kStrWidth = 15;
2434     switch (p_type)
2435     {
2436     CASE_AND_STREAM(s, PT_NULL        , kStrWidth);
2437     CASE_AND_STREAM(s, PT_LOAD        , kStrWidth);
2438     CASE_AND_STREAM(s, PT_DYNAMIC     , kStrWidth);
2439     CASE_AND_STREAM(s, PT_INTERP      , kStrWidth);
2440     CASE_AND_STREAM(s, PT_NOTE        , kStrWidth);
2441     CASE_AND_STREAM(s, PT_SHLIB       , kStrWidth);
2442     CASE_AND_STREAM(s, PT_PHDR        , kStrWidth);
2443     CASE_AND_STREAM(s, PT_TLS         , kStrWidth);
2444     CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
2445     default:
2446         s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
2447         break;
2448     }
2449 }
2450 
2451 
2452 //----------------------------------------------------------------------
2453 // DumpELFProgramHeader_p_flags
2454 //
2455 // Dump an token value for the ELF program header member p_flags
2456 //----------------------------------------------------------------------
2457 void
2458 ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags)
2459 {
2460     *s  << ((p_flags & PF_X) ? "PF_X" : "    ")
2461         << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
2462         << ((p_flags & PF_W) ? "PF_W" : "    ")
2463         << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
2464         << ((p_flags & PF_R) ? "PF_R" : "    ");
2465 }
2466 
2467 //----------------------------------------------------------------------
2468 // DumpELFProgramHeaders
2469 //
2470 // Dump all of the ELF program header to the specified output stream
2471 //----------------------------------------------------------------------
2472 void
2473 ObjectFileELF::DumpELFProgramHeaders(Stream *s)
2474 {
2475     if (ParseProgramHeaders())
2476     {
2477         s->PutCString("Program Headers\n");
2478         s->PutCString("IDX  p_type          p_offset p_vaddr  p_paddr  "
2479                       "p_filesz p_memsz  p_flags                   p_align\n");
2480         s->PutCString("==== --------------- -------- -------- -------- "
2481                       "-------- -------- ------------------------- --------\n");
2482 
2483         uint32_t idx = 0;
2484         for (ProgramHeaderCollConstIter I = m_program_headers.begin();
2485              I != m_program_headers.end(); ++I, ++idx)
2486         {
2487             s->Printf("[%2u] ", idx);
2488             ObjectFileELF::DumpELFProgramHeader(s, *I);
2489             s->EOL();
2490         }
2491     }
2492 }
2493 
2494 //----------------------------------------------------------------------
2495 // DumpELFSectionHeader
2496 //
2497 // Dump a single ELF section header to the specified output stream
2498 //----------------------------------------------------------------------
2499 void
2500 ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh)
2501 {
2502     s->Printf("%8.8x ", sh.sh_name);
2503     DumpELFSectionHeader_sh_type(s, sh.sh_type);
2504     s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
2505     DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
2506     s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, sh.sh_offset, sh.sh_size);
2507     s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
2508     s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
2509 }
2510 
2511 //----------------------------------------------------------------------
2512 // DumpELFSectionHeader_sh_type
2513 //
2514 // Dump an token value for the ELF section header member sh_type which
2515 // describes the type of the section
2516 //----------------------------------------------------------------------
2517 void
2518 ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type)
2519 {
2520     const int kStrWidth = 12;
2521     switch (sh_type)
2522     {
2523     CASE_AND_STREAM(s, SHT_NULL     , kStrWidth);
2524     CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth);
2525     CASE_AND_STREAM(s, SHT_SYMTAB   , kStrWidth);
2526     CASE_AND_STREAM(s, SHT_STRTAB   , kStrWidth);
2527     CASE_AND_STREAM(s, SHT_RELA     , kStrWidth);
2528     CASE_AND_STREAM(s, SHT_HASH     , kStrWidth);
2529     CASE_AND_STREAM(s, SHT_DYNAMIC  , kStrWidth);
2530     CASE_AND_STREAM(s, SHT_NOTE     , kStrWidth);
2531     CASE_AND_STREAM(s, SHT_NOBITS   , kStrWidth);
2532     CASE_AND_STREAM(s, SHT_REL      , kStrWidth);
2533     CASE_AND_STREAM(s, SHT_SHLIB    , kStrWidth);
2534     CASE_AND_STREAM(s, SHT_DYNSYM   , kStrWidth);
2535     CASE_AND_STREAM(s, SHT_LOPROC   , kStrWidth);
2536     CASE_AND_STREAM(s, SHT_HIPROC   , kStrWidth);
2537     CASE_AND_STREAM(s, SHT_LOUSER   , kStrWidth);
2538     CASE_AND_STREAM(s, SHT_HIUSER   , kStrWidth);
2539     default:
2540         s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
2541         break;
2542     }
2543 }
2544 
2545 //----------------------------------------------------------------------
2546 // DumpELFSectionHeader_sh_flags
2547 //
2548 // Dump an token value for the ELF section header member sh_flags
2549 //----------------------------------------------------------------------
2550 void
2551 ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags)
2552 {
2553     *s  << ((sh_flags & SHF_WRITE) ? "WRITE" : "     ")
2554         << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
2555         << ((sh_flags & SHF_ALLOC) ? "ALLOC" : "     ")
2556         << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
2557         << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : "         ");
2558 }
2559 
2560 //----------------------------------------------------------------------
2561 // DumpELFSectionHeaders
2562 //
2563 // Dump all of the ELF section header to the specified output stream
2564 //----------------------------------------------------------------------
2565 void
2566 ObjectFileELF::DumpELFSectionHeaders(Stream *s)
2567 {
2568     if (!ParseSectionHeaders())
2569         return;
2570 
2571     s->PutCString("Section Headers\n");
2572     s->PutCString("IDX  name     type         flags                            "
2573                   "addr     offset   size     link     info     addralgn "
2574                   "entsize  Name\n");
2575     s->PutCString("==== -------- ------------ -------------------------------- "
2576                   "-------- -------- -------- -------- -------- -------- "
2577                   "-------- ====================\n");
2578 
2579     uint32_t idx = 0;
2580     for (SectionHeaderCollConstIter I = m_section_headers.begin();
2581          I != m_section_headers.end(); ++I, ++idx)
2582     {
2583         s->Printf("[%2u] ", idx);
2584         ObjectFileELF::DumpELFSectionHeader(s, *I);
2585         const char* section_name = I->section_name.AsCString("");
2586         if (section_name)
2587             *s << ' ' << section_name << "\n";
2588     }
2589 }
2590 
2591 void
2592 ObjectFileELF::DumpDependentModules(lldb_private::Stream *s)
2593 {
2594     size_t num_modules = ParseDependentModules();
2595 
2596     if (num_modules > 0)
2597     {
2598         s->PutCString("Dependent Modules:\n");
2599         for (unsigned i = 0; i < num_modules; ++i)
2600         {
2601             const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
2602             s->Printf("   %s\n", spec.GetFilename().GetCString());
2603         }
2604     }
2605 }
2606 
2607 bool
2608 ObjectFileELF::GetArchitecture (ArchSpec &arch)
2609 {
2610     if (!ParseHeader())
2611         return false;
2612 
2613     if (m_section_headers.empty())
2614     {
2615         // Allow elf notes to be parsed which may affect the detected architecture.
2616         ParseSectionHeaders();
2617     }
2618 
2619     arch = m_arch_spec;
2620     return true;
2621 }
2622 
2623 ObjectFile::Type
2624 ObjectFileELF::CalculateType()
2625 {
2626     switch (m_header.e_type)
2627     {
2628         case llvm::ELF::ET_NONE:
2629             // 0 - No file type
2630             return eTypeUnknown;
2631 
2632         case llvm::ELF::ET_REL:
2633             // 1 - Relocatable file
2634             return eTypeObjectFile;
2635 
2636         case llvm::ELF::ET_EXEC:
2637             // 2 - Executable file
2638             return eTypeExecutable;
2639 
2640         case llvm::ELF::ET_DYN:
2641             // 3 - Shared object file
2642             return eTypeSharedLibrary;
2643 
2644         case ET_CORE:
2645             // 4 - Core file
2646             return eTypeCoreFile;
2647 
2648         default:
2649             break;
2650     }
2651     return eTypeUnknown;
2652 }
2653 
2654 ObjectFile::Strata
2655 ObjectFileELF::CalculateStrata()
2656 {
2657     switch (m_header.e_type)
2658     {
2659         case llvm::ELF::ET_NONE:
2660             // 0 - No file type
2661             return eStrataUnknown;
2662 
2663         case llvm::ELF::ET_REL:
2664             // 1 - Relocatable file
2665             return eStrataUnknown;
2666 
2667         case llvm::ELF::ET_EXEC:
2668             // 2 - Executable file
2669             // TODO: is there any way to detect that an executable is a kernel
2670             // related executable by inspecting the program headers, section
2671             // headers, symbols, or any other flag bits???
2672             return eStrataUser;
2673 
2674         case llvm::ELF::ET_DYN:
2675             // 3 - Shared object file
2676             // TODO: is there any way to detect that an shared library is a kernel
2677             // related executable by inspecting the program headers, section
2678             // headers, symbols, or any other flag bits???
2679             return eStrataUnknown;
2680 
2681         case ET_CORE:
2682             // 4 - Core file
2683             // TODO: is there any way to detect that an core file is a kernel
2684             // related executable by inspecting the program headers, section
2685             // headers, symbols, or any other flag bits???
2686             return eStrataUnknown;
2687 
2688         default:
2689             break;
2690     }
2691     return eStrataUnknown;
2692 }
2693 
2694