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/Module.h"
20 #include "lldb/Core/ModuleSpec.h"
21 #include "lldb/Core/PluginManager.h"
22 #include "lldb/Core/Section.h"
23 #include "lldb/Core/Stream.h"
24 #include "lldb/Symbol/SymbolContext.h"
25 #include "lldb/Host/Host.h"
26
27 #include "llvm/ADT/PointerUnion.h"
28
29 #define CASE_AND_STREAM(s, def, width) \
30 case def: s->Printf("%-*s", width, #def); break;
31
32 using namespace lldb;
33 using namespace lldb_private;
34 using namespace elf;
35 using namespace llvm::ELF;
36
37 namespace {
38 //===----------------------------------------------------------------------===//
39 /// @class ELFRelocation
40 /// @brief Generic wrapper for ELFRel and ELFRela.
41 ///
42 /// This helper class allows us to parse both ELFRel and ELFRela relocation
43 /// entries in a generic manner.
44 class ELFRelocation
45 {
46 public:
47
48 /// Constructs an ELFRelocation entry with a personality as given by @p
49 /// type.
50 ///
51 /// @param type Either DT_REL or DT_RELA. Any other value is invalid.
52 ELFRelocation(unsigned type);
53
54 ~ELFRelocation();
55
56 bool
57 Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
58
59 static unsigned
60 RelocType32(const ELFRelocation &rel);
61
62 static unsigned
63 RelocType64(const ELFRelocation &rel);
64
65 static unsigned
66 RelocSymbol32(const ELFRelocation &rel);
67
68 static unsigned
69 RelocSymbol64(const ELFRelocation &rel);
70
71 private:
72 typedef llvm::PointerUnion<ELFRel*, ELFRela*> RelocUnion;
73
74 RelocUnion reloc;
75 };
76
ELFRelocation(unsigned type)77 ELFRelocation::ELFRelocation(unsigned type)
78 {
79 if (type == DT_REL)
80 reloc = new ELFRel();
81 else if (type == DT_RELA)
82 reloc = new ELFRela();
83 else {
84 assert(false && "unexpected relocation type");
85 reloc = static_cast<ELFRel*>(NULL);
86 }
87 }
88
~ELFRelocation()89 ELFRelocation::~ELFRelocation()
90 {
91 if (reloc.is<ELFRel*>())
92 delete reloc.get<ELFRel*>();
93 else
94 delete reloc.get<ELFRela*>();
95 }
96
97 bool
Parse(const lldb_private::DataExtractor & data,lldb::offset_t * offset)98 ELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
99 {
100 if (reloc.is<ELFRel*>())
101 return reloc.get<ELFRel*>()->Parse(data, offset);
102 else
103 return reloc.get<ELFRela*>()->Parse(data, offset);
104 }
105
106 unsigned
RelocType32(const ELFRelocation & rel)107 ELFRelocation::RelocType32(const ELFRelocation &rel)
108 {
109 if (rel.reloc.is<ELFRel*>())
110 return ELFRel::RelocType32(*rel.reloc.get<ELFRel*>());
111 else
112 return ELFRela::RelocType32(*rel.reloc.get<ELFRela*>());
113 }
114
115 unsigned
RelocType64(const ELFRelocation & rel)116 ELFRelocation::RelocType64(const ELFRelocation &rel)
117 {
118 if (rel.reloc.is<ELFRel*>())
119 return ELFRel::RelocType64(*rel.reloc.get<ELFRel*>());
120 else
121 return ELFRela::RelocType64(*rel.reloc.get<ELFRela*>());
122 }
123
124 unsigned
RelocSymbol32(const ELFRelocation & rel)125 ELFRelocation::RelocSymbol32(const ELFRelocation &rel)
126 {
127 if (rel.reloc.is<ELFRel*>())
128 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel*>());
129 else
130 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela*>());
131 }
132
133 unsigned
RelocSymbol64(const ELFRelocation & rel)134 ELFRelocation::RelocSymbol64(const ELFRelocation &rel)
135 {
136 if (rel.reloc.is<ELFRel*>())
137 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel*>());
138 else
139 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela*>());
140 }
141
142 } // end anonymous namespace
143
144 //------------------------------------------------------------------
145 // Static methods.
146 //------------------------------------------------------------------
147 void
Initialize()148 ObjectFileELF::Initialize()
149 {
150 PluginManager::RegisterPlugin(GetPluginNameStatic(),
151 GetPluginDescriptionStatic(),
152 CreateInstance,
153 CreateMemoryInstance,
154 GetModuleSpecifications);
155 }
156
157 void
Terminate()158 ObjectFileELF::Terminate()
159 {
160 PluginManager::UnregisterPlugin(CreateInstance);
161 }
162
163 lldb_private::ConstString
GetPluginNameStatic()164 ObjectFileELF::GetPluginNameStatic()
165 {
166 static ConstString g_name("elf");
167 return g_name;
168 }
169
170 const char *
GetPluginDescriptionStatic()171 ObjectFileELF::GetPluginDescriptionStatic()
172 {
173 return "ELF object file reader.";
174 }
175
176 ObjectFile *
CreateInstance(const lldb::ModuleSP & module_sp,DataBufferSP & data_sp,lldb::offset_t data_offset,const lldb_private::FileSpec * file,lldb::offset_t file_offset,lldb::offset_t length)177 ObjectFileELF::CreateInstance (const lldb::ModuleSP &module_sp,
178 DataBufferSP &data_sp,
179 lldb::offset_t data_offset,
180 const lldb_private::FileSpec* file,
181 lldb::offset_t file_offset,
182 lldb::offset_t length)
183 {
184 if (!data_sp)
185 {
186 data_sp = file->MemoryMapFileContents(file_offset, length);
187 data_offset = 0;
188 }
189
190 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
191 {
192 const uint8_t *magic = data_sp->GetBytes() + data_offset;
193 if (ELFHeader::MagicBytesMatch(magic))
194 {
195 // Update the data to contain the entire file if it doesn't already
196 if (data_sp->GetByteSize() < length) {
197 data_sp = file->MemoryMapFileContents(file_offset, length);
198 data_offset = 0;
199 magic = data_sp->GetBytes();
200 }
201 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
202 if (address_size == 4 || address_size == 8)
203 {
204 std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, data_offset, file, file_offset, length));
205 ArchSpec spec;
206 if (objfile_ap->GetArchitecture(spec) &&
207 objfile_ap->SetModulesArchitecture(spec))
208 return objfile_ap.release();
209 }
210 }
211 }
212 return NULL;
213 }
214
215
216 ObjectFile*
CreateMemoryInstance(const lldb::ModuleSP & module_sp,DataBufferSP & data_sp,const lldb::ProcessSP & process_sp,lldb::addr_t header_addr)217 ObjectFileELF::CreateMemoryInstance (const lldb::ModuleSP &module_sp,
218 DataBufferSP& data_sp,
219 const lldb::ProcessSP &process_sp,
220 lldb::addr_t header_addr)
221 {
222 return NULL;
223 }
224
225 bool
MagicBytesMatch(DataBufferSP & data_sp,lldb::addr_t data_offset,lldb::addr_t data_length)226 ObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp,
227 lldb::addr_t data_offset,
228 lldb::addr_t data_length)
229 {
230 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
231 {
232 const uint8_t *magic = data_sp->GetBytes() + data_offset;
233 return ELFHeader::MagicBytesMatch(magic);
234 }
235 return false;
236 }
237
238 /*
239 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
240 *
241 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
242 * code or tables extracted from it, as desired without restriction.
243 */
244 static uint32_t
calc_gnu_debuglink_crc32(const void * buf,size_t size)245 calc_gnu_debuglink_crc32(const void *buf, size_t size)
246 {
247 static const uint32_t g_crc32_tab[] =
248 {
249 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
250 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
251 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
252 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
253 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
254 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
255 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
256 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
257 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
258 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
259 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
260 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
261 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
262 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
263 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
264 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
265 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
266 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
267 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
268 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
269 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
270 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
271 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
272 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
273 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
274 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
275 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
276 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
277 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
278 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
279 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
280 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
281 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
282 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
283 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
284 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
285 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
286 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
287 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
288 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
289 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
290 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
291 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
292 };
293 const uint8_t *p = (const uint8_t *)buf;
294 uint32_t crc;
295
296 crc = ~0U;
297 while (size--)
298 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
299 return crc ^ ~0U;
300 }
301
302 size_t
GetModuleSpecifications(const lldb_private::FileSpec & file,lldb::DataBufferSP & data_sp,lldb::offset_t data_offset,lldb::offset_t file_offset,lldb::offset_t length,lldb_private::ModuleSpecList & specs)303 ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec& file,
304 lldb::DataBufferSP& data_sp,
305 lldb::offset_t data_offset,
306 lldb::offset_t file_offset,
307 lldb::offset_t length,
308 lldb_private::ModuleSpecList &specs)
309 {
310 const size_t initial_count = specs.GetSize();
311
312 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize()))
313 {
314 DataExtractor data;
315 data.SetData(data_sp);
316 elf::ELFHeader header;
317 if (header.Parse(data, &data_offset))
318 {
319 if (data_sp)
320 {
321 ModuleSpec spec;
322 spec.GetFileSpec() = file;
323 spec.GetArchitecture().SetArchitecture(eArchTypeELF,
324 header.e_machine,
325 LLDB_INVALID_CPUTYPE);
326 if (spec.GetArchitecture().IsValid())
327 {
328 // We could parse the ABI tag information (in .note, .notes, or .note.ABI-tag) to get the
329 // machine information. However, this info isn't guaranteed to exist or be correct. Details:
330 // http://refspecs.linuxfoundation.org/LSB_1.2.0/gLSB/noteabitag.html
331 // Instead of passing potentially incorrect information down the pipeline, grab
332 // the host information and use it.
333 spec.GetArchitecture().GetTriple().setOSName (Host::GetOSString().GetCString());
334 spec.GetArchitecture().GetTriple().setVendorName(Host::GetVendorString().GetCString());
335
336 // Try to get the UUID from the section list. Usually that's at the end, so
337 // map the file in if we don't have it already.
338 size_t section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize;
339 if (section_header_end > data_sp->GetByteSize())
340 {
341 data_sp = file.MemoryMapFileContents (file_offset, section_header_end);
342 data.SetData(data_sp);
343 }
344
345 uint32_t gnu_debuglink_crc = 0;
346 std::string gnu_debuglink_file;
347 SectionHeaderColl section_headers;
348 lldb_private::UUID &uuid = spec.GetUUID();
349 GetSectionHeaderInfo(section_headers, data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc);
350
351 if (!uuid.IsValid())
352 {
353 if (!gnu_debuglink_crc)
354 {
355 // Need to map entire file into memory to calculate the crc.
356 data_sp = file.MemoryMapFileContents (file_offset, SIZE_MAX);
357 data.SetData(data_sp);
358 gnu_debuglink_crc = calc_gnu_debuglink_crc32 (data.GetDataStart(), data.GetByteSize());
359 }
360 if (gnu_debuglink_crc)
361 {
362 // Use 4 bytes of crc from the .gnu_debuglink section.
363 uint32_t uuidt[4] = { gnu_debuglink_crc, 0, 0, 0 };
364 uuid.SetBytes (uuidt, sizeof(uuidt));
365 }
366 }
367
368 specs.Append(spec);
369 }
370 }
371 }
372 }
373
374 return specs.GetSize() - initial_count;
375 }
376
377 //------------------------------------------------------------------
378 // PluginInterface protocol
379 //------------------------------------------------------------------
380 lldb_private::ConstString
GetPluginName()381 ObjectFileELF::GetPluginName()
382 {
383 return GetPluginNameStatic();
384 }
385
386 uint32_t
GetPluginVersion()387 ObjectFileELF::GetPluginVersion()
388 {
389 return m_plugin_version;
390 }
391 //------------------------------------------------------------------
392 // ObjectFile protocol
393 //------------------------------------------------------------------
394
ObjectFileELF(const lldb::ModuleSP & module_sp,DataBufferSP & data_sp,lldb::offset_t data_offset,const FileSpec * file,lldb::offset_t file_offset,lldb::offset_t length)395 ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
396 DataBufferSP& data_sp,
397 lldb::offset_t data_offset,
398 const FileSpec* file,
399 lldb::offset_t file_offset,
400 lldb::offset_t length) :
401 ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
402 m_header(),
403 m_program_headers(),
404 m_section_headers(),
405 m_filespec_ap()
406 {
407 if (file)
408 m_file = *file;
409 ::memset(&m_header, 0, sizeof(m_header));
410 m_gnu_debuglink_crc = 0;
411 m_gnu_debuglink_file.clear();
412 }
413
~ObjectFileELF()414 ObjectFileELF::~ObjectFileELF()
415 {
416 }
417
418 bool
IsExecutable() const419 ObjectFileELF::IsExecutable() const
420 {
421 return m_header.e_entry != 0;
422 }
423
424 ByteOrder
GetByteOrder() const425 ObjectFileELF::GetByteOrder() const
426 {
427 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
428 return eByteOrderBig;
429 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
430 return eByteOrderLittle;
431 return eByteOrderInvalid;
432 }
433
434 uint32_t
GetAddressByteSize() const435 ObjectFileELF::GetAddressByteSize() const
436 {
437 return m_data.GetAddressByteSize();
438 }
439
440 size_t
SectionIndex(const SectionHeaderCollIter & I)441 ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I)
442 {
443 return std::distance(m_section_headers.begin(), I) + 1u;
444 }
445
446 size_t
SectionIndex(const SectionHeaderCollConstIter & I) const447 ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const
448 {
449 return std::distance(m_section_headers.begin(), I) + 1u;
450 }
451
452 bool
ParseHeader()453 ObjectFileELF::ParseHeader()
454 {
455 lldb::offset_t offset = 0;
456 return m_header.Parse(m_data, &offset);
457 }
458
459 bool
GetUUID(lldb_private::UUID * uuid)460 ObjectFileELF::GetUUID(lldb_private::UUID* uuid)
461 {
462 // Need to parse the section list to get the UUIDs, so make sure that's been done.
463 if (!ParseSectionHeaders())
464 return false;
465
466 if (m_uuid.IsValid())
467 {
468 // We have the full build id uuid.
469 *uuid = m_uuid;
470 return true;
471 }
472 else
473 {
474 if (!m_gnu_debuglink_crc)
475 m_gnu_debuglink_crc = calc_gnu_debuglink_crc32 (m_data.GetDataStart(), m_data.GetByteSize());
476 if (m_gnu_debuglink_crc)
477 {
478 // Use 4 bytes of crc from the .gnu_debuglink section.
479 uint32_t uuidt[4] = { m_gnu_debuglink_crc, 0, 0, 0 };
480 uuid->SetBytes (uuidt, sizeof(uuidt));
481 return true;
482 }
483 }
484
485 return false;
486 }
487
488 lldb_private::FileSpecList
GetDebugSymbolFilePaths()489 ObjectFileELF::GetDebugSymbolFilePaths()
490 {
491 FileSpecList file_spec_list;
492
493 if (!m_gnu_debuglink_file.empty())
494 {
495 FileSpec file_spec (m_gnu_debuglink_file.c_str(), false);
496 file_spec_list.Append (file_spec);
497 }
498 return file_spec_list;
499 }
500
501 uint32_t
GetDependentModules(FileSpecList & files)502 ObjectFileELF::GetDependentModules(FileSpecList &files)
503 {
504 size_t num_modules = ParseDependentModules();
505 uint32_t num_specs = 0;
506
507 for (unsigned i = 0; i < num_modules; ++i)
508 {
509 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i)))
510 num_specs++;
511 }
512
513 return num_specs;
514 }
515
516 Address
GetImageInfoAddress()517 ObjectFileELF::GetImageInfoAddress()
518 {
519 if (!ParseDynamicSymbols())
520 return Address();
521
522 SectionList *section_list = GetSectionList();
523 if (!section_list)
524 return Address();
525
526 // Find the SHT_DYNAMIC (.dynamic) section.
527 SectionSP dynsym_section_sp (section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true));
528 if (!dynsym_section_sp)
529 return Address();
530 assert (dynsym_section_sp->GetObjectFile() == this);
531
532 user_id_t dynsym_id = dynsym_section_sp->GetID();
533 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
534 if (!dynsym_hdr)
535 return Address();
536
537 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i)
538 {
539 ELFDynamic &symbol = m_dynamic_symbols[i];
540
541 if (symbol.d_tag == DT_DEBUG)
542 {
543 // Compute the offset as the number of previous entries plus the
544 // size of d_tag.
545 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
546 return Address(dynsym_section_sp, offset);
547 }
548 }
549
550 return Address();
551 }
552
553 lldb_private::Address
GetEntryPointAddress()554 ObjectFileELF::GetEntryPointAddress ()
555 {
556 if (m_entry_point_address.IsValid())
557 return m_entry_point_address;
558
559 if (!ParseHeader() || !IsExecutable())
560 return m_entry_point_address;
561
562 SectionList *section_list = GetSectionList();
563 addr_t offset = m_header.e_entry;
564
565 if (!section_list)
566 m_entry_point_address.SetOffset(offset);
567 else
568 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
569 return m_entry_point_address;
570 }
571
572 //----------------------------------------------------------------------
573 // ParseDependentModules
574 //----------------------------------------------------------------------
575 size_t
ParseDependentModules()576 ObjectFileELF::ParseDependentModules()
577 {
578 if (m_filespec_ap.get())
579 return m_filespec_ap->GetSize();
580
581 m_filespec_ap.reset(new FileSpecList());
582
583 if (!ParseSectionHeaders())
584 return 0;
585
586 SectionList *section_list = GetSectionList();
587 if (!section_list)
588 return 0;
589
590 // Find the SHT_DYNAMIC section.
591 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
592 if (!dynsym)
593 return 0;
594 assert (dynsym->GetObjectFile() == this);
595
596 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex (dynsym->GetID());
597 if (!header)
598 return 0;
599 // sh_link: section header index of string table used by entries in the section.
600 Section *dynstr = section_list->FindSectionByID (header->sh_link + 1).get();
601 if (!dynstr)
602 return 0;
603
604 DataExtractor dynsym_data;
605 DataExtractor dynstr_data;
606 if (ReadSectionData(dynsym, dynsym_data) &&
607 ReadSectionData(dynstr, dynstr_data))
608 {
609 ELFDynamic symbol;
610 const lldb::offset_t section_size = dynsym_data.GetByteSize();
611 lldb::offset_t offset = 0;
612
613 // The only type of entries we are concerned with are tagged DT_NEEDED,
614 // yielding the name of a required library.
615 while (offset < section_size)
616 {
617 if (!symbol.Parse(dynsym_data, &offset))
618 break;
619
620 if (symbol.d_tag != DT_NEEDED)
621 continue;
622
623 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
624 const char *lib_name = dynstr_data.PeekCStr(str_index);
625 m_filespec_ap->Append(FileSpec(lib_name, true));
626 }
627 }
628
629 return m_filespec_ap->GetSize();
630 }
631
632 //----------------------------------------------------------------------
633 // ParseProgramHeaders
634 //----------------------------------------------------------------------
635 size_t
ParseProgramHeaders()636 ObjectFileELF::ParseProgramHeaders()
637 {
638 // We have already parsed the program headers
639 if (!m_program_headers.empty())
640 return m_program_headers.size();
641
642 // If there are no program headers to read we are done.
643 if (m_header.e_phnum == 0)
644 return 0;
645
646 m_program_headers.resize(m_header.e_phnum);
647 if (m_program_headers.size() != m_header.e_phnum)
648 return 0;
649
650 const size_t ph_size = m_header.e_phnum * m_header.e_phentsize;
651 const elf_off ph_offset = m_header.e_phoff;
652 DataExtractor data;
653 if (GetData (ph_offset, ph_size, data) != ph_size)
654 return 0;
655
656 uint32_t idx;
657 lldb::offset_t offset;
658 for (idx = 0, offset = 0; idx < m_header.e_phnum; ++idx)
659 {
660 if (m_program_headers[idx].Parse(data, &offset) == false)
661 break;
662 }
663
664 if (idx < m_program_headers.size())
665 m_program_headers.resize(idx);
666
667 return m_program_headers.size();
668 }
669
670 static bool
ParseNoteGNUBuildID(DataExtractor & data,lldb_private::UUID & uuid)671 ParseNoteGNUBuildID(DataExtractor &data, lldb_private::UUID &uuid)
672 {
673 // Try to parse the note section (ie .note.gnu.build-id|.notes|.note|...) and get the build id.
674 // BuildID documentation: https://fedoraproject.org/wiki/Releases/FeatureBuildId
675 struct
676 {
677 uint32_t name_len; // Length of note name
678 uint32_t desc_len; // Length of note descriptor
679 uint32_t type; // Type of note (1 is ABI_TAG, 3 is BUILD_ID)
680 } notehdr;
681 lldb::offset_t offset = 0;
682 static const uint32_t g_gnu_build_id = 3; // NT_GNU_BUILD_ID from elf.h
683
684 while (true)
685 {
686 if (data.GetU32 (&offset, ¬ehdr, 3) == NULL)
687 return false;
688
689 notehdr.name_len = llvm::RoundUpToAlignment (notehdr.name_len, 4);
690 notehdr.desc_len = llvm::RoundUpToAlignment (notehdr.desc_len, 4);
691
692 lldb::offset_t offset_next_note = offset + notehdr.name_len + notehdr.desc_len;
693
694 // 16 bytes is UUID|MD5, 20 bytes is SHA1
695 if ((notehdr.type == g_gnu_build_id) && (notehdr.name_len == 4) &&
696 (notehdr.desc_len == 16 || notehdr.desc_len == 20))
697 {
698 char name[4];
699 if (data.GetU8 (&offset, name, 4) == NULL)
700 return false;
701 if (!strcmp(name, "GNU"))
702 {
703 uint8_t uuidbuf[20];
704 if (data.GetU8 (&offset, &uuidbuf, notehdr.desc_len) == NULL)
705 return false;
706 uuid.SetBytes (uuidbuf, notehdr.desc_len);
707 return true;
708 }
709 }
710 offset = offset_next_note;
711 }
712 return false;
713 }
714
715 //----------------------------------------------------------------------
716 // GetSectionHeaderInfo
717 //----------------------------------------------------------------------
718 size_t
GetSectionHeaderInfo(SectionHeaderColl & section_headers,lldb_private::DataExtractor & object_data,const elf::ELFHeader & header,lldb_private::UUID & uuid,std::string & gnu_debuglink_file,uint32_t & gnu_debuglink_crc)719 ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_headers,
720 lldb_private::DataExtractor &object_data,
721 const elf::ELFHeader &header,
722 lldb_private::UUID &uuid,
723 std::string &gnu_debuglink_file,
724 uint32_t &gnu_debuglink_crc)
725 {
726 // We have already parsed the section headers
727 if (!section_headers.empty())
728 return section_headers.size();
729
730 // If there are no section headers we are done.
731 if (header.e_shnum == 0)
732 return 0;
733
734 section_headers.resize(header.e_shnum);
735 if (section_headers.size() != header.e_shnum)
736 return 0;
737
738 const size_t sh_size = header.e_shnum * header.e_shentsize;
739 const elf_off sh_offset = header.e_shoff;
740 DataExtractor sh_data;
741 if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size)
742 return 0;
743
744 uint32_t idx;
745 lldb::offset_t offset;
746 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx)
747 {
748 if (section_headers[idx].Parse(sh_data, &offset) == false)
749 break;
750 }
751 if (idx < section_headers.size())
752 section_headers.resize(idx);
753
754 const unsigned strtab_idx = header.e_shstrndx;
755 if (strtab_idx && strtab_idx < section_headers.size())
756 {
757 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
758 const size_t byte_size = sheader.sh_size;
759 const Elf64_Off offset = sheader.sh_offset;
760 lldb_private::DataExtractor shstr_data;
761
762 if (shstr_data.SetData (object_data, offset, byte_size) == byte_size)
763 {
764 for (SectionHeaderCollIter I = section_headers.begin();
765 I != section_headers.end(); ++I)
766 {
767 static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink");
768 const ELFSectionHeaderInfo &header = *I;
769 const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
770 ConstString name(shstr_data.PeekCStr(I->sh_name));
771
772 I->section_name = name;
773
774 if (name == g_sect_name_gnu_debuglink)
775 {
776 DataExtractor data;
777 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
778 {
779 lldb::offset_t gnu_debuglink_offset = 0;
780 gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset);
781 gnu_debuglink_offset = llvm::RoundUpToAlignment (gnu_debuglink_offset, 4);
782 data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
783 }
784 }
785
786 if (header.sh_type == SHT_NOTE && !uuid.IsValid())
787 {
788 DataExtractor data;
789 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
790 {
791 ParseNoteGNUBuildID (data, uuid);
792 }
793 }
794 }
795
796 return section_headers.size();
797 }
798 }
799
800 section_headers.clear();
801 return 0;
802 }
803
804 size_t
GetProgramHeaderCount()805 ObjectFileELF::GetProgramHeaderCount()
806 {
807 return ParseProgramHeaders();
808 }
809
810 const elf::ELFProgramHeader *
GetProgramHeaderByIndex(lldb::user_id_t id)811 ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id)
812 {
813 if (!id || !ParseProgramHeaders())
814 return NULL;
815
816 if (--id < m_program_headers.size())
817 return &m_program_headers[id];
818
819 return NULL;
820 }
821
822 DataExtractor
GetSegmentDataByIndex(lldb::user_id_t id)823 ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id)
824 {
825 const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id);
826 if (segment_header == NULL)
827 return DataExtractor();
828 return DataExtractor(m_data, segment_header->p_offset, segment_header->p_filesz);
829 }
830
831 //----------------------------------------------------------------------
832 // ParseSectionHeaders
833 //----------------------------------------------------------------------
834 size_t
ParseSectionHeaders()835 ObjectFileELF::ParseSectionHeaders()
836 {
837 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, m_gnu_debuglink_file, m_gnu_debuglink_crc);
838 }
839
840 const ObjectFileELF::ELFSectionHeaderInfo *
GetSectionHeaderByIndex(lldb::user_id_t id)841 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id)
842 {
843 if (!id || !ParseSectionHeaders())
844 return NULL;
845
846 if (--id < m_section_headers.size())
847 return &m_section_headers[id];
848
849 return NULL;
850 }
851
852 void
CreateSections(SectionList & unified_section_list)853 ObjectFileELF::CreateSections(SectionList &unified_section_list)
854 {
855 if (!m_sections_ap.get() && ParseSectionHeaders())
856 {
857 m_sections_ap.reset(new SectionList());
858
859 for (SectionHeaderCollIter I = m_section_headers.begin();
860 I != m_section_headers.end(); ++I)
861 {
862 const ELFSectionHeaderInfo &header = *I;
863
864 ConstString& name = I->section_name;
865 const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
866 const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
867
868 static ConstString g_sect_name_text (".text");
869 static ConstString g_sect_name_data (".data");
870 static ConstString g_sect_name_bss (".bss");
871 static ConstString g_sect_name_tdata (".tdata");
872 static ConstString g_sect_name_tbss (".tbss");
873 static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev");
874 static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges");
875 static ConstString g_sect_name_dwarf_debug_frame (".debug_frame");
876 static ConstString g_sect_name_dwarf_debug_info (".debug_info");
877 static ConstString g_sect_name_dwarf_debug_line (".debug_line");
878 static ConstString g_sect_name_dwarf_debug_loc (".debug_loc");
879 static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo");
880 static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames");
881 static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes");
882 static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges");
883 static ConstString g_sect_name_dwarf_debug_str (".debug_str");
884 static ConstString g_sect_name_eh_frame (".eh_frame");
885
886 SectionType sect_type = eSectionTypeOther;
887
888 bool is_thread_specific = false;
889
890 if (name == g_sect_name_text) sect_type = eSectionTypeCode;
891 else if (name == g_sect_name_data) sect_type = eSectionTypeData;
892 else if (name == g_sect_name_bss) sect_type = eSectionTypeZeroFill;
893 else if (name == g_sect_name_tdata)
894 {
895 sect_type = eSectionTypeData;
896 is_thread_specific = true;
897 }
898 else if (name == g_sect_name_tbss)
899 {
900 sect_type = eSectionTypeZeroFill;
901 is_thread_specific = true;
902 }
903 // .debug_abbrev – Abbreviations used in the .debug_info section
904 // .debug_aranges – Lookup table for mapping addresses to compilation units
905 // .debug_frame – Call frame information
906 // .debug_info – The core DWARF information section
907 // .debug_line – Line number information
908 // .debug_loc – Location lists used in DW_AT_location attributes
909 // .debug_macinfo – Macro information
910 // .debug_pubnames – Lookup table for mapping object and function names to compilation units
911 // .debug_pubtypes – Lookup table for mapping type names to compilation units
912 // .debug_ranges – Address ranges used in DW_AT_ranges attributes
913 // .debug_str – String table used in .debug_info
914 // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
915 // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
916 // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
917 else if (name == g_sect_name_dwarf_debug_abbrev) sect_type = eSectionTypeDWARFDebugAbbrev;
918 else if (name == g_sect_name_dwarf_debug_aranges) sect_type = eSectionTypeDWARFDebugAranges;
919 else if (name == g_sect_name_dwarf_debug_frame) sect_type = eSectionTypeDWARFDebugFrame;
920 else if (name == g_sect_name_dwarf_debug_info) sect_type = eSectionTypeDWARFDebugInfo;
921 else if (name == g_sect_name_dwarf_debug_line) sect_type = eSectionTypeDWARFDebugLine;
922 else if (name == g_sect_name_dwarf_debug_loc) sect_type = eSectionTypeDWARFDebugLoc;
923 else if (name == g_sect_name_dwarf_debug_macinfo) sect_type = eSectionTypeDWARFDebugMacInfo;
924 else if (name == g_sect_name_dwarf_debug_pubnames) sect_type = eSectionTypeDWARFDebugPubNames;
925 else if (name == g_sect_name_dwarf_debug_pubtypes) sect_type = eSectionTypeDWARFDebugPubTypes;
926 else if (name == g_sect_name_dwarf_debug_ranges) sect_type = eSectionTypeDWARFDebugRanges;
927 else if (name == g_sect_name_dwarf_debug_str) sect_type = eSectionTypeDWARFDebugStr;
928 else if (name == g_sect_name_eh_frame) sect_type = eSectionTypeEHFrame;
929
930 switch (header.sh_type)
931 {
932 case SHT_SYMTAB:
933 assert (sect_type == eSectionTypeOther);
934 sect_type = eSectionTypeELFSymbolTable;
935 break;
936 case SHT_DYNSYM:
937 assert (sect_type == eSectionTypeOther);
938 sect_type = eSectionTypeELFDynamicSymbols;
939 break;
940 case SHT_RELA:
941 case SHT_REL:
942 assert (sect_type == eSectionTypeOther);
943 sect_type = eSectionTypeELFRelocationEntries;
944 break;
945 case SHT_DYNAMIC:
946 assert (sect_type == eSectionTypeOther);
947 sect_type = eSectionTypeELFDynamicLinkInfo;
948 break;
949 }
950
951 SectionSP section_sp (new Section(GetModule(), // Module to which this section belongs.
952 this, // ObjectFile to which this section belongs and should read section data from.
953 SectionIndex(I), // Section ID.
954 name, // Section name.
955 sect_type, // Section type.
956 header.sh_addr, // VM address.
957 vm_size, // VM size in bytes of this section.
958 header.sh_offset, // Offset of this section in the file.
959 file_size, // Size of the section as found in the file.
960 header.sh_flags)); // Flags for this section.
961
962 if (is_thread_specific)
963 section_sp->SetIsThreadSpecific (is_thread_specific);
964 m_sections_ap->AddSection(section_sp);
965 }
966 }
967
968 if (m_sections_ap.get())
969 {
970 if (GetType() == eTypeDebugInfo)
971 {
972 static const SectionType g_sections[] =
973 {
974 eSectionTypeDWARFDebugAranges,
975 eSectionTypeDWARFDebugInfo,
976 eSectionTypeDWARFDebugAbbrev,
977 eSectionTypeDWARFDebugFrame,
978 eSectionTypeDWARFDebugLine,
979 eSectionTypeDWARFDebugStr,
980 eSectionTypeDWARFDebugLoc,
981 eSectionTypeDWARFDebugMacInfo,
982 eSectionTypeDWARFDebugPubNames,
983 eSectionTypeDWARFDebugPubTypes,
984 eSectionTypeDWARFDebugRanges,
985 eSectionTypeELFSymbolTable,
986 };
987 SectionList *elf_section_list = m_sections_ap.get();
988 for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx)
989 {
990 SectionType section_type = g_sections[idx];
991 SectionSP section_sp (elf_section_list->FindSectionByType (section_type, true));
992 if (section_sp)
993 {
994 SectionSP module_section_sp (unified_section_list.FindSectionByType (section_type, true));
995 if (module_section_sp)
996 unified_section_list.ReplaceSection (module_section_sp->GetID(), section_sp);
997 else
998 unified_section_list.AddSection (section_sp);
999 }
1000 }
1001 }
1002 else
1003 {
1004 unified_section_list = *m_sections_ap;
1005 }
1006 }
1007 }
1008
1009 // private
1010 unsigned
ParseSymbols(Symtab * symtab,user_id_t start_id,SectionList * section_list,const size_t num_symbols,const DataExtractor & symtab_data,const DataExtractor & strtab_data)1011 ObjectFileELF::ParseSymbols (Symtab *symtab,
1012 user_id_t start_id,
1013 SectionList *section_list,
1014 const size_t num_symbols,
1015 const DataExtractor &symtab_data,
1016 const DataExtractor &strtab_data)
1017 {
1018 ELFSymbol symbol;
1019 lldb::offset_t offset = 0;
1020
1021 static ConstString text_section_name(".text");
1022 static ConstString init_section_name(".init");
1023 static ConstString fini_section_name(".fini");
1024 static ConstString ctors_section_name(".ctors");
1025 static ConstString dtors_section_name(".dtors");
1026
1027 static ConstString data_section_name(".data");
1028 static ConstString rodata_section_name(".rodata");
1029 static ConstString rodata1_section_name(".rodata1");
1030 static ConstString data2_section_name(".data1");
1031 static ConstString bss_section_name(".bss");
1032
1033 //StreamFile strm(stdout, false);
1034 unsigned i;
1035 for (i = 0; i < num_symbols; ++i)
1036 {
1037 if (symbol.Parse(symtab_data, &offset) == false)
1038 break;
1039
1040 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1041
1042 // No need to add symbols that have no names
1043 if (symbol_name == NULL || symbol_name[0] == '\0')
1044 continue;
1045
1046 //symbol.Dump (&strm, i, &strtab_data, section_list);
1047
1048 SectionSP symbol_section_sp;
1049 SymbolType symbol_type = eSymbolTypeInvalid;
1050 Elf64_Half symbol_idx = symbol.st_shndx;
1051
1052 switch (symbol_idx)
1053 {
1054 case SHN_ABS:
1055 symbol_type = eSymbolTypeAbsolute;
1056 break;
1057 case SHN_UNDEF:
1058 symbol_type = eSymbolTypeUndefined;
1059 break;
1060 default:
1061 symbol_section_sp = section_list->GetSectionAtIndex(symbol_idx);
1062 break;
1063 }
1064
1065 // If a symbol is undefined do not process it further even if it has a STT type
1066 if (symbol_type != eSymbolTypeUndefined)
1067 {
1068 switch (symbol.getType())
1069 {
1070 default:
1071 case STT_NOTYPE:
1072 // The symbol's type is not specified.
1073 break;
1074
1075 case STT_OBJECT:
1076 // The symbol is associated with a data object, such as a variable,
1077 // an array, etc.
1078 symbol_type = eSymbolTypeData;
1079 break;
1080
1081 case STT_FUNC:
1082 // The symbol is associated with a function or other executable code.
1083 symbol_type = eSymbolTypeCode;
1084 break;
1085
1086 case STT_SECTION:
1087 // The symbol is associated with a section. Symbol table entries of
1088 // this type exist primarily for relocation and normally have
1089 // STB_LOCAL binding.
1090 break;
1091
1092 case STT_FILE:
1093 // Conventionally, the symbol's name gives the name of the source
1094 // file associated with the object file. A file symbol has STB_LOCAL
1095 // binding, its section index is SHN_ABS, and it precedes the other
1096 // STB_LOCAL symbols for the file, if it is present.
1097 symbol_type = eSymbolTypeSourceFile;
1098 break;
1099
1100 case STT_GNU_IFUNC:
1101 // The symbol is associated with an indirect function. The actual
1102 // function will be resolved if it is referenced.
1103 symbol_type = eSymbolTypeResolver;
1104 break;
1105 }
1106 }
1107
1108 if (symbol_type == eSymbolTypeInvalid)
1109 {
1110 if (symbol_section_sp)
1111 {
1112 const ConstString §_name = symbol_section_sp->GetName();
1113 if (sect_name == text_section_name ||
1114 sect_name == init_section_name ||
1115 sect_name == fini_section_name ||
1116 sect_name == ctors_section_name ||
1117 sect_name == dtors_section_name)
1118 {
1119 symbol_type = eSymbolTypeCode;
1120 }
1121 else if (sect_name == data_section_name ||
1122 sect_name == data2_section_name ||
1123 sect_name == rodata_section_name ||
1124 sect_name == rodata1_section_name ||
1125 sect_name == bss_section_name)
1126 {
1127 symbol_type = eSymbolTypeData;
1128 }
1129 }
1130 }
1131
1132 // If the symbol section we've found has no data (SHT_NOBITS), then check the module section
1133 // list. This can happen if we're parsing the debug file and it has no .text section, for example.
1134 if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0))
1135 {
1136 ModuleSP module_sp(GetModule());
1137 if (module_sp)
1138 {
1139 SectionList *module_section_list = module_sp->GetSectionList();
1140 if (module_section_list && module_section_list != section_list)
1141 {
1142 const ConstString §_name = symbol_section_sp->GetName();
1143 lldb::SectionSP section_sp (module_section_list->FindSectionByName (sect_name));
1144 if (section_sp && section_sp->GetFileSize())
1145 {
1146 symbol_section_sp = section_sp;
1147 }
1148 }
1149 }
1150 }
1151
1152 uint64_t symbol_value = symbol.st_value;
1153 if (symbol_section_sp)
1154 symbol_value -= symbol_section_sp->GetFileAddress();
1155 bool is_global = symbol.getBinding() == STB_GLOBAL;
1156 uint32_t flags = symbol.st_other << 8 | symbol.st_info;
1157 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
1158 Symbol dc_symbol(
1159 i + start_id, // ID is the original symbol table index.
1160 symbol_name, // Symbol name.
1161 is_mangled, // Is the symbol name mangled?
1162 symbol_type, // Type of this symbol
1163 is_global, // Is this globally visible?
1164 false, // Is this symbol debug info?
1165 false, // Is this symbol a trampoline?
1166 false, // Is this symbol artificial?
1167 symbol_section_sp, // Section in which this symbol is defined or null.
1168 symbol_value, // Offset in section or symbol value.
1169 symbol.st_size, // Size in bytes of this symbol.
1170 true, // Size is valid
1171 flags); // Symbol flags.
1172 symtab->AddSymbol(dc_symbol);
1173 }
1174
1175 return i;
1176 }
1177
1178 unsigned
ParseSymbolTable(Symtab * symbol_table,user_id_t start_id,lldb_private::Section * symtab)1179 ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab)
1180 {
1181 if (symtab->GetObjectFile() != this)
1182 {
1183 // If the symbol table section is owned by a different object file, have it do the
1184 // parsing.
1185 ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile());
1186 return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
1187 }
1188
1189 // Get section list for this object file.
1190 SectionList *section_list = m_sections_ap.get();
1191 if (!section_list)
1192 return 0;
1193
1194 user_id_t symtab_id = symtab->GetID();
1195 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
1196 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
1197 symtab_hdr->sh_type == SHT_DYNSYM);
1198
1199 // sh_link: section header index of associated string table.
1200 // Section ID's are ones based.
1201 user_id_t strtab_id = symtab_hdr->sh_link + 1;
1202 Section *strtab = section_list->FindSectionByID(strtab_id).get();
1203
1204 unsigned num_symbols = 0;
1205 if (symtab && strtab)
1206 {
1207 assert (symtab->GetObjectFile() == this);
1208 assert (strtab->GetObjectFile() == this);
1209
1210 DataExtractor symtab_data;
1211 DataExtractor strtab_data;
1212 if (ReadSectionData(symtab, symtab_data) &&
1213 ReadSectionData(strtab, strtab_data))
1214 {
1215 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
1216
1217 num_symbols = ParseSymbols(symbol_table, start_id,
1218 section_list, num_symbols,
1219 symtab_data, strtab_data);
1220 }
1221 }
1222
1223 return num_symbols;
1224 }
1225
1226 size_t
ParseDynamicSymbols()1227 ObjectFileELF::ParseDynamicSymbols()
1228 {
1229 if (m_dynamic_symbols.size())
1230 return m_dynamic_symbols.size();
1231
1232 SectionList *section_list = GetSectionList();
1233 if (!section_list)
1234 return 0;
1235
1236 // Find the SHT_DYNAMIC section.
1237 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
1238 if (!dynsym)
1239 return 0;
1240 assert (dynsym->GetObjectFile() == this);
1241
1242 ELFDynamic symbol;
1243 DataExtractor dynsym_data;
1244 if (ReadSectionData(dynsym, dynsym_data))
1245 {
1246 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1247 lldb::offset_t cursor = 0;
1248
1249 while (cursor < section_size)
1250 {
1251 if (!symbol.Parse(dynsym_data, &cursor))
1252 break;
1253
1254 m_dynamic_symbols.push_back(symbol);
1255 }
1256 }
1257
1258 return m_dynamic_symbols.size();
1259 }
1260
1261 const ELFDynamic *
FindDynamicSymbol(unsigned tag)1262 ObjectFileELF::FindDynamicSymbol(unsigned tag)
1263 {
1264 if (!ParseDynamicSymbols())
1265 return NULL;
1266
1267 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
1268 DynamicSymbolCollIter E = m_dynamic_symbols.end();
1269 for ( ; I != E; ++I)
1270 {
1271 ELFDynamic *symbol = &*I;
1272
1273 if (symbol->d_tag == tag)
1274 return symbol;
1275 }
1276
1277 return NULL;
1278 }
1279
1280 unsigned
PLTRelocationType()1281 ObjectFileELF::PLTRelocationType()
1282 {
1283 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
1284
1285 if (symbol)
1286 return symbol->d_val;
1287
1288 return 0;
1289 }
1290
1291 static unsigned
ParsePLTRelocations(Symtab * symbol_table,user_id_t start_id,unsigned rel_type,const ELFHeader * hdr,const ELFSectionHeader * rel_hdr,const ELFSectionHeader * plt_hdr,const ELFSectionHeader * sym_hdr,const lldb::SectionSP & plt_section_sp,DataExtractor & rel_data,DataExtractor & symtab_data,DataExtractor & strtab_data)1292 ParsePLTRelocations(Symtab *symbol_table,
1293 user_id_t start_id,
1294 unsigned rel_type,
1295 const ELFHeader *hdr,
1296 const ELFSectionHeader *rel_hdr,
1297 const ELFSectionHeader *plt_hdr,
1298 const ELFSectionHeader *sym_hdr,
1299 const lldb::SectionSP &plt_section_sp,
1300 DataExtractor &rel_data,
1301 DataExtractor &symtab_data,
1302 DataExtractor &strtab_data)
1303 {
1304 ELFRelocation rel(rel_type);
1305 ELFSymbol symbol;
1306 lldb::offset_t offset = 0;
1307 const elf_xword plt_entsize = plt_hdr->sh_entsize;
1308 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
1309
1310 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
1311 reloc_info_fn reloc_type;
1312 reloc_info_fn reloc_symbol;
1313
1314 if (hdr->Is32Bit())
1315 {
1316 reloc_type = ELFRelocation::RelocType32;
1317 reloc_symbol = ELFRelocation::RelocSymbol32;
1318 }
1319 else
1320 {
1321 reloc_type = ELFRelocation::RelocType64;
1322 reloc_symbol = ELFRelocation::RelocSymbol64;
1323 }
1324
1325 unsigned slot_type = hdr->GetRelocationJumpSlotType();
1326 unsigned i;
1327 for (i = 0; i < num_relocations; ++i)
1328 {
1329 if (rel.Parse(rel_data, &offset) == false)
1330 break;
1331
1332 if (reloc_type(rel) != slot_type)
1333 continue;
1334
1335 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
1336 uint64_t plt_index = (i + 1) * plt_entsize;
1337
1338 if (!symbol.Parse(symtab_data, &symbol_offset))
1339 break;
1340
1341 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1342 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
1343
1344 Symbol jump_symbol(
1345 i + start_id, // Symbol table index
1346 symbol_name, // symbol name.
1347 is_mangled, // is the symbol name mangled?
1348 eSymbolTypeTrampoline, // Type of this symbol
1349 false, // Is this globally visible?
1350 false, // Is this symbol debug info?
1351 true, // Is this symbol a trampoline?
1352 true, // Is this symbol artificial?
1353 plt_section_sp, // Section in which this symbol is defined or null.
1354 plt_index, // Offset in section or symbol value.
1355 plt_entsize, // Size in bytes of this symbol.
1356 true, // Size is valid
1357 0); // Symbol flags.
1358
1359 symbol_table->AddSymbol(jump_symbol);
1360 }
1361
1362 return i;
1363 }
1364
1365 unsigned
ParseTrampolineSymbols(Symtab * symbol_table,user_id_t start_id,const ELFSectionHeaderInfo * rel_hdr,user_id_t rel_id)1366 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table,
1367 user_id_t start_id,
1368 const ELFSectionHeaderInfo *rel_hdr,
1369 user_id_t rel_id)
1370 {
1371 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
1372
1373 // The link field points to the associated symbol table. The info field
1374 // points to the section holding the plt.
1375 user_id_t symtab_id = rel_hdr->sh_link;
1376 user_id_t plt_id = rel_hdr->sh_info;
1377
1378 if (!symtab_id || !plt_id)
1379 return 0;
1380
1381 // Section ID's are ones based;
1382 symtab_id++;
1383 plt_id++;
1384
1385 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
1386 if (!plt_hdr)
1387 return 0;
1388
1389 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
1390 if (!sym_hdr)
1391 return 0;
1392
1393 SectionList *section_list = m_sections_ap.get();
1394 if (!section_list)
1395 return 0;
1396
1397 Section *rel_section = section_list->FindSectionByID(rel_id).get();
1398 if (!rel_section)
1399 return 0;
1400
1401 SectionSP plt_section_sp (section_list->FindSectionByID(plt_id));
1402 if (!plt_section_sp)
1403 return 0;
1404
1405 Section *symtab = section_list->FindSectionByID(symtab_id).get();
1406 if (!symtab)
1407 return 0;
1408
1409 // sh_link points to associated string table.
1410 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
1411 if (!strtab)
1412 return 0;
1413
1414 DataExtractor rel_data;
1415 if (!ReadSectionData(rel_section, rel_data))
1416 return 0;
1417
1418 DataExtractor symtab_data;
1419 if (!ReadSectionData(symtab, symtab_data))
1420 return 0;
1421
1422 DataExtractor strtab_data;
1423 if (!ReadSectionData(strtab, strtab_data))
1424 return 0;
1425
1426 unsigned rel_type = PLTRelocationType();
1427 if (!rel_type)
1428 return 0;
1429
1430 return ParsePLTRelocations (symbol_table,
1431 start_id,
1432 rel_type,
1433 &m_header,
1434 rel_hdr,
1435 plt_hdr,
1436 sym_hdr,
1437 plt_section_sp,
1438 rel_data,
1439 symtab_data,
1440 strtab_data);
1441 }
1442
1443 Symtab *
GetSymtab()1444 ObjectFileELF::GetSymtab()
1445 {
1446 ModuleSP module_sp(GetModule());
1447 if (!module_sp)
1448 return NULL;
1449
1450 // We always want to use the main object file so we (hopefully) only have one cached copy
1451 // of our symtab, dynamic sections, etc.
1452 ObjectFile *module_obj_file = module_sp->GetObjectFile();
1453 if (module_obj_file && module_obj_file != this)
1454 return module_obj_file->GetSymtab();
1455
1456 if (m_symtab_ap.get() == NULL)
1457 {
1458 SectionList *section_list = GetSectionList();
1459 if (!section_list)
1460 return NULL;
1461
1462 uint64_t symbol_id = 0;
1463 lldb_private::Mutex::Locker locker(module_sp->GetMutex());
1464
1465 m_symtab_ap.reset(new Symtab(this));
1466
1467 // Sharable objects and dynamic executables usually have 2 distinct symbol
1468 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller
1469 // version of the symtab that only contains global symbols. The information found
1470 // in the dynsym is therefore also found in the symtab, while the reverse is not
1471 // necessarily true.
1472 Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get();
1473 if (!symtab)
1474 {
1475 // The symtab section is non-allocable and can be stripped, so if it doesn't exist
1476 // then use the dynsym section which should always be there.
1477 symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get();
1478 }
1479 if (symtab)
1480 symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab);
1481
1482 // Synthesize trampoline symbols to help navigate the PLT.
1483 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
1484 if (symbol)
1485 {
1486 addr_t addr = symbol->d_ptr;
1487 Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get();
1488 if (reloc_section)
1489 {
1490 user_id_t reloc_id = reloc_section->GetID();
1491 const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id);
1492 assert(reloc_header);
1493
1494 ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id);
1495 }
1496 }
1497 }
1498 return m_symtab_ap.get();
1499 }
1500
1501 bool
IsStripped()1502 ObjectFileELF::IsStripped ()
1503 {
1504 // TODO: determine this for ELF
1505 return false;
1506 }
1507
1508 //===----------------------------------------------------------------------===//
1509 // Dump
1510 //
1511 // Dump the specifics of the runtime file container (such as any headers
1512 // segments, sections, etc).
1513 //----------------------------------------------------------------------
1514 void
Dump(Stream * s)1515 ObjectFileELF::Dump(Stream *s)
1516 {
1517 DumpELFHeader(s, m_header);
1518 s->EOL();
1519 DumpELFProgramHeaders(s);
1520 s->EOL();
1521 DumpELFSectionHeaders(s);
1522 s->EOL();
1523 SectionList *section_list = GetSectionList();
1524 if (section_list)
1525 section_list->Dump(s, NULL, true, UINT32_MAX);
1526 Symtab *symtab = GetSymtab();
1527 if (symtab)
1528 symtab->Dump(s, NULL, eSortOrderNone);
1529 s->EOL();
1530 DumpDependentModules(s);
1531 s->EOL();
1532 }
1533
1534 //----------------------------------------------------------------------
1535 // DumpELFHeader
1536 //
1537 // Dump the ELF header to the specified output stream
1538 //----------------------------------------------------------------------
1539 void
DumpELFHeader(Stream * s,const ELFHeader & header)1540 ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header)
1541 {
1542 s->PutCString("ELF Header\n");
1543 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
1544 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n",
1545 header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]);
1546 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n",
1547 header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]);
1548 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n",
1549 header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]);
1550
1551 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
1552 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
1553 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
1554 s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
1555 s->Printf ("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
1556
1557 s->Printf("e_type = 0x%4.4x ", header.e_type);
1558 DumpELFHeader_e_type(s, header.e_type);
1559 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
1560 s->Printf("e_version = 0x%8.8x\n", header.e_version);
1561 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
1562 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
1563 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
1564 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
1565 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
1566 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
1567 s->Printf("e_phnum = 0x%4.4x\n", header.e_phnum);
1568 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
1569 s->Printf("e_shnum = 0x%4.4x\n", header.e_shnum);
1570 s->Printf("e_shstrndx = 0x%4.4x\n", header.e_shstrndx);
1571 }
1572
1573 //----------------------------------------------------------------------
1574 // DumpELFHeader_e_type
1575 //
1576 // Dump an token value for the ELF header member e_type
1577 //----------------------------------------------------------------------
1578 void
DumpELFHeader_e_type(Stream * s,elf_half e_type)1579 ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type)
1580 {
1581 switch (e_type)
1582 {
1583 case ET_NONE: *s << "ET_NONE"; break;
1584 case ET_REL: *s << "ET_REL"; break;
1585 case ET_EXEC: *s << "ET_EXEC"; break;
1586 case ET_DYN: *s << "ET_DYN"; break;
1587 case ET_CORE: *s << "ET_CORE"; break;
1588 default:
1589 break;
1590 }
1591 }
1592
1593 //----------------------------------------------------------------------
1594 // DumpELFHeader_e_ident_EI_DATA
1595 //
1596 // Dump an token value for the ELF header member e_ident[EI_DATA]
1597 //----------------------------------------------------------------------
1598 void
DumpELFHeader_e_ident_EI_DATA(Stream * s,unsigned char ei_data)1599 ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data)
1600 {
1601 switch (ei_data)
1602 {
1603 case ELFDATANONE: *s << "ELFDATANONE"; break;
1604 case ELFDATA2LSB: *s << "ELFDATA2LSB - Little Endian"; break;
1605 case ELFDATA2MSB: *s << "ELFDATA2MSB - Big Endian"; break;
1606 default:
1607 break;
1608 }
1609 }
1610
1611
1612 //----------------------------------------------------------------------
1613 // DumpELFProgramHeader
1614 //
1615 // Dump a single ELF program header to the specified output stream
1616 //----------------------------------------------------------------------
1617 void
DumpELFProgramHeader(Stream * s,const ELFProgramHeader & ph)1618 ObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph)
1619 {
1620 DumpELFProgramHeader_p_type(s, ph.p_type);
1621 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr);
1622 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, ph.p_flags);
1623
1624 DumpELFProgramHeader_p_flags(s, ph.p_flags);
1625 s->Printf(") %8.8" PRIx64, ph.p_align);
1626 }
1627
1628 //----------------------------------------------------------------------
1629 // DumpELFProgramHeader_p_type
1630 //
1631 // Dump an token value for the ELF program header member p_type which
1632 // describes the type of the program header
1633 // ----------------------------------------------------------------------
1634 void
DumpELFProgramHeader_p_type(Stream * s,elf_word p_type)1635 ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type)
1636 {
1637 const int kStrWidth = 15;
1638 switch (p_type)
1639 {
1640 CASE_AND_STREAM(s, PT_NULL , kStrWidth);
1641 CASE_AND_STREAM(s, PT_LOAD , kStrWidth);
1642 CASE_AND_STREAM(s, PT_DYNAMIC , kStrWidth);
1643 CASE_AND_STREAM(s, PT_INTERP , kStrWidth);
1644 CASE_AND_STREAM(s, PT_NOTE , kStrWidth);
1645 CASE_AND_STREAM(s, PT_SHLIB , kStrWidth);
1646 CASE_AND_STREAM(s, PT_PHDR , kStrWidth);
1647 CASE_AND_STREAM(s, PT_TLS , kStrWidth);
1648 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
1649 default:
1650 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
1651 break;
1652 }
1653 }
1654
1655
1656 //----------------------------------------------------------------------
1657 // DumpELFProgramHeader_p_flags
1658 //
1659 // Dump an token value for the ELF program header member p_flags
1660 //----------------------------------------------------------------------
1661 void
DumpELFProgramHeader_p_flags(Stream * s,elf_word p_flags)1662 ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags)
1663 {
1664 *s << ((p_flags & PF_X) ? "PF_X" : " ")
1665 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
1666 << ((p_flags & PF_W) ? "PF_W" : " ")
1667 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
1668 << ((p_flags & PF_R) ? "PF_R" : " ");
1669 }
1670
1671 //----------------------------------------------------------------------
1672 // DumpELFProgramHeaders
1673 //
1674 // Dump all of the ELF program header to the specified output stream
1675 //----------------------------------------------------------------------
1676 void
DumpELFProgramHeaders(Stream * s)1677 ObjectFileELF::DumpELFProgramHeaders(Stream *s)
1678 {
1679 if (ParseProgramHeaders())
1680 {
1681 s->PutCString("Program Headers\n");
1682 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
1683 "p_filesz p_memsz p_flags p_align\n");
1684 s->PutCString("==== --------------- -------- -------- -------- "
1685 "-------- -------- ------------------------- --------\n");
1686
1687 uint32_t idx = 0;
1688 for (ProgramHeaderCollConstIter I = m_program_headers.begin();
1689 I != m_program_headers.end(); ++I, ++idx)
1690 {
1691 s->Printf("[%2u] ", idx);
1692 ObjectFileELF::DumpELFProgramHeader(s, *I);
1693 s->EOL();
1694 }
1695 }
1696 }
1697
1698 //----------------------------------------------------------------------
1699 // DumpELFSectionHeader
1700 //
1701 // Dump a single ELF section header to the specified output stream
1702 //----------------------------------------------------------------------
1703 void
DumpELFSectionHeader(Stream * s,const ELFSectionHeaderInfo & sh)1704 ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh)
1705 {
1706 s->Printf("%8.8x ", sh.sh_name);
1707 DumpELFSectionHeader_sh_type(s, sh.sh_type);
1708 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
1709 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
1710 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, sh.sh_offset, sh.sh_size);
1711 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
1712 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
1713 }
1714
1715 //----------------------------------------------------------------------
1716 // DumpELFSectionHeader_sh_type
1717 //
1718 // Dump an token value for the ELF section header member sh_type which
1719 // describes the type of the section
1720 //----------------------------------------------------------------------
1721 void
DumpELFSectionHeader_sh_type(Stream * s,elf_word sh_type)1722 ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type)
1723 {
1724 const int kStrWidth = 12;
1725 switch (sh_type)
1726 {
1727 CASE_AND_STREAM(s, SHT_NULL , kStrWidth);
1728 CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth);
1729 CASE_AND_STREAM(s, SHT_SYMTAB , kStrWidth);
1730 CASE_AND_STREAM(s, SHT_STRTAB , kStrWidth);
1731 CASE_AND_STREAM(s, SHT_RELA , kStrWidth);
1732 CASE_AND_STREAM(s, SHT_HASH , kStrWidth);
1733 CASE_AND_STREAM(s, SHT_DYNAMIC , kStrWidth);
1734 CASE_AND_STREAM(s, SHT_NOTE , kStrWidth);
1735 CASE_AND_STREAM(s, SHT_NOBITS , kStrWidth);
1736 CASE_AND_STREAM(s, SHT_REL , kStrWidth);
1737 CASE_AND_STREAM(s, SHT_SHLIB , kStrWidth);
1738 CASE_AND_STREAM(s, SHT_DYNSYM , kStrWidth);
1739 CASE_AND_STREAM(s, SHT_LOPROC , kStrWidth);
1740 CASE_AND_STREAM(s, SHT_HIPROC , kStrWidth);
1741 CASE_AND_STREAM(s, SHT_LOUSER , kStrWidth);
1742 CASE_AND_STREAM(s, SHT_HIUSER , kStrWidth);
1743 default:
1744 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
1745 break;
1746 }
1747 }
1748
1749 //----------------------------------------------------------------------
1750 // DumpELFSectionHeader_sh_flags
1751 //
1752 // Dump an token value for the ELF section header member sh_flags
1753 //----------------------------------------------------------------------
1754 void
DumpELFSectionHeader_sh_flags(Stream * s,elf_xword sh_flags)1755 ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags)
1756 {
1757 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
1758 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
1759 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
1760 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
1761 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
1762 }
1763
1764 //----------------------------------------------------------------------
1765 // DumpELFSectionHeaders
1766 //
1767 // Dump all of the ELF section header to the specified output stream
1768 //----------------------------------------------------------------------
1769 void
DumpELFSectionHeaders(Stream * s)1770 ObjectFileELF::DumpELFSectionHeaders(Stream *s)
1771 {
1772 if (!ParseSectionHeaders())
1773 return;
1774
1775 s->PutCString("Section Headers\n");
1776 s->PutCString("IDX name type flags "
1777 "addr offset size link info addralgn "
1778 "entsize Name\n");
1779 s->PutCString("==== -------- ------------ -------------------------------- "
1780 "-------- -------- -------- -------- -------- -------- "
1781 "-------- ====================\n");
1782
1783 uint32_t idx = 0;
1784 for (SectionHeaderCollConstIter I = m_section_headers.begin();
1785 I != m_section_headers.end(); ++I, ++idx)
1786 {
1787 s->Printf("[%2u] ", idx);
1788 ObjectFileELF::DumpELFSectionHeader(s, *I);
1789 const char* section_name = I->section_name.AsCString("");
1790 if (section_name)
1791 *s << ' ' << section_name << "\n";
1792 }
1793 }
1794
1795 void
DumpDependentModules(lldb_private::Stream * s)1796 ObjectFileELF::DumpDependentModules(lldb_private::Stream *s)
1797 {
1798 size_t num_modules = ParseDependentModules();
1799
1800 if (num_modules > 0)
1801 {
1802 s->PutCString("Dependent Modules:\n");
1803 for (unsigned i = 0; i < num_modules; ++i)
1804 {
1805 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
1806 s->Printf(" %s\n", spec.GetFilename().GetCString());
1807 }
1808 }
1809 }
1810
1811 bool
GetArchitecture(ArchSpec & arch)1812 ObjectFileELF::GetArchitecture (ArchSpec &arch)
1813 {
1814 if (!ParseHeader())
1815 return false;
1816
1817 arch.SetArchitecture (eArchTypeELF, m_header.e_machine, LLDB_INVALID_CPUTYPE);
1818 arch.GetTriple().setOSName (Host::GetOSString().GetCString());
1819 arch.GetTriple().setVendorName(Host::GetVendorString().GetCString());
1820 return true;
1821 }
1822
1823 ObjectFile::Type
CalculateType()1824 ObjectFileELF::CalculateType()
1825 {
1826 switch (m_header.e_type)
1827 {
1828 case llvm::ELF::ET_NONE:
1829 // 0 - No file type
1830 return eTypeUnknown;
1831
1832 case llvm::ELF::ET_REL:
1833 // 1 - Relocatable file
1834 return eTypeObjectFile;
1835
1836 case llvm::ELF::ET_EXEC:
1837 // 2 - Executable file
1838 return eTypeExecutable;
1839
1840 case llvm::ELF::ET_DYN:
1841 // 3 - Shared object file
1842 return eTypeSharedLibrary;
1843
1844 case ET_CORE:
1845 // 4 - Core file
1846 return eTypeCoreFile;
1847
1848 default:
1849 break;
1850 }
1851 return eTypeUnknown;
1852 }
1853
1854 ObjectFile::Strata
CalculateStrata()1855 ObjectFileELF::CalculateStrata()
1856 {
1857 switch (m_header.e_type)
1858 {
1859 case llvm::ELF::ET_NONE:
1860 // 0 - No file type
1861 return eStrataUnknown;
1862
1863 case llvm::ELF::ET_REL:
1864 // 1 - Relocatable file
1865 return eStrataUnknown;
1866
1867 case llvm::ELF::ET_EXEC:
1868 // 2 - Executable file
1869 // TODO: is there any way to detect that an executable is a kernel
1870 // related executable by inspecting the program headers, section
1871 // headers, symbols, or any other flag bits???
1872 return eStrataUser;
1873
1874 case llvm::ELF::ET_DYN:
1875 // 3 - Shared object file
1876 // TODO: is there any way to detect that an shared library is a kernel
1877 // related executable by inspecting the program headers, section
1878 // headers, symbols, or any other flag bits???
1879 return eStrataUnknown;
1880
1881 case ET_CORE:
1882 // 4 - Core file
1883 // TODO: is there any way to detect that an core file is a kernel
1884 // related executable by inspecting the program headers, section
1885 // headers, symbols, or any other flag bits???
1886 return eStrataUnknown;
1887
1888 default:
1889 break;
1890 }
1891 return eStrataUnknown;
1892 }
1893
1894