blob: 8974280eb321ded11755aa189b451d009f616e9b [file] [log] [blame]
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001//===-- ObjectFileELF.cpp ------------------------------------- -*- C++ -*-===//
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002//
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
Stephen Wilsonf325ba92010-07-13 23:07:23 +000012#include <cassert>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013#include <algorithm>
14
Stephen Wilson2ab0a582011-01-15 00:08:44 +000015#include "lldb/Core/ArchSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016#include "lldb/Core/DataBuffer.h"
17#include "lldb/Core/Error.h"
Stephen Wilsonf325ba92010-07-13 23:07:23 +000018#include "lldb/Core/FileSpecList.h"
Ed Mastec113ff82013-12-02 17:49:13 +000019#include "lldb/Core/Log.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000020#include "lldb/Core/Module.h"
Greg Claytonf4d6de62013-04-24 22:29:28 +000021#include "lldb/Core/ModuleSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022#include "lldb/Core/PluginManager.h"
23#include "lldb/Core/Section.h"
24#include "lldb/Core/Stream.h"
Todd Fiala4339f3a2014-03-25 19:29:09 +000025#include "lldb/Core/Timer.h"
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +000026#include "lldb/Symbol/DWARFCallFrameInfo.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000027#include "lldb/Symbol/SymbolContext.h"
Steve Pucci9e02dac2014-02-06 19:02:19 +000028#include "lldb/Target/SectionLoadList.h"
Ed Maste54803652013-10-11 17:39:07 +000029#include "lldb/Target/Target.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000030#include "lldb/Host/HostInfo.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031
Stephen Wilson499b40e2011-03-30 16:07:05 +000032#include "llvm/ADT/PointerUnion.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000033#include "llvm/ADT/StringRef.h"
Zachary Turner736d4d82014-06-25 05:42:32 +000034#include "llvm/Support/MathExtras.h"
Stephen Wilson499b40e2011-03-30 16:07:05 +000035
Stephen Wilsonf325ba92010-07-13 23:07:23 +000036#define CASE_AND_STREAM(s, def, width) \
37 case def: s->Printf("%-*s", width, #def); break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039using namespace lldb;
40using namespace lldb_private;
Stephen Wilsonf325ba92010-07-13 23:07:23 +000041using namespace elf;
42using namespace llvm::ELF;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043
Stephen Wilson499b40e2011-03-30 16:07:05 +000044namespace {
Todd Fialab91de782014-06-27 16:52:49 +000045
46// ELF note owner definitions
47const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
48const char *const LLDB_NT_OWNER_GNU = "GNU";
49const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
Todd Fialacfee9632014-07-16 15:03:10 +000050const char *const LLDB_NT_OWNER_CSR = "csr";
Tamas Berghammerdb037d92015-03-18 10:36:27 +000051const char *const LLDB_NT_OWNER_ANDROID = "Android";
Todd Fialab91de782014-06-27 16:52:49 +000052
53// ELF note type definitions
54const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
55const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
56
57const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
58const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
59
60const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
61
62const elf_word LLDB_NT_NETBSD_ABI_TAG = 0x01;
63const elf_word LLDB_NT_NETBSD_ABI_SIZE = 4;
64
65// GNU ABI note OS constants
66const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
67const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
68const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
69
Stephen Wilson499b40e2011-03-30 16:07:05 +000070//===----------------------------------------------------------------------===//
71/// @class ELFRelocation
72/// @brief Generic wrapper for ELFRel and ELFRela.
73///
74/// This helper class allows us to parse both ELFRel and ELFRela relocation
75/// entries in a generic manner.
76class ELFRelocation
77{
78public:
79
80 /// Constructs an ELFRelocation entry with a personality as given by @p
81 /// type.
82 ///
83 /// @param type Either DT_REL or DT_RELA. Any other value is invalid.
84 ELFRelocation(unsigned type);
85
86 ~ELFRelocation();
87
88 bool
Greg Claytonc7bece562013-01-25 18:06:21 +000089 Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +000090
91 static unsigned
92 RelocType32(const ELFRelocation &rel);
93
94 static unsigned
95 RelocType64(const ELFRelocation &rel);
96
97 static unsigned
98 RelocSymbol32(const ELFRelocation &rel);
99
100 static unsigned
101 RelocSymbol64(const ELFRelocation &rel);
102
Andrew MacPherson17220c12014-03-05 10:12:43 +0000103 static unsigned
104 RelocOffset32(const ELFRelocation &rel);
105
106 static unsigned
107 RelocOffset64(const ELFRelocation &rel);
108
109 static unsigned
110 RelocAddend32(const ELFRelocation &rel);
111
112 static unsigned
113 RelocAddend64(const ELFRelocation &rel);
114
Stephen Wilson499b40e2011-03-30 16:07:05 +0000115private:
116 typedef llvm::PointerUnion<ELFRel*, ELFRela*> RelocUnion;
117
118 RelocUnion reloc;
119};
120
121ELFRelocation::ELFRelocation(unsigned type)
122{
Andrew MacPherson17220c12014-03-05 10:12:43 +0000123 if (type == DT_REL || type == SHT_REL)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000124 reloc = new ELFRel();
Andrew MacPherson17220c12014-03-05 10:12:43 +0000125 else if (type == DT_RELA || type == SHT_RELA)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000126 reloc = new ELFRela();
127 else {
128 assert(false && "unexpected relocation type");
129 reloc = static_cast<ELFRel*>(NULL);
130 }
131}
132
133ELFRelocation::~ELFRelocation()
134{
135 if (reloc.is<ELFRel*>())
136 delete reloc.get<ELFRel*>();
137 else
138 delete reloc.get<ELFRela*>();
139}
140
141bool
Greg Claytonc7bece562013-01-25 18:06:21 +0000142ELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000143{
144 if (reloc.is<ELFRel*>())
145 return reloc.get<ELFRel*>()->Parse(data, offset);
146 else
147 return reloc.get<ELFRela*>()->Parse(data, offset);
148}
149
150unsigned
151ELFRelocation::RelocType32(const ELFRelocation &rel)
152{
153 if (rel.reloc.is<ELFRel*>())
154 return ELFRel::RelocType32(*rel.reloc.get<ELFRel*>());
155 else
156 return ELFRela::RelocType32(*rel.reloc.get<ELFRela*>());
157}
158
159unsigned
160ELFRelocation::RelocType64(const ELFRelocation &rel)
161{
162 if (rel.reloc.is<ELFRel*>())
163 return ELFRel::RelocType64(*rel.reloc.get<ELFRel*>());
164 else
165 return ELFRela::RelocType64(*rel.reloc.get<ELFRela*>());
166}
167
168unsigned
169ELFRelocation::RelocSymbol32(const ELFRelocation &rel)
170{
171 if (rel.reloc.is<ELFRel*>())
172 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel*>());
173 else
174 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela*>());
175}
176
177unsigned
178ELFRelocation::RelocSymbol64(const ELFRelocation &rel)
179{
180 if (rel.reloc.is<ELFRel*>())
181 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel*>());
182 else
183 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela*>());
184}
185
Andrew MacPherson17220c12014-03-05 10:12:43 +0000186unsigned
187ELFRelocation::RelocOffset32(const ELFRelocation &rel)
188{
189 if (rel.reloc.is<ELFRel*>())
190 return rel.reloc.get<ELFRel*>()->r_offset;
191 else
192 return rel.reloc.get<ELFRela*>()->r_offset;
193}
194
195unsigned
196ELFRelocation::RelocOffset64(const ELFRelocation &rel)
197{
198 if (rel.reloc.is<ELFRel*>())
199 return rel.reloc.get<ELFRel*>()->r_offset;
200 else
201 return rel.reloc.get<ELFRela*>()->r_offset;
202}
203
204unsigned
205ELFRelocation::RelocAddend32(const ELFRelocation &rel)
206{
207 if (rel.reloc.is<ELFRel*>())
208 return 0;
209 else
210 return rel.reloc.get<ELFRela*>()->r_addend;
211}
212
213unsigned
214ELFRelocation::RelocAddend64(const ELFRelocation &rel)
215{
216 if (rel.reloc.is<ELFRel*>())
217 return 0;
218 else
219 return rel.reloc.get<ELFRela*>()->r_addend;
220}
221
Stephen Wilson499b40e2011-03-30 16:07:05 +0000222} // end anonymous namespace
223
Ed Mastec113ff82013-12-02 17:49:13 +0000224bool
225ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset)
226{
227 // Read all fields.
228 if (data.GetU32(offset, &n_namesz, 3) == NULL)
229 return false;
230
231 // The name field is required to be nul-terminated, and n_namesz
232 // includes the terminating nul in observed implementations (contrary
233 // to the ELF-64 spec). A special case is needed for cores generated
234 // by some older Linux versions, which write a note named "CORE"
235 // without a nul terminator and n_namesz = 4.
236 if (n_namesz == 4)
237 {
238 char buf[4];
239 if (data.ExtractBytes (*offset, 4, data.GetByteOrder(), buf) != 4)
240 return false;
241 if (strncmp (buf, "CORE", 4) == 0)
242 {
243 n_name = "CORE";
244 *offset += 4;
245 return true;
246 }
247 }
248
249 const char *cstr = data.GetCStr(offset, llvm::RoundUpToAlignment (n_namesz, 4));
250 if (cstr == NULL)
251 {
252 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS));
253 if (log)
254 log->Printf("Failed to parse note name lacking nul terminator");
255
256 return false;
257 }
258 n_name = cstr;
259 return true;
260}
261
Matthew Gardiner5f675792014-08-27 12:09:39 +0000262static uint32_t
263kalimbaVariantFromElfFlags(const elf::elf_word e_flags)
264{
265 const uint32_t dsp_rev = e_flags & 0xFF;
266 uint32_t kal_arch_variant = LLDB_INVALID_CPUTYPE;
267 switch(dsp_rev)
268 {
269 // TODO(mg11) Support more variants
270 case 10:
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000271 kal_arch_variant = llvm::Triple::KalimbaSubArch_v3;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000272 break;
273 case 14:
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000274 kal_arch_variant = llvm::Triple::KalimbaSubArch_v4;
275 break;
276 case 17:
277 case 20:
278 kal_arch_variant = llvm::Triple::KalimbaSubArch_v5;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000279 break;
280 default:
281 break;
282 }
283 return kal_arch_variant;
284}
285
286static uint32_t
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000287mipsVariantFromElfFlags(const elf::elf_word e_flags, uint32_t endian)
288{
289 const uint32_t mips_arch = e_flags & llvm::ELF::EF_MIPS_ARCH;
290 uint32_t arch_variant = LLDB_INVALID_CPUTYPE;
291
292 switch (mips_arch)
293 {
294 case llvm::ELF::EF_MIPS_ARCH_64:
295 if (endian == ELFDATA2LSB)
296 arch_variant = llvm::Triple::mips64el;
297 else
298 arch_variant = llvm::Triple::mips64;
299 break;
300
301 default:
302 break;
303 }
304
305 return arch_variant;
306}
307
308static uint32_t
Matthew Gardiner5f675792014-08-27 12:09:39 +0000309subTypeFromElfHeader(const elf::ELFHeader& header)
310{
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000311 if (header.e_machine == llvm::ELF::EM_MIPS)
312 return mipsVariantFromElfFlags (header.e_flags,
313 header.e_ident[EI_DATA]);
314
Matthew Gardiner5f675792014-08-27 12:09:39 +0000315 return
316 llvm::ELF::EM_CSR_KALIMBA == header.e_machine ?
317 kalimbaVariantFromElfFlags(header.e_flags) :
318 LLDB_INVALID_CPUTYPE;
319}
320
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000321//! The kalimba toolchain identifies a code section as being
322//! one with the SHT_PROGBITS set in the section sh_type and the top
323//! bit in the 32-bit address field set.
324static lldb::SectionType
325kalimbaSectionType(
326 const elf::ELFHeader& header,
327 const elf::ELFSectionHeader& sect_hdr)
328{
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +0000329 if (llvm::ELF::EM_CSR_KALIMBA != header.e_machine)
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000330 {
331 return eSectionTypeOther;
332 }
333
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +0000334 if (llvm::ELF::SHT_NOBITS == sect_hdr.sh_type)
335 {
336 return eSectionTypeZeroFill;
337 }
338
339 if (llvm::ELF::SHT_PROGBITS == sect_hdr.sh_type)
340 {
341 const lldb::addr_t KAL_CODE_BIT = 1 << 31;
342 return KAL_CODE_BIT & sect_hdr.sh_addr ?
343 eSectionTypeCode : eSectionTypeData;
344 }
345
346 return eSectionTypeOther;
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000347}
348
Todd Fiala4339f3a2014-03-25 19:29:09 +0000349// Arbitrary constant used as UUID prefix for core files.
350const uint32_t
351ObjectFileELF::g_core_uuid_magic(0xE210C);
352
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000353//------------------------------------------------------------------
354// Static methods.
355//------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000356void
357ObjectFileELF::Initialize()
358{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000359 PluginManager::RegisterPlugin(GetPluginNameStatic(),
360 GetPluginDescriptionStatic(),
Greg Claytonc9660542012-02-05 02:38:54 +0000361 CreateInstance,
Greg Claytonf4d6de62013-04-24 22:29:28 +0000362 CreateMemoryInstance,
363 GetModuleSpecifications);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000364}
365
366void
367ObjectFileELF::Terminate()
368{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000369 PluginManager::UnregisterPlugin(CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000370}
371
Greg Clayton57abc5d2013-05-10 21:47:16 +0000372lldb_private::ConstString
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000373ObjectFileELF::GetPluginNameStatic()
374{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000375 static ConstString g_name("elf");
376 return g_name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377}
378
379const char *
380ObjectFileELF::GetPluginDescriptionStatic()
381{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000382 return "ELF object file reader.";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000383}
384
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000385ObjectFile *
Greg Claytone72dfb32012-02-24 01:59:29 +0000386ObjectFileELF::CreateInstance (const lldb::ModuleSP &module_sp,
387 DataBufferSP &data_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000388 lldb::offset_t data_offset,
389 const lldb_private::FileSpec* file,
390 lldb::offset_t file_offset,
391 lldb::offset_t length)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000392{
Greg Clayton5ce9c562013-02-06 17:22:03 +0000393 if (!data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000394 {
Greg Clayton736888c2015-02-23 23:47:09 +0000395 data_sp = file->MemoryMapFileContentsIfLocal(file_offset, length);
Greg Clayton5ce9c562013-02-06 17:22:03 +0000396 data_offset = 0;
397 }
398
399 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
400 {
401 const uint8_t *magic = data_sp->GetBytes() + data_offset;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000402 if (ELFHeader::MagicBytesMatch(magic))
403 {
Greg Clayton5ce9c562013-02-06 17:22:03 +0000404 // Update the data to contain the entire file if it doesn't already
Andrew Kaylor213f6722013-02-07 21:30:54 +0000405 if (data_sp->GetByteSize() < length) {
Greg Clayton736888c2015-02-23 23:47:09 +0000406 data_sp = file->MemoryMapFileContentsIfLocal(file_offset, length);
Greg Clayton64ff6c72013-02-07 21:49:54 +0000407 data_offset = 0;
408 magic = data_sp->GetBytes();
Andrew Kaylor213f6722013-02-07 21:30:54 +0000409 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000410 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
411 if (address_size == 4 || address_size == 8)
412 {
Greg Clayton7b0992d2013-04-18 22:45:39 +0000413 std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, data_offset, file, file_offset, length));
Stephen Wilson3f4200fd2011-02-24 19:16:15 +0000414 ArchSpec spec;
415 if (objfile_ap->GetArchitecture(spec) &&
416 objfile_ap->SetModulesArchitecture(spec))
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000417 return objfile_ap.release();
418 }
419 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000420 }
421 return NULL;
422}
423
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000424
Greg Claytonc9660542012-02-05 02:38:54 +0000425ObjectFile*
Greg Claytone72dfb32012-02-24 01:59:29 +0000426ObjectFileELF::CreateMemoryInstance (const lldb::ModuleSP &module_sp,
427 DataBufferSP& data_sp,
428 const lldb::ProcessSP &process_sp,
429 lldb::addr_t header_addr)
Greg Claytonc9660542012-02-05 02:38:54 +0000430{
Andrew MacPherson17220c12014-03-05 10:12:43 +0000431 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT))
432 {
433 const uint8_t *magic = data_sp->GetBytes();
434 if (ELFHeader::MagicBytesMatch(magic))
435 {
436 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
437 if (address_size == 4 || address_size == 8)
438 {
439 std::auto_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
440 ArchSpec spec;
441 if (objfile_ap->GetArchitecture(spec) &&
442 objfile_ap->SetModulesArchitecture(spec))
443 return objfile_ap.release();
444 }
445 }
446 }
Greg Claytonc9660542012-02-05 02:38:54 +0000447 return NULL;
448}
449
Michael Sartain9f0013d2013-05-17 00:20:21 +0000450bool
451ObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp,
452 lldb::addr_t data_offset,
453 lldb::addr_t data_length)
454{
455 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
456 {
457 const uint8_t *magic = data_sp->GetBytes() + data_offset;
458 return ELFHeader::MagicBytesMatch(magic);
459 }
460 return false;
461}
Greg Claytonc9660542012-02-05 02:38:54 +0000462
Michael Sartain9f4517a2013-07-03 01:52:14 +0000463/*
464 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
465 *
466 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
467 * code or tables extracted from it, as desired without restriction.
468 */
469static uint32_t
Todd Fiala4339f3a2014-03-25 19:29:09 +0000470calc_crc32(uint32_t crc, const void *buf, size_t size)
Michael Sartain9f4517a2013-07-03 01:52:14 +0000471{
472 static const uint32_t g_crc32_tab[] =
473 {
474 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
475 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
476 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
477 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
478 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
479 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
480 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
481 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
482 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
483 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
484 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
485 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
486 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
487 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
488 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
489 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
490 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
491 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
492 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
493 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
494 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
495 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
496 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
497 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
498 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
499 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
500 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
501 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
502 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
503 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
504 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
505 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
506 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
507 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
508 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
509 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
510 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
511 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
512 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
513 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
514 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
515 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
516 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
517 };
518 const uint8_t *p = (const uint8_t *)buf;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000519
Todd Fiala4339f3a2014-03-25 19:29:09 +0000520 crc = crc ^ ~0U;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000521 while (size--)
522 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
523 return crc ^ ~0U;
524}
525
Todd Fiala4339f3a2014-03-25 19:29:09 +0000526static uint32_t
527calc_gnu_debuglink_crc32(const void *buf, size_t size)
528{
529 return calc_crc32(0U, buf, size);
530}
531
532uint32_t
533ObjectFileELF::CalculateELFNotesSegmentsCRC32 (const ProgramHeaderColl& program_headers,
534 DataExtractor& object_data)
535{
536 typedef ProgramHeaderCollConstIter Iter;
537
538 uint32_t core_notes_crc = 0;
539
540 for (Iter I = program_headers.begin(); I != program_headers.end(); ++I)
541 {
542 if (I->p_type == llvm::ELF::PT_NOTE)
543 {
544 const elf_off ph_offset = I->p_offset;
545 const size_t ph_size = I->p_filesz;
546
547 DataExtractor segment_data;
548 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size)
549 {
550 // The ELF program header contained incorrect data,
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000551 // probably corefile is incomplete or corrupted.
Todd Fiala4339f3a2014-03-25 19:29:09 +0000552 break;
553 }
554
555 core_notes_crc = calc_crc32(core_notes_crc,
556 segment_data.GetDataStart(),
557 segment_data.GetByteSize());
558 }
559 }
560
561 return core_notes_crc;
562}
563
Todd Fialab91de782014-06-27 16:52:49 +0000564static const char*
565OSABIAsCString (unsigned char osabi_byte)
566{
567#define _MAKE_OSABI_CASE(x) case x: return #x
568 switch (osabi_byte)
569 {
570 _MAKE_OSABI_CASE(ELFOSABI_NONE);
571 _MAKE_OSABI_CASE(ELFOSABI_HPUX);
572 _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
573 _MAKE_OSABI_CASE(ELFOSABI_GNU);
574 _MAKE_OSABI_CASE(ELFOSABI_HURD);
575 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
576 _MAKE_OSABI_CASE(ELFOSABI_AIX);
577 _MAKE_OSABI_CASE(ELFOSABI_IRIX);
578 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
579 _MAKE_OSABI_CASE(ELFOSABI_TRU64);
580 _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
581 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
582 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
583 _MAKE_OSABI_CASE(ELFOSABI_NSK);
584 _MAKE_OSABI_CASE(ELFOSABI_AROS);
585 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
586 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
587 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
588 _MAKE_OSABI_CASE(ELFOSABI_ARM);
589 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
590 default:
591 return "<unknown-osabi>";
592 }
593#undef _MAKE_OSABI_CASE
594}
595
596static bool
597GetOsFromOSABI (unsigned char osabi_byte, llvm::Triple::OSType &ostype)
598{
599 switch (osabi_byte)
600 {
601 case ELFOSABI_AIX: ostype = llvm::Triple::OSType::AIX; break;
602 case ELFOSABI_FREEBSD: ostype = llvm::Triple::OSType::FreeBSD; break;
603 case ELFOSABI_GNU: ostype = llvm::Triple::OSType::Linux; break;
604 case ELFOSABI_NETBSD: ostype = llvm::Triple::OSType::NetBSD; break;
605 case ELFOSABI_OPENBSD: ostype = llvm::Triple::OSType::OpenBSD; break;
606 case ELFOSABI_SOLARIS: ostype = llvm::Triple::OSType::Solaris; break;
607 default:
608 ostype = llvm::Triple::OSType::UnknownOS;
609 }
610 return ostype != llvm::Triple::OSType::UnknownOS;
611}
612
Greg Claytonf4d6de62013-04-24 22:29:28 +0000613size_t
614ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec& file,
615 lldb::DataBufferSP& data_sp,
616 lldb::offset_t data_offset,
617 lldb::offset_t file_offset,
618 lldb::offset_t length,
619 lldb_private::ModuleSpecList &specs)
620{
Todd Fialab91de782014-06-27 16:52:49 +0000621 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
622
Michael Sartain9f0013d2013-05-17 00:20:21 +0000623 const size_t initial_count = specs.GetSize();
Michael Sartainc836ae72013-05-23 20:57:03 +0000624
Michael Sartain9f0013d2013-05-17 00:20:21 +0000625 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize()))
626 {
627 DataExtractor data;
628 data.SetData(data_sp);
629 elf::ELFHeader header;
630 if (header.Parse(data, &data_offset))
631 {
632 if (data_sp)
633 {
Oleksiy Vyalov63acdfd2015-03-10 01:15:28 +0000634 ModuleSpec spec (file);
Matthew Gardiner5f675792014-08-27 12:09:39 +0000635
636 const uint32_t sub_type = subTypeFromElfHeader(header);
Michael Sartain9f0013d2013-05-17 00:20:21 +0000637 spec.GetArchitecture().SetArchitecture(eArchTypeELF,
638 header.e_machine,
Matthew Gardiner5f675792014-08-27 12:09:39 +0000639 sub_type);
640
Michael Sartain9f0013d2013-05-17 00:20:21 +0000641 if (spec.GetArchitecture().IsValid())
642 {
Todd Fialab91de782014-06-27 16:52:49 +0000643 llvm::Triple::OSType ostype;
644 // First try to determine the OS type from the OSABI field in the elf header.
645
646 if (log)
647 log->Printf ("ObjectFileELF::%s file '%s' module OSABI: %s", __FUNCTION__, file.GetPath ().c_str (), OSABIAsCString (header.e_ident[EI_OSABI]));
648 if (GetOsFromOSABI (header.e_ident[EI_OSABI], ostype) && ostype != llvm::Triple::OSType::UnknownOS)
649 {
650 spec.GetArchitecture ().GetTriple ().setOS (ostype);
651
652 // Also clear the vendor so we don't end up with situations like
653 // x86_64-apple-FreeBSD.
654 spec.GetArchitecture ().GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
655
656 if (log)
657 log->Printf ("ObjectFileELF::%s file '%s' set ELF module OS type from ELF header OSABI.", __FUNCTION__, file.GetPath ().c_str ());
658 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000659
660 // Try to get the UUID from the section list. Usually that's at the end, so
661 // map the file in if we don't have it already.
662 size_t section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize;
663 if (section_header_end > data_sp->GetByteSize())
664 {
Greg Clayton736888c2015-02-23 23:47:09 +0000665 data_sp = file.MemoryMapFileContentsIfLocal (file_offset, section_header_end);
Michael Sartaina7499c92013-07-01 19:45:50 +0000666 data.SetData(data_sp);
667 }
668
Michael Sartain9f4517a2013-07-03 01:52:14 +0000669 uint32_t gnu_debuglink_crc = 0;
Michael Sartaina7499c92013-07-01 19:45:50 +0000670 std::string gnu_debuglink_file;
671 SectionHeaderColl section_headers;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000672 lldb_private::UUID &uuid = spec.GetUUID();
Michael Sartain9f4517a2013-07-03 01:52:14 +0000673
Todd Fialab91de782014-06-27 16:52:49 +0000674 GetSectionHeaderInfo(section_headers, data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc, spec.GetArchitecture ());
675
676 // If the module vendor is not set and the module OS matches this host OS, set the module vendor to the host vendor.
677 llvm::Triple &spec_triple = spec.GetArchitecture ().GetTriple ();
678 if (spec_triple.getVendor () == llvm::Triple::VendorType::UnknownVendor)
679 {
Zachary Turner13b18262014-08-20 16:42:51 +0000680 const llvm::Triple &host_triple = HostInfo::GetArchitecture().GetTriple();
Todd Fialab91de782014-06-27 16:52:49 +0000681 if (spec_triple.getOS () == host_triple.getOS ())
682 spec_triple.setVendor (host_triple.getVendor ());
683 }
684
685 if (log)
686 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 ());
Todd Fiala4339f3a2014-03-25 19:29:09 +0000687
Michael Sartain9f4517a2013-07-03 01:52:14 +0000688 if (!uuid.IsValid())
689 {
Todd Fiala4339f3a2014-03-25 19:29:09 +0000690 uint32_t core_notes_crc = 0;
691
Michael Sartain9f4517a2013-07-03 01:52:14 +0000692 if (!gnu_debuglink_crc)
693 {
Todd Fiala4339f3a2014-03-25 19:29:09 +0000694 lldb_private::Timer scoped_timer (__PRETTY_FUNCTION__,
695 "Calculating module crc32 %s with size %" PRIu64 " KiB",
696 file.GetLastPathComponent().AsCString(),
697 (file.GetByteSize()-file_offset)/1024);
698
699 // For core files - which usually don't happen to have a gnu_debuglink,
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000700 // and are pretty bulky - calculating whole contents crc32 would be too much of luxury.
Todd Fiala4339f3a2014-03-25 19:29:09 +0000701 // Thus we will need to fallback to something simpler.
702 if (header.e_type == llvm::ELF::ET_CORE)
703 {
704 size_t program_headers_end = header.e_phoff + header.e_phnum * header.e_phentsize;
705 if (program_headers_end > data_sp->GetByteSize())
706 {
Greg Clayton736888c2015-02-23 23:47:09 +0000707 data_sp = file.MemoryMapFileContentsIfLocal(file_offset, program_headers_end);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000708 data.SetData(data_sp);
709 }
710 ProgramHeaderColl program_headers;
711 GetProgramHeaderInfo(program_headers, data, header);
712
713 size_t segment_data_end = 0;
714 for (ProgramHeaderCollConstIter I = program_headers.begin();
715 I != program_headers.end(); ++I)
716 {
Enrico Granataafcbdb12014-03-25 20:53:33 +0000717 segment_data_end = std::max<unsigned long long> (I->p_offset + I->p_filesz, segment_data_end);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000718 }
719
720 if (segment_data_end > data_sp->GetByteSize())
721 {
Greg Clayton736888c2015-02-23 23:47:09 +0000722 data_sp = file.MemoryMapFileContentsIfLocal(file_offset, segment_data_end);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000723 data.SetData(data_sp);
724 }
725
726 core_notes_crc = CalculateELFNotesSegmentsCRC32 (program_headers, data);
727 }
728 else
729 {
730 // Need to map entire file into memory to calculate the crc.
Greg Clayton736888c2015-02-23 23:47:09 +0000731 data_sp = file.MemoryMapFileContentsIfLocal (file_offset, SIZE_MAX);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000732 data.SetData(data_sp);
733 gnu_debuglink_crc = calc_gnu_debuglink_crc32 (data.GetDataStart(), data.GetByteSize());
734 }
Michael Sartain9f4517a2013-07-03 01:52:14 +0000735 }
736 if (gnu_debuglink_crc)
737 {
738 // Use 4 bytes of crc from the .gnu_debuglink section.
739 uint32_t uuidt[4] = { gnu_debuglink_crc, 0, 0, 0 };
740 uuid.SetBytes (uuidt, sizeof(uuidt));
741 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000742 else if (core_notes_crc)
743 {
744 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it look different form
745 // .gnu_debuglink crc followed by 4 bytes of note segments crc.
746 uint32_t uuidt[4] = { g_core_uuid_magic, core_notes_crc, 0, 0 };
747 uuid.SetBytes (uuidt, sizeof(uuidt));
748 }
Michael Sartain9f4517a2013-07-03 01:52:14 +0000749 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000750
Michael Sartain9f0013d2013-05-17 00:20:21 +0000751 specs.Append(spec);
752 }
753 }
754 }
755 }
Michael Sartainc836ae72013-05-23 20:57:03 +0000756
Michael Sartain9f0013d2013-05-17 00:20:21 +0000757 return specs.GetSize() - initial_count;
Greg Claytonf4d6de62013-04-24 22:29:28 +0000758}
759
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000760//------------------------------------------------------------------
761// PluginInterface protocol
762//------------------------------------------------------------------
Greg Clayton57abc5d2013-05-10 21:47:16 +0000763lldb_private::ConstString
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000764ObjectFileELF::GetPluginName()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000765{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000766 return GetPluginNameStatic();
767}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000768
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000769uint32_t
770ObjectFileELF::GetPluginVersion()
771{
772 return m_plugin_version;
773}
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000774//------------------------------------------------------------------
775// ObjectFile protocol
776//------------------------------------------------------------------
777
Greg Claytone72dfb32012-02-24 01:59:29 +0000778ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000779 DataBufferSP& data_sp,
780 lldb::offset_t data_offset,
Greg Claytone72dfb32012-02-24 01:59:29 +0000781 const FileSpec* file,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000782 lldb::offset_t file_offset,
783 lldb::offset_t length) :
784 ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
Greg Claytone72dfb32012-02-24 01:59:29 +0000785 m_header(),
Todd Fialab91de782014-06-27 16:52:49 +0000786 m_uuid(),
787 m_gnu_debuglink_file(),
788 m_gnu_debuglink_crc(0),
Greg Claytone72dfb32012-02-24 01:59:29 +0000789 m_program_headers(),
790 m_section_headers(),
Todd Fialab91de782014-06-27 16:52:49 +0000791 m_dynamic_symbols(),
792 m_filespec_ap(),
793 m_entry_point_address(),
794 m_arch_spec()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000795{
796 if (file)
797 m_file = *file;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000798 ::memset(&m_header, 0, sizeof(m_header));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000799}
800
Andrew MacPherson17220c12014-03-05 10:12:43 +0000801ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
802 DataBufferSP& data_sp,
803 const lldb::ProcessSP &process_sp,
804 addr_t header_addr) :
805 ObjectFile(module_sp, process_sp, LLDB_INVALID_ADDRESS, data_sp),
806 m_header(),
Todd Fialab91de782014-06-27 16:52:49 +0000807 m_uuid(),
808 m_gnu_debuglink_file(),
809 m_gnu_debuglink_crc(0),
Andrew MacPherson17220c12014-03-05 10:12:43 +0000810 m_program_headers(),
811 m_section_headers(),
Todd Fialab91de782014-06-27 16:52:49 +0000812 m_dynamic_symbols(),
813 m_filespec_ap(),
814 m_entry_point_address(),
815 m_arch_spec()
Andrew MacPherson17220c12014-03-05 10:12:43 +0000816{
817 ::memset(&m_header, 0, sizeof(m_header));
818}
819
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000820ObjectFileELF::~ObjectFileELF()
821{
822}
823
Jim Ingham5aee1622010-08-09 23:31:02 +0000824bool
825ObjectFileELF::IsExecutable() const
826{
Deepak Panickal71f5b502014-07-22 12:01:43 +0000827 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
Jim Ingham5aee1622010-08-09 23:31:02 +0000828}
829
Steve Pucci9e02dac2014-02-06 19:02:19 +0000830bool
Greg Clayton751caf62014-02-07 22:54:47 +0000831ObjectFileELF::SetLoadAddress (Target &target,
832 lldb::addr_t value,
833 bool value_is_offset)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000834{
Steve Pucci9e02dac2014-02-06 19:02:19 +0000835 ModuleSP module_sp = GetModule();
836 if (module_sp)
837 {
838 size_t num_loaded_sections = 0;
839 SectionList *section_list = GetSectionList ();
840 if (section_list)
841 {
Greg Clayton751caf62014-02-07 22:54:47 +0000842 if (value_is_offset)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000843 {
Greg Clayton751caf62014-02-07 22:54:47 +0000844 const size_t num_sections = section_list->GetSize();
845 size_t sect_idx = 0;
Sylvestre Ledruf561a012014-02-21 18:08:09 +0000846
Greg Clayton751caf62014-02-07 22:54:47 +0000847 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000848 {
Greg Clayton751caf62014-02-07 22:54:47 +0000849 // Iterate through the object file sections to find all
850 // of the sections that have SHF_ALLOC in their flag bits.
851 SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
852 // if (section_sp && !section_sp->IsThreadSpecific())
853 if (section_sp && section_sp->Test(SHF_ALLOC))
854 {
855 if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + value))
856 ++num_loaded_sections;
857 }
Steve Pucci9e02dac2014-02-06 19:02:19 +0000858 }
Greg Clayton751caf62014-02-07 22:54:47 +0000859 return num_loaded_sections > 0;
860 }
861 else
862 {
863 // Not sure how to slide an ELF file given the base address
864 // of the ELF file in memory
Steve Pucci9e02dac2014-02-06 19:02:19 +0000865 }
866 }
Steve Pucci9e02dac2014-02-06 19:02:19 +0000867 }
Sylvestre Ledruf561a012014-02-21 18:08:09 +0000868 return false; // If it changed
Steve Pucci9e02dac2014-02-06 19:02:19 +0000869}
870
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000871ByteOrder
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000872ObjectFileELF::GetByteOrder() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000873{
874 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
875 return eByteOrderBig;
876 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
877 return eByteOrderLittle;
878 return eByteOrderInvalid;
879}
880
Greg Claytonc7bece562013-01-25 18:06:21 +0000881uint32_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000882ObjectFileELF::GetAddressByteSize() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000883{
884 return m_data.GetAddressByteSize();
885}
886
Todd Fialafbd703a2014-09-15 22:33:39 +0000887// Top 16 bits of the `Symbol` flags are available.
888#define ARM_ELF_SYM_IS_THUMB (1 << 16)
889
890AddressClass
891ObjectFileELF::GetAddressClass (addr_t file_addr)
892{
893 auto res = ObjectFile::GetAddressClass (file_addr);
894
895 if (res != eAddressClassCode)
896 return res;
897
Tamas Berghammer83544cf2015-04-07 10:43:50 +0000898 auto ub = m_address_class_map.upper_bound(file_addr);
899 if (ub == m_address_class_map.begin())
900 {
901 // No entry in the address class map before the address. Return
902 // default address class for an address in a code section.
903 return eAddressClassCode;
904 }
Todd Fialafbd703a2014-09-15 22:33:39 +0000905
Tamas Berghammer83544cf2015-04-07 10:43:50 +0000906 // Move iterator to the address class entry preceding address
907 --ub;
Todd Fialafbd703a2014-09-15 22:33:39 +0000908
Tamas Berghammer83544cf2015-04-07 10:43:50 +0000909 return ub->second;
Todd Fialafbd703a2014-09-15 22:33:39 +0000910}
911
Greg Claytonc7bece562013-01-25 18:06:21 +0000912size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000913ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000914{
Greg Claytonc7bece562013-01-25 18:06:21 +0000915 return std::distance(m_section_headers.begin(), I) + 1u;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000916}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000917
Greg Claytonc7bece562013-01-25 18:06:21 +0000918size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000919ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const
920{
Greg Claytonc7bece562013-01-25 18:06:21 +0000921 return std::distance(m_section_headers.begin(), I) + 1u;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000922}
923
924bool
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000925ObjectFileELF::ParseHeader()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000926{
Filipe Cabecinhas22b40f72013-05-16 23:29:36 +0000927 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000928 return m_header.Parse(m_data, &offset);
929}
930
931bool
Greg Clayton60830262011-02-04 18:53:10 +0000932ObjectFileELF::GetUUID(lldb_private::UUID* uuid)
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000933{
Michael Sartaina7499c92013-07-01 19:45:50 +0000934 // Need to parse the section list to get the UUIDs, so make sure that's been done.
Todd Fiala4339f3a2014-03-25 19:29:09 +0000935 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
Michael Sartaina7499c92013-07-01 19:45:50 +0000936 return false;
937
Michael Sartainc836ae72013-05-23 20:57:03 +0000938 if (m_uuid.IsValid())
939 {
Michael Sartaina7499c92013-07-01 19:45:50 +0000940 // We have the full build id uuid.
Michael Sartainc836ae72013-05-23 20:57:03 +0000941 *uuid = m_uuid;
942 return true;
943 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000944 else if (GetType() == ObjectFile::eTypeCoreFile)
945 {
946 uint32_t core_notes_crc = 0;
947
948 if (!ParseProgramHeaders())
949 return false;
950
951 core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
952
953 if (core_notes_crc)
954 {
955 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
956 // look different form .gnu_debuglink crc - followed by 4 bytes of note
957 // segments crc.
958 uint32_t uuidt[4] = { g_core_uuid_magic, core_notes_crc, 0, 0 };
959 m_uuid.SetBytes (uuidt, sizeof(uuidt));
960 }
961 }
962 else
Michael Sartaina7499c92013-07-01 19:45:50 +0000963 {
Michael Sartain9f4517a2013-07-03 01:52:14 +0000964 if (!m_gnu_debuglink_crc)
965 m_gnu_debuglink_crc = calc_gnu_debuglink_crc32 (m_data.GetDataStart(), m_data.GetByteSize());
Michael Sartaina7499c92013-07-01 19:45:50 +0000966 if (m_gnu_debuglink_crc)
967 {
968 // Use 4 bytes of crc from the .gnu_debuglink section.
969 uint32_t uuidt[4] = { m_gnu_debuglink_crc, 0, 0, 0 };
Todd Fiala4339f3a2014-03-25 19:29:09 +0000970 m_uuid.SetBytes (uuidt, sizeof(uuidt));
Michael Sartaina7499c92013-07-01 19:45:50 +0000971 }
972 }
973
Todd Fiala4339f3a2014-03-25 19:29:09 +0000974 if (m_uuid.IsValid())
975 {
976 *uuid = m_uuid;
977 return true;
978 }
979
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000980 return false;
981}
982
Michael Sartaina7499c92013-07-01 19:45:50 +0000983lldb_private::FileSpecList
984ObjectFileELF::GetDebugSymbolFilePaths()
985{
986 FileSpecList file_spec_list;
987
988 if (!m_gnu_debuglink_file.empty())
989 {
990 FileSpec file_spec (m_gnu_debuglink_file.c_str(), false);
991 file_spec_list.Append (file_spec);
992 }
993 return file_spec_list;
994}
995
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000996uint32_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000997ObjectFileELF::GetDependentModules(FileSpecList &files)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000998{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000999 size_t num_modules = ParseDependentModules();
1000 uint32_t num_specs = 0;
1001
1002 for (unsigned i = 0; i < num_modules; ++i)
1003 {
1004 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i)))
1005 num_specs++;
1006 }
1007
1008 return num_specs;
1009}
1010
Stephen Wilson499b40e2011-03-30 16:07:05 +00001011Address
Ed Maste54803652013-10-11 17:39:07 +00001012ObjectFileELF::GetImageInfoAddress(Target *target)
Stephen Wilson499b40e2011-03-30 16:07:05 +00001013{
1014 if (!ParseDynamicSymbols())
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001015 return Address();
1016
1017 SectionList *section_list = GetSectionList();
1018 if (!section_list)
1019 return Address();
1020
Greg Clayton3046e662013-07-10 01:23:25 +00001021 // Find the SHT_DYNAMIC (.dynamic) section.
1022 SectionSP dynsym_section_sp (section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true));
1023 if (!dynsym_section_sp)
Stephen Wilson499b40e2011-03-30 16:07:05 +00001024 return Address();
Greg Clayton3046e662013-07-10 01:23:25 +00001025 assert (dynsym_section_sp->GetObjectFile() == this);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001026
Greg Clayton3046e662013-07-10 01:23:25 +00001027 user_id_t dynsym_id = dynsym_section_sp->GetID();
Michael Sartaina7499c92013-07-01 19:45:50 +00001028 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001029 if (!dynsym_hdr)
1030 return Address();
1031
Greg Clayton3046e662013-07-10 01:23:25 +00001032 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i)
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001033 {
Greg Clayton3046e662013-07-10 01:23:25 +00001034 ELFDynamic &symbol = m_dynamic_symbols[i];
Greg Claytone72dfb32012-02-24 01:59:29 +00001035
Ed Maste54803652013-10-11 17:39:07 +00001036 if (symbol.d_tag == DT_DEBUG)
Greg Clayton3046e662013-07-10 01:23:25 +00001037 {
1038 // Compute the offset as the number of previous entries plus the
1039 // size of d_tag.
1040 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
1041 return Address(dynsym_section_sp, offset);
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001042 }
Ed Maste54803652013-10-11 17:39:07 +00001043 else if (symbol.d_tag == DT_MIPS_RLD_MAP && target)
1044 {
1045 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
1046 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
1047 if (dyn_base == LLDB_INVALID_ADDRESS)
1048 return Address();
1049 Address addr;
1050 Error error;
1051 if (target->ReadPointerFromMemory(dyn_base + offset, false, error, addr))
1052 return addr;
1053 }
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001054 }
1055
1056 return Address();
1057}
1058
Jim Ingham672e6f52011-03-07 23:44:08 +00001059lldb_private::Address
1060ObjectFileELF::GetEntryPointAddress ()
1061{
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001062 if (m_entry_point_address.IsValid())
1063 return m_entry_point_address;
1064
1065 if (!ParseHeader() || !IsExecutable())
1066 return m_entry_point_address;
1067
Greg Clayton3046e662013-07-10 01:23:25 +00001068 SectionList *section_list = GetSectionList();
1069 addr_t offset = m_header.e_entry;
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001070
Greg Clayton3046e662013-07-10 01:23:25 +00001071 if (!section_list)
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001072 m_entry_point_address.SetOffset(offset);
Greg Clayton3046e662013-07-10 01:23:25 +00001073 else
1074 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001075 return m_entry_point_address;
Jim Ingham672e6f52011-03-07 23:44:08 +00001076}
1077
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001078//----------------------------------------------------------------------
1079// ParseDependentModules
1080//----------------------------------------------------------------------
1081size_t
1082ObjectFileELF::ParseDependentModules()
1083{
1084 if (m_filespec_ap.get())
1085 return m_filespec_ap->GetSize();
1086
1087 m_filespec_ap.reset(new FileSpecList());
1088
Michael Sartaina7499c92013-07-01 19:45:50 +00001089 if (!ParseSectionHeaders())
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001090 return 0;
1091
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001092 SectionList *section_list = GetSectionList();
1093 if (!section_list)
1094 return 0;
1095
Greg Clayton3046e662013-07-10 01:23:25 +00001096 // Find the SHT_DYNAMIC section.
1097 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
1098 if (!dynsym)
1099 return 0;
1100 assert (dynsym->GetObjectFile() == this);
1101
1102 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex (dynsym->GetID());
1103 if (!header)
1104 return 0;
1105 // sh_link: section header index of string table used by entries in the section.
1106 Section *dynstr = section_list->FindSectionByID (header->sh_link + 1).get();
1107 if (!dynstr)
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001108 return 0;
1109
1110 DataExtractor dynsym_data;
1111 DataExtractor dynstr_data;
Greg Claytonc9660542012-02-05 02:38:54 +00001112 if (ReadSectionData(dynsym, dynsym_data) &&
1113 ReadSectionData(dynstr, dynstr_data))
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001114 {
1115 ELFDynamic symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +00001116 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1117 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001118
1119 // The only type of entries we are concerned with are tagged DT_NEEDED,
1120 // yielding the name of a required library.
1121 while (offset < section_size)
1122 {
1123 if (!symbol.Parse(dynsym_data, &offset))
1124 break;
1125
1126 if (symbol.d_tag != DT_NEEDED)
1127 continue;
1128
1129 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1130 const char *lib_name = dynstr_data.PeekCStr(str_index);
Greg Clayton274060b2010-10-20 20:54:39 +00001131 m_filespec_ap->Append(FileSpec(lib_name, true));
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001132 }
1133 }
1134
1135 return m_filespec_ap->GetSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001136}
1137
1138//----------------------------------------------------------------------
Todd Fiala4339f3a2014-03-25 19:29:09 +00001139// GetProgramHeaderInfo
1140//----------------------------------------------------------------------
1141size_t
1142ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
1143 DataExtractor &object_data,
1144 const ELFHeader &header)
1145{
1146 // We have already parsed the program headers
1147 if (!program_headers.empty())
1148 return program_headers.size();
1149
1150 // If there are no program headers to read we are done.
1151 if (header.e_phnum == 0)
1152 return 0;
1153
1154 program_headers.resize(header.e_phnum);
1155 if (program_headers.size() != header.e_phnum)
1156 return 0;
1157
1158 const size_t ph_size = header.e_phnum * header.e_phentsize;
1159 const elf_off ph_offset = header.e_phoff;
1160 DataExtractor data;
1161 if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
1162 return 0;
1163
1164 uint32_t idx;
1165 lldb::offset_t offset;
1166 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx)
1167 {
1168 if (program_headers[idx].Parse(data, &offset) == false)
1169 break;
1170 }
1171
1172 if (idx < program_headers.size())
1173 program_headers.resize(idx);
1174
1175 return program_headers.size();
1176
1177}
1178
1179//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001180// ParseProgramHeaders
1181//----------------------------------------------------------------------
1182size_t
1183ObjectFileELF::ParseProgramHeaders()
1184{
Todd Fiala4339f3a2014-03-25 19:29:09 +00001185 return GetProgramHeaderInfo(m_program_headers, m_data, m_header);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001186}
1187
Todd Fialab91de782014-06-27 16:52:49 +00001188lldb_private::Error
1189ObjectFileELF::RefineModuleDetailsFromNote (lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch_spec, lldb_private::UUID &uuid)
Michael Sartainc836ae72013-05-23 20:57:03 +00001190{
Todd Fialab91de782014-06-27 16:52:49 +00001191 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1192 Error error;
1193
Michael Sartainc836ae72013-05-23 20:57:03 +00001194 lldb::offset_t offset = 0;
Michael Sartainc836ae72013-05-23 20:57:03 +00001195
1196 while (true)
1197 {
Todd Fialab91de782014-06-27 16:52:49 +00001198 // Parse the note header. If this fails, bail out.
Ed Mastec113ff82013-12-02 17:49:13 +00001199 ELFNote note = ELFNote();
1200 if (!note.Parse(data, &offset))
Michael Sartainc836ae72013-05-23 20:57:03 +00001201 {
Todd Fialab91de782014-06-27 16:52:49 +00001202 // We're done.
1203 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001204 }
Todd Fialab91de782014-06-27 16:52:49 +00001205
1206 // If a tag processor handles the tag, it should set processed to true, and
1207 // the loop will assume the tag processing has moved entirely past the note's payload.
1208 // Otherwise, leave it false and the end of the loop will handle the offset properly.
1209 bool processed = false;
1210
1211 if (log)
1212 log->Printf ("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32, __FUNCTION__, note.n_name.c_str (), note.n_type);
1213
1214 // Process FreeBSD ELF notes.
1215 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1216 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1217 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE))
1218 {
1219 // We'll consume the payload below.
1220 processed = true;
1221
1222 // Pull out the min version info.
1223 uint32_t version_info;
1224 if (data.GetU32 (&offset, &version_info, 1) == nullptr)
1225 {
1226 error.SetErrorString ("failed to read FreeBSD ABI note payload");
1227 return error;
1228 }
1229
1230 // Convert the version info into a major/minor number.
1231 const uint32_t version_major = version_info / 100000;
1232 const uint32_t version_minor = (version_info / 1000) % 100;
1233
1234 char os_name[32];
1235 snprintf (os_name, sizeof (os_name), "freebsd%" PRIu32 ".%" PRIu32, version_major, version_minor);
1236
1237 // Set the elf OS version to FreeBSD. Also clear the vendor.
1238 arch_spec.GetTriple ().setOSName (os_name);
1239 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1240
1241 if (log)
1242 log->Printf ("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_major, version_minor, static_cast<uint32_t> (version_info % 1000));
1243 }
1244 // Process GNU ELF notes.
1245 else if (note.n_name == LLDB_NT_OWNER_GNU)
1246 {
1247 switch (note.n_type)
1248 {
1249 case LLDB_NT_GNU_ABI_TAG:
1250 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE)
1251 {
1252 // We'll consume the payload below.
1253 processed = true;
1254
1255 // Pull out the min OS version supporting the ABI.
1256 uint32_t version_info[4];
1257 if (data.GetU32 (&offset, &version_info[0], note.n_descsz / 4) == nullptr)
1258 {
1259 error.SetErrorString ("failed to read GNU ABI note payload");
1260 return error;
1261 }
1262
1263 // Set the OS per the OS field.
1264 switch (version_info[0])
1265 {
1266 case LLDB_NT_GNU_ABI_OS_LINUX:
1267 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::Linux);
1268 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1269 if (log)
1270 log->Printf ("ObjectFileELF::%s detected Linux, min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1271 // 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.
1272 break;
1273 case LLDB_NT_GNU_ABI_OS_HURD:
1274 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::UnknownOS);
1275 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1276 if (log)
1277 log->Printf ("ObjectFileELF::%s detected Hurd (unsupported), min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1278 break;
1279 case LLDB_NT_GNU_ABI_OS_SOLARIS:
1280 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::Solaris);
1281 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1282 if (log)
1283 log->Printf ("ObjectFileELF::%s detected Solaris, min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1284 break;
1285 default:
1286 if (log)
1287 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]);
1288 break;
1289 }
1290 }
1291 break;
1292
1293 case LLDB_NT_GNU_BUILD_ID_TAG:
1294 // Only bother processing this if we don't already have the uuid set.
1295 if (!uuid.IsValid())
1296 {
1297 // We'll consume the payload below.
1298 processed = true;
1299
1300 // 16 bytes is UUID|MD5, 20 bytes is SHA1
1301 if ((note.n_descsz == 16 || note.n_descsz == 20))
1302 {
1303 uint8_t uuidbuf[20];
1304 if (data.GetU8 (&offset, &uuidbuf, note.n_descsz) == nullptr)
1305 {
1306 error.SetErrorString ("failed to read GNU_BUILD_ID note payload");
1307 return error;
1308 }
1309
1310 // Save the build id as the UUID for the module.
1311 uuid.SetBytes (uuidbuf, note.n_descsz);
1312 }
1313 }
1314 break;
1315 }
1316 }
1317 // Process NetBSD ELF notes.
1318 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
1319 (note.n_type == LLDB_NT_NETBSD_ABI_TAG) &&
1320 (note.n_descsz == LLDB_NT_NETBSD_ABI_SIZE))
1321 {
1322
1323 // We'll consume the payload below.
1324 processed = true;
1325
1326 // Pull out the min version info.
1327 uint32_t version_info;
1328 if (data.GetU32 (&offset, &version_info, 1) == nullptr)
1329 {
1330 error.SetErrorString ("failed to read NetBSD ABI note payload");
1331 return error;
1332 }
1333
1334 // Set the elf OS version to NetBSD. Also clear the vendor.
1335 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::NetBSD);
1336 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1337
1338 if (log)
1339 log->Printf ("ObjectFileELF::%s detected NetBSD, min version constant %" PRIu32, __FUNCTION__, version_info);
1340 }
Todd Fialacfee9632014-07-16 15:03:10 +00001341 // Process CSR kalimba notes
1342 else if ((note.n_type == LLDB_NT_GNU_ABI_TAG) &&
1343 (note.n_name == LLDB_NT_OWNER_CSR))
1344 {
1345 // We'll consume the payload below.
1346 processed = true;
1347 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1348 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::CSR);
1349
1350 // TODO At some point the description string could be processed.
1351 // It could provide a steer towards the kalimba variant which
1352 // this ELF targets.
1353 if(note.n_descsz)
1354 {
1355 const char *cstr = data.GetCStr(&offset, llvm::RoundUpToAlignment (note.n_descsz, 4));
1356 (void)cstr;
1357 }
1358 }
Tamas Berghammerdb037d92015-03-18 10:36:27 +00001359 else if (note.n_name == LLDB_NT_OWNER_ANDROID)
1360 {
1361 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1362 arch_spec.GetTriple().setEnvironment(llvm::Triple::EnvironmentType::Android);
1363 }
Todd Fialab91de782014-06-27 16:52:49 +00001364
1365 if (!processed)
1366 offset += llvm::RoundUpToAlignment(note.n_descsz, 4);
Michael Sartainc836ae72013-05-23 20:57:03 +00001367 }
Todd Fialab91de782014-06-27 16:52:49 +00001368
1369 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001370}
Michael Sartaina7499c92013-07-01 19:45:50 +00001371
Todd Fialab91de782014-06-27 16:52:49 +00001372
Michael Sartaina7499c92013-07-01 19:45:50 +00001373//----------------------------------------------------------------------
1374// GetSectionHeaderInfo
1375//----------------------------------------------------------------------
1376size_t
1377ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
1378 lldb_private::DataExtractor &object_data,
1379 const elf::ELFHeader &header,
1380 lldb_private::UUID &uuid,
1381 std::string &gnu_debuglink_file,
Todd Fialab91de782014-06-27 16:52:49 +00001382 uint32_t &gnu_debuglink_crc,
1383 ArchSpec &arch_spec)
Michael Sartaina7499c92013-07-01 19:45:50 +00001384{
Todd Fiala6477ea82014-07-11 15:13:33 +00001385 // Don't reparse the section headers if we already did that.
1386 if (!section_headers.empty())
1387 return section_headers.size();
1388
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001389 // Only initialize the arch_spec to okay defaults if they're not already set.
Todd Fialab91de782014-06-27 16:52:49 +00001390 // We'll refine this with note data as we parse the notes.
1391 if (arch_spec.GetTriple ().getOS () == llvm::Triple::OSType::UnknownOS)
1392 {
Matthew Gardiner5f675792014-08-27 12:09:39 +00001393 const uint32_t sub_type = subTypeFromElfHeader(header);
1394 arch_spec.SetArchitecture (eArchTypeELF, header.e_machine, sub_type);
1395
Greg Clayton44362e02014-07-12 00:11:34 +00001396 switch (arch_spec.GetAddressByteSize())
1397 {
1398 case 4:
1399 {
Zachary Turner13b18262014-08-20 16:42:51 +00001400 const ArchSpec host_arch32 = HostInfo::GetArchitecture(HostInfo::eArchKind32);
Greg Clayton44362e02014-07-12 00:11:34 +00001401 if (host_arch32.GetCore() == arch_spec.GetCore())
1402 {
Zachary Turner97a14e62014-08-19 17:18:29 +00001403 arch_spec.GetTriple().setOSName(HostInfo::GetOSString().data());
1404 arch_spec.GetTriple().setVendorName(HostInfo::GetVendorString().data());
Greg Clayton44362e02014-07-12 00:11:34 +00001405 }
1406 }
1407 break;
1408 case 8:
1409 {
Zachary Turner13b18262014-08-20 16:42:51 +00001410 const ArchSpec host_arch64 = HostInfo::GetArchitecture(HostInfo::eArchKind64);
Greg Clayton44362e02014-07-12 00:11:34 +00001411 if (host_arch64.GetCore() == arch_spec.GetCore())
1412 {
Zachary Turner97a14e62014-08-19 17:18:29 +00001413 arch_spec.GetTriple().setOSName(HostInfo::GetOSString().data());
1414 arch_spec.GetTriple().setVendorName(HostInfo::GetVendorString().data());
Greg Clayton44362e02014-07-12 00:11:34 +00001415 }
1416 }
1417 break;
1418 }
Todd Fialab91de782014-06-27 16:52:49 +00001419 }
1420
Michael Sartaina7499c92013-07-01 19:45:50 +00001421 // If there are no section headers we are done.
1422 if (header.e_shnum == 0)
1423 return 0;
1424
Todd Fialab91de782014-06-27 16:52:49 +00001425 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1426
Michael Sartaina7499c92013-07-01 19:45:50 +00001427 section_headers.resize(header.e_shnum);
1428 if (section_headers.size() != header.e_shnum)
1429 return 0;
1430
1431 const size_t sh_size = header.e_shnum * header.e_shentsize;
1432 const elf_off sh_offset = header.e_shoff;
1433 DataExtractor sh_data;
1434 if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size)
1435 return 0;
1436
1437 uint32_t idx;
1438 lldb::offset_t offset;
1439 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx)
1440 {
1441 if (section_headers[idx].Parse(sh_data, &offset) == false)
1442 break;
1443 }
1444 if (idx < section_headers.size())
1445 section_headers.resize(idx);
1446
1447 const unsigned strtab_idx = header.e_shstrndx;
1448 if (strtab_idx && strtab_idx < section_headers.size())
1449 {
1450 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1451 const size_t byte_size = sheader.sh_size;
1452 const Elf64_Off offset = sheader.sh_offset;
1453 lldb_private::DataExtractor shstr_data;
1454
1455 if (shstr_data.SetData (object_data, offset, byte_size) == byte_size)
1456 {
1457 for (SectionHeaderCollIter I = section_headers.begin();
1458 I != section_headers.end(); ++I)
1459 {
1460 static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink");
1461 const ELFSectionHeaderInfo &header = *I;
1462 const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1463 ConstString name(shstr_data.PeekCStr(I->sh_name));
1464
1465 I->section_name = name;
1466
1467 if (name == g_sect_name_gnu_debuglink)
1468 {
1469 DataExtractor data;
1470 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
1471 {
1472 lldb::offset_t gnu_debuglink_offset = 0;
1473 gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset);
1474 gnu_debuglink_offset = llvm::RoundUpToAlignment (gnu_debuglink_offset, 4);
1475 data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1476 }
1477 }
1478
Todd Fialab91de782014-06-27 16:52:49 +00001479 // Process ELF note section entries.
Tamas Berghammerdb037d92015-03-18 10:36:27 +00001480 bool is_note_header = (header.sh_type == SHT_NOTE);
1481
1482 // The section header ".note.android.ident" is stored as a
1483 // PROGBITS type header but it is actually a note header.
1484 static ConstString g_sect_name_android_ident (".note.android.ident");
1485 if (!is_note_header && name == g_sect_name_android_ident)
1486 is_note_header = true;
1487
1488 if (is_note_header)
Michael Sartaina7499c92013-07-01 19:45:50 +00001489 {
Todd Fialab91de782014-06-27 16:52:49 +00001490 // Allow notes to refine module info.
Michael Sartaina7499c92013-07-01 19:45:50 +00001491 DataExtractor data;
1492 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
1493 {
Todd Fialab91de782014-06-27 16:52:49 +00001494 Error error = RefineModuleDetailsFromNote (data, arch_spec, uuid);
1495 if (error.Fail ())
1496 {
1497 if (log)
1498 log->Printf ("ObjectFileELF::%s ELF note processing failed: %s", __FUNCTION__, error.AsCString ());
1499 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001500 }
1501 }
1502 }
1503
1504 return section_headers.size();
1505 }
1506 }
1507
1508 section_headers.clear();
1509 return 0;
1510}
1511
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001512size_t
1513ObjectFileELF::GetProgramHeaderCount()
1514{
1515 return ParseProgramHeaders();
1516}
1517
1518const elf::ELFProgramHeader *
1519ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id)
1520{
1521 if (!id || !ParseProgramHeaders())
1522 return NULL;
1523
1524 if (--id < m_program_headers.size())
1525 return &m_program_headers[id];
1526
1527 return NULL;
1528}
1529
1530DataExtractor
1531ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id)
1532{
1533 const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id);
1534 if (segment_header == NULL)
1535 return DataExtractor();
1536 return DataExtractor(m_data, segment_header->p_offset, segment_header->p_filesz);
1537}
1538
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001539std::string
1540ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const
1541{
1542 size_t pos = symbol_name.find("@");
1543 return symbol_name.substr(0, pos).str();
1544}
1545
Michael Sartaina7499c92013-07-01 19:45:50 +00001546//----------------------------------------------------------------------
1547// ParseSectionHeaders
1548//----------------------------------------------------------------------
1549size_t
1550ObjectFileELF::ParseSectionHeaders()
1551{
Todd Fialab91de782014-06-27 16:52:49 +00001552 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, m_gnu_debuglink_file, m_gnu_debuglink_crc, m_arch_spec);
Michael Sartaina7499c92013-07-01 19:45:50 +00001553}
1554
Michael Sartaina7499c92013-07-01 19:45:50 +00001555const ObjectFileELF::ELFSectionHeaderInfo *
1556ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id)
1557{
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001558 if (!id || !ParseSectionHeaders())
Michael Sartaina7499c92013-07-01 19:45:50 +00001559 return NULL;
1560
1561 if (--id < m_section_headers.size())
1562 return &m_section_headers[id];
1563
1564 return NULL;
1565}
1566
Greg Clayton3046e662013-07-10 01:23:25 +00001567void
1568ObjectFileELF::CreateSections(SectionList &unified_section_list)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001569{
Greg Clayton3046e662013-07-10 01:23:25 +00001570 if (!m_sections_ap.get() && ParseSectionHeaders())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001571 {
1572 m_sections_ap.reset(new SectionList());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001573
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001574 for (SectionHeaderCollIter I = m_section_headers.begin();
1575 I != m_section_headers.end(); ++I)
1576 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001577 const ELFSectionHeaderInfo &header = *I;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001578
Michael Sartaina7499c92013-07-01 19:45:50 +00001579 ConstString& name = I->section_name;
Greg Clayton47037bc2012-03-27 02:40:46 +00001580 const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1581 const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001582
Greg Clayton4ceb9982010-07-21 22:54:26 +00001583 static ConstString g_sect_name_text (".text");
1584 static ConstString g_sect_name_data (".data");
1585 static ConstString g_sect_name_bss (".bss");
Greg Clayton741f3f92012-03-27 21:10:07 +00001586 static ConstString g_sect_name_tdata (".tdata");
1587 static ConstString g_sect_name_tbss (".tbss");
Greg Clayton4ceb9982010-07-21 22:54:26 +00001588 static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev");
1589 static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges");
1590 static ConstString g_sect_name_dwarf_debug_frame (".debug_frame");
1591 static ConstString g_sect_name_dwarf_debug_info (".debug_info");
1592 static ConstString g_sect_name_dwarf_debug_line (".debug_line");
1593 static ConstString g_sect_name_dwarf_debug_loc (".debug_loc");
1594 static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo");
1595 static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames");
1596 static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes");
1597 static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges");
1598 static ConstString g_sect_name_dwarf_debug_str (".debug_str");
1599 static ConstString g_sect_name_eh_frame (".eh_frame");
1600
1601 SectionType sect_type = eSectionTypeOther;
1602
Greg Clayton741f3f92012-03-27 21:10:07 +00001603 bool is_thread_specific = false;
Michael Sartaina7499c92013-07-01 19:45:50 +00001604
Greg Clayton4ceb9982010-07-21 22:54:26 +00001605 if (name == g_sect_name_text) sect_type = eSectionTypeCode;
1606 else if (name == g_sect_name_data) sect_type = eSectionTypeData;
1607 else if (name == g_sect_name_bss) sect_type = eSectionTypeZeroFill;
Greg Clayton741f3f92012-03-27 21:10:07 +00001608 else if (name == g_sect_name_tdata)
1609 {
1610 sect_type = eSectionTypeData;
1611 is_thread_specific = true;
1612 }
1613 else if (name == g_sect_name_tbss)
1614 {
1615 sect_type = eSectionTypeZeroFill;
1616 is_thread_specific = true;
1617 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001618 // .debug_abbrev – Abbreviations used in the .debug_info section
1619 // .debug_aranges – Lookup table for mapping addresses to compilation units
1620 // .debug_frame – Call frame information
1621 // .debug_info – The core DWARF information section
1622 // .debug_line – Line number information
1623 // .debug_loc – Location lists used in DW_AT_location attributes
1624 // .debug_macinfo – Macro information
1625 // .debug_pubnames – Lookup table for mapping object and function names to compilation units
1626 // .debug_pubtypes – Lookup table for mapping type names to compilation units
1627 // .debug_ranges – Address ranges used in DW_AT_ranges attributes
1628 // .debug_str – String table used in .debug_info
Michael Sartain3cf443d2013-07-17 00:26:30 +00001629 // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
1630 // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
Michael Sartaina7499c92013-07-01 19:45:50 +00001631 // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
Greg Clayton4ceb9982010-07-21 22:54:26 +00001632 else if (name == g_sect_name_dwarf_debug_abbrev) sect_type = eSectionTypeDWARFDebugAbbrev;
1633 else if (name == g_sect_name_dwarf_debug_aranges) sect_type = eSectionTypeDWARFDebugAranges;
1634 else if (name == g_sect_name_dwarf_debug_frame) sect_type = eSectionTypeDWARFDebugFrame;
1635 else if (name == g_sect_name_dwarf_debug_info) sect_type = eSectionTypeDWARFDebugInfo;
1636 else if (name == g_sect_name_dwarf_debug_line) sect_type = eSectionTypeDWARFDebugLine;
1637 else if (name == g_sect_name_dwarf_debug_loc) sect_type = eSectionTypeDWARFDebugLoc;
1638 else if (name == g_sect_name_dwarf_debug_macinfo) sect_type = eSectionTypeDWARFDebugMacInfo;
1639 else if (name == g_sect_name_dwarf_debug_pubnames) sect_type = eSectionTypeDWARFDebugPubNames;
1640 else if (name == g_sect_name_dwarf_debug_pubtypes) sect_type = eSectionTypeDWARFDebugPubTypes;
1641 else if (name == g_sect_name_dwarf_debug_ranges) sect_type = eSectionTypeDWARFDebugRanges;
1642 else if (name == g_sect_name_dwarf_debug_str) sect_type = eSectionTypeDWARFDebugStr;
1643 else if (name == g_sect_name_eh_frame) sect_type = eSectionTypeEHFrame;
Michael Sartaina7499c92013-07-01 19:45:50 +00001644
1645 switch (header.sh_type)
Michael Sartainc836ae72013-05-23 20:57:03 +00001646 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001647 case SHT_SYMTAB:
1648 assert (sect_type == eSectionTypeOther);
1649 sect_type = eSectionTypeELFSymbolTable;
1650 break;
1651 case SHT_DYNSYM:
1652 assert (sect_type == eSectionTypeOther);
1653 sect_type = eSectionTypeELFDynamicSymbols;
1654 break;
1655 case SHT_RELA:
1656 case SHT_REL:
1657 assert (sect_type == eSectionTypeOther);
1658 sect_type = eSectionTypeELFRelocationEntries;
1659 break;
1660 case SHT_DYNAMIC:
1661 assert (sect_type == eSectionTypeOther);
1662 sect_type = eSectionTypeELFDynamicLinkInfo;
1663 break;
Michael Sartainc836ae72013-05-23 20:57:03 +00001664 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001665
Matthew Gardinerf03e6d842014-09-29 08:02:24 +00001666 if (eSectionTypeOther == sect_type)
1667 {
1668 // the kalimba toolchain assumes that ELF section names are free-form. It does
1669 // supports linkscripts which (can) give rise to various arbitarily named
1670 // sections being "Code" or "Data".
1671 sect_type = kalimbaSectionType(m_header, header);
1672 }
1673
1674 const uint32_t target_bytes_size =
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +00001675 (eSectionTypeData == sect_type || eSectionTypeZeroFill == sect_type) ?
Matthew Gardinerf03e6d842014-09-29 08:02:24 +00001676 m_arch_spec.GetDataByteSize() :
1677 eSectionTypeCode == sect_type ?
1678 m_arch_spec.GetCodeByteSize() : 1;
1679
Zachary Turner736d4d82014-06-25 05:42:32 +00001680 elf::elf_xword log2align = (header.sh_addralign==0)
1681 ? 0
1682 : llvm::Log2_64(header.sh_addralign);
Greg Clayton3046e662013-07-10 01:23:25 +00001683 SectionSP section_sp (new Section(GetModule(), // Module to which this section belongs.
1684 this, // ObjectFile to which this section belongs and should read section data from.
1685 SectionIndex(I), // Section ID.
1686 name, // Section name.
1687 sect_type, // Section type.
1688 header.sh_addr, // VM address.
1689 vm_size, // VM size in bytes of this section.
1690 header.sh_offset, // Offset of this section in the file.
1691 file_size, // Size of the section as found in the file.
Zachary Turner736d4d82014-06-25 05:42:32 +00001692 log2align, // Alignment of the section
Matthew Gardinerf03e6d842014-09-29 08:02:24 +00001693 header.sh_flags, // Flags for this section.
1694 target_bytes_size));// Number of host bytes per target byte
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001695
Greg Clayton741f3f92012-03-27 21:10:07 +00001696 if (is_thread_specific)
1697 section_sp->SetIsThreadSpecific (is_thread_specific);
1698 m_sections_ap->AddSection(section_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001699 }
1700 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001701
Greg Clayton3046e662013-07-10 01:23:25 +00001702 if (m_sections_ap.get())
1703 {
1704 if (GetType() == eTypeDebugInfo)
1705 {
1706 static const SectionType g_sections[] =
1707 {
1708 eSectionTypeDWARFDebugAranges,
1709 eSectionTypeDWARFDebugInfo,
1710 eSectionTypeDWARFDebugAbbrev,
1711 eSectionTypeDWARFDebugFrame,
1712 eSectionTypeDWARFDebugLine,
1713 eSectionTypeDWARFDebugStr,
1714 eSectionTypeDWARFDebugLoc,
1715 eSectionTypeDWARFDebugMacInfo,
1716 eSectionTypeDWARFDebugPubNames,
1717 eSectionTypeDWARFDebugPubTypes,
1718 eSectionTypeDWARFDebugRanges,
1719 eSectionTypeELFSymbolTable,
1720 };
1721 SectionList *elf_section_list = m_sections_ap.get();
1722 for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx)
1723 {
1724 SectionType section_type = g_sections[idx];
1725 SectionSP section_sp (elf_section_list->FindSectionByType (section_type, true));
1726 if (section_sp)
1727 {
1728 SectionSP module_section_sp (unified_section_list.FindSectionByType (section_type, true));
1729 if (module_section_sp)
1730 unified_section_list.ReplaceSection (module_section_sp->GetID(), section_sp);
1731 else
1732 unified_section_list.AddSection (section_sp);
1733 }
1734 }
1735 }
1736 else
1737 {
1738 unified_section_list = *m_sections_ap;
1739 }
1740 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001741}
1742
Greg Clayton3046e662013-07-10 01:23:25 +00001743// private
Michael Sartaina7499c92013-07-01 19:45:50 +00001744unsigned
Greg Clayton3046e662013-07-10 01:23:25 +00001745ObjectFileELF::ParseSymbols (Symtab *symtab,
1746 user_id_t start_id,
1747 SectionList *section_list,
1748 const size_t num_symbols,
1749 const DataExtractor &symtab_data,
1750 const DataExtractor &strtab_data)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001751{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001752 ELFSymbol symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +00001753 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001754
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001755 static ConstString text_section_name(".text");
1756 static ConstString init_section_name(".init");
1757 static ConstString fini_section_name(".fini");
1758 static ConstString ctors_section_name(".ctors");
1759 static ConstString dtors_section_name(".dtors");
1760
1761 static ConstString data_section_name(".data");
1762 static ConstString rodata_section_name(".rodata");
1763 static ConstString rodata1_section_name(".rodata1");
1764 static ConstString data2_section_name(".data1");
1765 static ConstString bss_section_name(".bss");
Justin Hibbits6256a0e2014-10-31 02:34:28 +00001766 static ConstString opd_section_name(".opd"); // For ppc64
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001767
Greg Clayton9594f4c2013-04-13 23:17:23 +00001768 //StreamFile strm(stdout, false);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001769 unsigned i;
1770 for (i = 0; i < num_symbols; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001771 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001772 if (symbol.Parse(symtab_data, &offset) == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001773 break;
Greg Clayton9594f4c2013-04-13 23:17:23 +00001774
1775 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1776
Andrew MacPherson17220c12014-03-05 10:12:43 +00001777 // No need to add non-section symbols that have no names
1778 if (symbol.getType() != STT_SECTION &&
1779 (symbol_name == NULL || symbol_name[0] == '\0'))
Greg Clayton9594f4c2013-04-13 23:17:23 +00001780 continue;
1781
1782 //symbol.Dump (&strm, i, &strtab_data, section_list);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001783
Greg Claytone72dfb32012-02-24 01:59:29 +00001784 SectionSP symbol_section_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001785 SymbolType symbol_type = eSymbolTypeInvalid;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001786 Elf64_Half symbol_idx = symbol.st_shndx;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001787
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001788 switch (symbol_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001789 {
1790 case SHN_ABS:
1791 symbol_type = eSymbolTypeAbsolute;
1792 break;
1793 case SHN_UNDEF:
1794 symbol_type = eSymbolTypeUndefined;
1795 break;
1796 default:
Greg Claytone72dfb32012-02-24 01:59:29 +00001797 symbol_section_sp = section_list->GetSectionAtIndex(symbol_idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001798 break;
1799 }
1800
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001801 // If a symbol is undefined do not process it further even if it has a STT type
1802 if (symbol_type != eSymbolTypeUndefined)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001803 {
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001804 switch (symbol.getType())
1805 {
1806 default:
1807 case STT_NOTYPE:
1808 // The symbol's type is not specified.
1809 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001810
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001811 case STT_OBJECT:
1812 // The symbol is associated with a data object, such as a variable,
1813 // an array, etc.
1814 symbol_type = eSymbolTypeData;
1815 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001816
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001817 case STT_FUNC:
1818 // The symbol is associated with a function or other executable code.
1819 symbol_type = eSymbolTypeCode;
1820 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001821
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001822 case STT_SECTION:
1823 // The symbol is associated with a section. Symbol table entries of
1824 // this type exist primarily for relocation and normally have
1825 // STB_LOCAL binding.
1826 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001827
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001828 case STT_FILE:
1829 // Conventionally, the symbol's name gives the name of the source
1830 // file associated with the object file. A file symbol has STB_LOCAL
1831 // binding, its section index is SHN_ABS, and it precedes the other
1832 // STB_LOCAL symbols for the file, if it is present.
Greg Clayton9594f4c2013-04-13 23:17:23 +00001833 symbol_type = eSymbolTypeSourceFile;
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001834 break;
Matt Kopec00049b82013-02-27 20:13:38 +00001835
1836 case STT_GNU_IFUNC:
1837 // The symbol is associated with an indirect function. The actual
1838 // function will be resolved if it is referenced.
1839 symbol_type = eSymbolTypeResolver;
1840 break;
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001841 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001842 }
1843
1844 if (symbol_type == eSymbolTypeInvalid)
1845 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001846 if (symbol_section_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001847 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001848 const ConstString &sect_name = symbol_section_sp->GetName();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001849 if (sect_name == text_section_name ||
1850 sect_name == init_section_name ||
1851 sect_name == fini_section_name ||
1852 sect_name == ctors_section_name ||
1853 sect_name == dtors_section_name)
1854 {
1855 symbol_type = eSymbolTypeCode;
1856 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001857 else if (sect_name == data_section_name ||
1858 sect_name == data2_section_name ||
1859 sect_name == rodata_section_name ||
1860 sect_name == rodata1_section_name ||
1861 sect_name == bss_section_name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001862 {
1863 symbol_type = eSymbolTypeData;
1864 }
1865 }
1866 }
1867
Todd Fialafbd703a2014-09-15 22:33:39 +00001868 int64_t symbol_value_offset = 0;
1869 uint32_t additional_flags = 0;
Todd Fiala1a088662014-09-15 16:27:44 +00001870
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001871 ArchSpec arch;
1872 if (GetArchitecture(arch))
Todd Fiala1a088662014-09-15 16:27:44 +00001873 {
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001874 if (arch.GetMachine() == llvm::Triple::arm)
Todd Fialafbd703a2014-09-15 22:33:39 +00001875 {
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001876 if (symbol.getBinding() == STB_LOCAL && symbol_name && symbol_name[0] == '$')
1877 {
1878 // These are reserved for the specification (e.g.: mapping
1879 // symbols). We don't want to add them to the symbol table.
1880
1881 llvm::StringRef symbol_name_ref(symbol_name);
1882 if (symbol_name_ref == "$a" || symbol_name_ref.startswith("$a."))
1883 {
1884 // $a[.<any>]* - marks an ARM instruction sequence
1885 m_address_class_map[symbol.st_value] = eAddressClassCode;
1886 }
1887 else if (symbol_name_ref == "$b" || symbol_name_ref.startswith("$b.") ||
1888 symbol_name_ref == "$t" || symbol_name_ref.startswith("$t."))
1889 {
1890 // $b[.<any>]* - marks a THUMB BL instruction sequence
1891 // $t[.<any>]* - marks a THUMB instruction sequence
1892 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
1893 }
1894 else if (symbol_name_ref == "$d" || symbol_name_ref.startswith("$d."))
1895 {
1896 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
1897 m_address_class_map[symbol.st_value] = eAddressClassData;
1898 }
1899
1900 continue;
1901 }
1902 }
1903 else if (arch.GetMachine() == llvm::Triple::aarch64)
1904 {
1905 if (symbol.getBinding() == STB_LOCAL && symbol_name && symbol_name[0] == '$')
1906 {
1907 // These are reserved for the specification (e.g.: mapping
1908 // symbols). We don't want to add them to the symbol table.
1909
1910 llvm::StringRef symbol_name_ref(symbol_name);
1911 if (symbol_name_ref == "$x" || symbol_name_ref.startswith("$x."))
1912 {
1913 // $x[.<any>]* - marks an A64 instruction sequence
1914 m_address_class_map[symbol.st_value] = eAddressClassCode;
1915 }
1916 else if (symbol_name_ref == "$d" || symbol_name_ref.startswith("$d."))
1917 {
1918 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
1919 m_address_class_map[symbol.st_value] = eAddressClassData;
1920 }
1921
1922 continue;
1923 }
1924 }
1925
1926 if (arch.GetMachine() == llvm::Triple::arm)
1927 {
1928 // THUMB functions have the lower bit of their address set. Fixup
1929 // the actual address and mark the symbol as THUMB.
1930 if (symbol_type == eSymbolTypeCode && symbol.st_value & 1)
1931 {
1932 // Substracting 1 from the address effectively unsets
1933 // the low order bit, which results in the address
1934 // actually pointing to the beginning of the symbol.
1935 // This delta will be used below in conjuction with
1936 // symbol.st_value to produce the final symbol_value
1937 // that we store in the symtab.
1938 symbol_value_offset = -1;
1939 additional_flags = ARM_ELF_SYM_IS_THUMB;
1940 }
Todd Fialafbd703a2014-09-15 22:33:39 +00001941 }
Todd Fiala1a088662014-09-15 16:27:44 +00001942 }
1943
Greg Clayton3046e662013-07-10 01:23:25 +00001944 // If the symbol section we've found has no data (SHT_NOBITS), then check the module section
1945 // list. This can happen if we're parsing the debug file and it has no .text section, for example.
Michael Sartaina7499c92013-07-01 19:45:50 +00001946 if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0))
1947 {
1948 ModuleSP module_sp(GetModule());
1949 if (module_sp)
1950 {
Greg Clayton3046e662013-07-10 01:23:25 +00001951 SectionList *module_section_list = module_sp->GetSectionList();
1952 if (module_section_list && module_section_list != section_list)
Michael Sartaina7499c92013-07-01 19:45:50 +00001953 {
1954 const ConstString &sect_name = symbol_section_sp->GetName();
Greg Clayton3046e662013-07-10 01:23:25 +00001955 lldb::SectionSP section_sp (module_section_list->FindSectionByName (sect_name));
Michael Sartaina7499c92013-07-01 19:45:50 +00001956 if (section_sp && section_sp->GetFileSize())
1957 {
1958 symbol_section_sp = section_sp;
1959 }
1960 }
1961 }
1962 }
1963
Todd Fialafbd703a2014-09-15 22:33:39 +00001964 // symbol_value_offset may contain 0 for ARM symbols or -1 for
1965 // THUMB symbols. See above for more details.
Tamas Berghammer1b222b12015-04-16 14:06:18 +00001966 uint64_t symbol_value = symbol.st_value + symbol_value_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +00001967 if (symbol_section_sp && CalculateType() != ObjectFile::Type::eTypeObjectFile)
Greg Claytone72dfb32012-02-24 01:59:29 +00001968 symbol_value -= symbol_section_sp->GetFileAddress();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001969 bool is_global = symbol.getBinding() == STB_GLOBAL;
Todd Fialafbd703a2014-09-15 22:33:39 +00001970 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
Greg Clayton47037bc2012-03-27 02:40:46 +00001971 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
Todd Fialafbd703a2014-09-15 22:33:39 +00001972
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001973 llvm::StringRef symbol_ref(symbol_name);
1974
1975 // Symbol names may contain @VERSION suffixes. Find those and strip them temporarily.
1976 size_t version_pos = symbol_ref.find('@');
1977 bool has_suffix = version_pos != llvm::StringRef::npos;
1978 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos);
1979 Mangled mangled(ConstString(symbol_bare), is_mangled);
1980
1981 // Now append the suffix back to mangled and unmangled names. Only do it if the
1982 // demangling was sucessful (string is not empty).
1983 if (has_suffix)
1984 {
1985 llvm::StringRef suffix = symbol_ref.substr(version_pos);
1986
1987 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef();
1988 if (! mangled_name.empty())
1989 mangled.SetMangledName( ConstString((mangled_name + suffix).str()) );
1990
1991 llvm::StringRef demangled_name = mangled.GetDemangledName().GetStringRef();
1992 if (! demangled_name.empty())
1993 mangled.SetDemangledName( ConstString((demangled_name + suffix).str()) );
1994 }
1995
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001996 Symbol dc_symbol(
Greg Claytone72dfb32012-02-24 01:59:29 +00001997 i + start_id, // ID is the original symbol table index.
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001998 mangled,
Greg Claytone72dfb32012-02-24 01:59:29 +00001999 symbol_type, // Type of this symbol
2000 is_global, // Is this globally visible?
2001 false, // Is this symbol debug info?
2002 false, // Is this symbol a trampoline?
2003 false, // Is this symbol artificial?
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00002004 AddressRange(
2005 symbol_section_sp, // Section in which this symbol is defined or null.
2006 symbol_value, // Offset in section or symbol value.
2007 symbol.st_size), // Size in bytes of this symbol.
Greg Clayton9594f4c2013-04-13 23:17:23 +00002008 true, // Size is valid
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00002009 has_suffix, // Contains linker annotations?
Greg Claytone72dfb32012-02-24 01:59:29 +00002010 flags); // Symbol flags.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002011 symtab->AddSymbol(dc_symbol);
2012 }
Stephen Wilson499b40e2011-03-30 16:07:05 +00002013 return i;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002014}
2015
Stephen Wilson499b40e2011-03-30 16:07:05 +00002016unsigned
Greg Clayton3046e662013-07-10 01:23:25 +00002017ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab)
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002018{
Greg Clayton3046e662013-07-10 01:23:25 +00002019 if (symtab->GetObjectFile() != this)
2020 {
2021 // If the symbol table section is owned by a different object file, have it do the
2022 // parsing.
2023 ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile());
2024 return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
2025 }
2026
2027 // Get section list for this object file.
2028 SectionList *section_list = m_sections_ap.get();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002029 if (!section_list)
Stephen Wilson499b40e2011-03-30 16:07:05 +00002030 return 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002031
Greg Clayton3046e662013-07-10 01:23:25 +00002032 user_id_t symtab_id = symtab->GetID();
2033 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
Michael Sartaina7499c92013-07-01 19:45:50 +00002034 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
2035 symtab_hdr->sh_type == SHT_DYNSYM);
2036
Greg Clayton3046e662013-07-10 01:23:25 +00002037 // sh_link: section header index of associated string table.
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002038 // Section ID's are ones based.
Stephen Wilson499b40e2011-03-30 16:07:05 +00002039 user_id_t strtab_id = symtab_hdr->sh_link + 1;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002040 Section *strtab = section_list->FindSectionByID(strtab_id).get();
Greg Clayton3046e662013-07-10 01:23:25 +00002041
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002042 if (symtab && strtab)
2043 {
Greg Clayton3046e662013-07-10 01:23:25 +00002044 assert (symtab->GetObjectFile() == this);
2045 assert (strtab->GetObjectFile() == this);
2046
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002047 DataExtractor symtab_data;
2048 DataExtractor strtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002049 if (ReadSectionData(symtab, symtab_data) &&
2050 ReadSectionData(strtab, strtab_data))
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002051 {
Greg Clayton3046e662013-07-10 01:23:25 +00002052 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
2053
Arnaud A. de Grandmaison62e5f4d2014-03-22 20:23:26 +00002054 return ParseSymbols(symbol_table, start_id, section_list,
2055 num_symbols, symtab_data, strtab_data);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002056 }
2057 }
Stephen Wilson499b40e2011-03-30 16:07:05 +00002058
Arnaud A. de Grandmaison62e5f4d2014-03-22 20:23:26 +00002059 return 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002060}
2061
2062size_t
2063ObjectFileELF::ParseDynamicSymbols()
2064{
2065 if (m_dynamic_symbols.size())
2066 return m_dynamic_symbols.size();
2067
Stephen Wilson499b40e2011-03-30 16:07:05 +00002068 SectionList *section_list = GetSectionList();
2069 if (!section_list)
Bill Wendlinged24dcc2012-04-03 07:50:11 +00002070 return 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002071
Greg Clayton3046e662013-07-10 01:23:25 +00002072 // Find the SHT_DYNAMIC section.
2073 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
Stephen Wilson499b40e2011-03-30 16:07:05 +00002074 if (!dynsym)
Bill Wendlinged24dcc2012-04-03 07:50:11 +00002075 return 0;
Greg Clayton3046e662013-07-10 01:23:25 +00002076 assert (dynsym->GetObjectFile() == this);
Stephen Wilson499b40e2011-03-30 16:07:05 +00002077
2078 ELFDynamic symbol;
2079 DataExtractor dynsym_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002080 if (ReadSectionData(dynsym, dynsym_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00002081 {
Greg Claytonc7bece562013-01-25 18:06:21 +00002082 const lldb::offset_t section_size = dynsym_data.GetByteSize();
2083 lldb::offset_t cursor = 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002084
2085 while (cursor < section_size)
2086 {
Stephen Wilson499b40e2011-03-30 16:07:05 +00002087 if (!symbol.Parse(dynsym_data, &cursor))
2088 break;
2089
2090 m_dynamic_symbols.push_back(symbol);
2091 }
2092 }
2093
2094 return m_dynamic_symbols.size();
2095}
2096
2097const ELFDynamic *
2098ObjectFileELF::FindDynamicSymbol(unsigned tag)
2099{
2100 if (!ParseDynamicSymbols())
2101 return NULL;
2102
Stephen Wilson499b40e2011-03-30 16:07:05 +00002103 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2104 DynamicSymbolCollIter E = m_dynamic_symbols.end();
2105 for ( ; I != E; ++I)
2106 {
2107 ELFDynamic *symbol = &*I;
2108
2109 if (symbol->d_tag == tag)
2110 return symbol;
2111 }
2112
2113 return NULL;
2114}
2115
Stephen Wilson499b40e2011-03-30 16:07:05 +00002116unsigned
2117ObjectFileELF::PLTRelocationType()
2118{
Michael Sartainf7899542013-08-22 21:25:53 +00002119 // DT_PLTREL
2120 // This member specifies the type of relocation entry to which the
2121 // procedure linkage table refers. The d_val member holds DT_REL or
2122 // DT_RELA, as appropriate. All relocations in a procedure linkage table
2123 // must use the same relocation.
Stephen Wilson499b40e2011-03-30 16:07:05 +00002124 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2125
2126 if (symbol)
2127 return symbol->d_val;
2128
2129 return 0;
2130}
2131
2132static unsigned
2133ParsePLTRelocations(Symtab *symbol_table,
2134 user_id_t start_id,
2135 unsigned rel_type,
2136 const ELFHeader *hdr,
2137 const ELFSectionHeader *rel_hdr,
2138 const ELFSectionHeader *plt_hdr,
2139 const ELFSectionHeader *sym_hdr,
Greg Claytone72dfb32012-02-24 01:59:29 +00002140 const lldb::SectionSP &plt_section_sp,
Stephen Wilson499b40e2011-03-30 16:07:05 +00002141 DataExtractor &rel_data,
2142 DataExtractor &symtab_data,
2143 DataExtractor &strtab_data)
2144{
2145 ELFRelocation rel(rel_type);
2146 ELFSymbol symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +00002147 lldb::offset_t offset = 0;
Michael Sartainf7899542013-08-22 21:25:53 +00002148 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 16 bytes.
2149 // So round the entsize up by the alignment if addralign is set.
2150 const elf_xword plt_entsize = plt_hdr->sh_addralign ?
2151 llvm::RoundUpToAlignment (plt_hdr->sh_entsize, plt_hdr->sh_addralign) : plt_hdr->sh_entsize;
Greg Claytonc7bece562013-01-25 18:06:21 +00002152 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002153
2154 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2155 reloc_info_fn reloc_type;
2156 reloc_info_fn reloc_symbol;
2157
Greg Claytond091afe2012-11-12 22:53:16 +00002158 if (hdr->Is32Bit())
Stephen Wilson499b40e2011-03-30 16:07:05 +00002159 {
2160 reloc_type = ELFRelocation::RelocType32;
2161 reloc_symbol = ELFRelocation::RelocSymbol32;
2162 }
2163 else
2164 {
2165 reloc_type = ELFRelocation::RelocType64;
2166 reloc_symbol = ELFRelocation::RelocSymbol64;
2167 }
2168
2169 unsigned slot_type = hdr->GetRelocationJumpSlotType();
2170 unsigned i;
2171 for (i = 0; i < num_relocations; ++i)
2172 {
2173 if (rel.Parse(rel_data, &offset) == false)
2174 break;
2175
2176 if (reloc_type(rel) != slot_type)
2177 continue;
2178
Greg Claytonc7bece562013-01-25 18:06:21 +00002179 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002180 uint64_t plt_index = (i + 1) * plt_entsize;
2181
2182 if (!symbol.Parse(symtab_data, &symbol_offset))
2183 break;
2184
2185 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
Greg Clayton47037bc2012-03-27 02:40:46 +00002186 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002187
2188 Symbol jump_symbol(
2189 i + start_id, // Symbol table index
2190 symbol_name, // symbol name.
Greg Clayton47037bc2012-03-27 02:40:46 +00002191 is_mangled, // is the symbol name mangled?
Stephen Wilson499b40e2011-03-30 16:07:05 +00002192 eSymbolTypeTrampoline, // Type of this symbol
2193 false, // Is this globally visible?
2194 false, // Is this symbol debug info?
2195 true, // Is this symbol a trampoline?
2196 true, // Is this symbol artificial?
Greg Claytone72dfb32012-02-24 01:59:29 +00002197 plt_section_sp, // Section in which this symbol is defined or null.
Stephen Wilson499b40e2011-03-30 16:07:05 +00002198 plt_index, // Offset in section or symbol value.
2199 plt_entsize, // Size in bytes of this symbol.
Greg Clayton9594f4c2013-04-13 23:17:23 +00002200 true, // Size is valid
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00002201 false, // Contains linker annotations?
Stephen Wilson499b40e2011-03-30 16:07:05 +00002202 0); // Symbol flags.
2203
2204 symbol_table->AddSymbol(jump_symbol);
2205 }
2206
2207 return i;
2208}
2209
2210unsigned
2211ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table,
2212 user_id_t start_id,
Michael Sartaina7499c92013-07-01 19:45:50 +00002213 const ELFSectionHeaderInfo *rel_hdr,
Stephen Wilson499b40e2011-03-30 16:07:05 +00002214 user_id_t rel_id)
2215{
2216 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2217
Greg Clayton3046e662013-07-10 01:23:25 +00002218 // The link field points to the associated symbol table. The info field
Stephen Wilson499b40e2011-03-30 16:07:05 +00002219 // points to the section holding the plt.
2220 user_id_t symtab_id = rel_hdr->sh_link;
2221 user_id_t plt_id = rel_hdr->sh_info;
2222
2223 if (!symtab_id || !plt_id)
2224 return 0;
2225
2226 // Section ID's are ones based;
2227 symtab_id++;
2228 plt_id++;
2229
Michael Sartaina7499c92013-07-01 19:45:50 +00002230 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +00002231 if (!plt_hdr)
2232 return 0;
2233
Michael Sartaina7499c92013-07-01 19:45:50 +00002234 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +00002235 if (!sym_hdr)
2236 return 0;
2237
Greg Clayton3046e662013-07-10 01:23:25 +00002238 SectionList *section_list = m_sections_ap.get();
Stephen Wilson499b40e2011-03-30 16:07:05 +00002239 if (!section_list)
2240 return 0;
2241
2242 Section *rel_section = section_list->FindSectionByID(rel_id).get();
2243 if (!rel_section)
2244 return 0;
2245
Greg Claytone72dfb32012-02-24 01:59:29 +00002246 SectionSP plt_section_sp (section_list->FindSectionByID(plt_id));
2247 if (!plt_section_sp)
Stephen Wilson499b40e2011-03-30 16:07:05 +00002248 return 0;
2249
2250 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2251 if (!symtab)
2252 return 0;
2253
Greg Clayton3046e662013-07-10 01:23:25 +00002254 // sh_link points to associated string table.
Stephen Wilson499b40e2011-03-30 16:07:05 +00002255 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
2256 if (!strtab)
2257 return 0;
2258
2259 DataExtractor rel_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002260 if (!ReadSectionData(rel_section, rel_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00002261 return 0;
2262
2263 DataExtractor symtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002264 if (!ReadSectionData(symtab, symtab_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00002265 return 0;
2266
2267 DataExtractor strtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002268 if (!ReadSectionData(strtab, strtab_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00002269 return 0;
2270
2271 unsigned rel_type = PLTRelocationType();
2272 if (!rel_type)
2273 return 0;
2274
Greg Claytone72dfb32012-02-24 01:59:29 +00002275 return ParsePLTRelocations (symbol_table,
2276 start_id,
2277 rel_type,
2278 &m_header,
2279 rel_hdr,
2280 plt_hdr,
2281 sym_hdr,
2282 plt_section_sp,
2283 rel_data,
2284 symtab_data,
2285 strtab_data);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002286}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002287
Andrew MacPherson17220c12014-03-05 10:12:43 +00002288unsigned
2289ObjectFileELF::RelocateSection(Symtab* symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2290 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2291 DataExtractor &rel_data, DataExtractor &symtab_data,
2292 DataExtractor &debug_data, Section* rel_section)
2293{
2294 ELFRelocation rel(rel_hdr->sh_type);
2295 lldb::addr_t offset = 0;
2296 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2297 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2298 reloc_info_fn reloc_type;
2299 reloc_info_fn reloc_symbol;
2300
2301 if (hdr->Is32Bit())
2302 {
2303 reloc_type = ELFRelocation::RelocType32;
2304 reloc_symbol = ELFRelocation::RelocSymbol32;
2305 }
2306 else
2307 {
2308 reloc_type = ELFRelocation::RelocType64;
2309 reloc_symbol = ELFRelocation::RelocSymbol64;
2310 }
2311
2312 for (unsigned i = 0; i < num_relocations; ++i)
2313 {
2314 if (rel.Parse(rel_data, &offset) == false)
2315 break;
2316
2317 Symbol* symbol = NULL;
2318
2319 if (hdr->Is32Bit())
2320 {
2321 switch (reloc_type(rel)) {
2322 case R_386_32:
2323 case R_386_PC32:
2324 default:
2325 assert(false && "unexpected relocation type");
2326 }
2327 } else {
2328 switch (reloc_type(rel)) {
2329 case R_X86_64_64:
2330 {
2331 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2332 if (symbol)
2333 {
2334 addr_t value = symbol->GetAddress().GetFileAddress();
2335 DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2336 uint64_t* dst = reinterpret_cast<uint64_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset64(rel));
2337 *dst = value + ELFRelocation::RelocAddend64(rel);
2338 }
2339 break;
2340 }
2341 case R_X86_64_32:
2342 case R_X86_64_32S:
2343 {
2344 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2345 if (symbol)
2346 {
2347 addr_t value = symbol->GetAddress().GetFileAddress();
2348 value += ELFRelocation::RelocAddend32(rel);
2349 assert((reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) ||
2350 (reloc_type(rel) == R_X86_64_32S &&
2351 ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN)));
2352 uint32_t truncated_addr = (value & 0xFFFFFFFF);
2353 DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2354 uint32_t* dst = reinterpret_cast<uint32_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel));
2355 *dst = truncated_addr;
2356 }
2357 break;
2358 }
2359 case R_X86_64_PC32:
2360 default:
2361 assert(false && "unexpected relocation type");
2362 }
2363 }
2364 }
2365
2366 return 0;
2367}
2368
2369unsigned
2370ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, user_id_t rel_id)
2371{
2372 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2373
2374 // Parse in the section list if needed.
2375 SectionList *section_list = GetSectionList();
2376 if (!section_list)
2377 return 0;
2378
2379 // Section ID's are ones based.
2380 user_id_t symtab_id = rel_hdr->sh_link + 1;
2381 user_id_t debug_id = rel_hdr->sh_info + 1;
2382
2383 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2384 if (!symtab_hdr)
2385 return 0;
2386
2387 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2388 if (!debug_hdr)
2389 return 0;
2390
2391 Section *rel = section_list->FindSectionByID(rel_id).get();
2392 if (!rel)
2393 return 0;
2394
2395 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2396 if (!symtab)
2397 return 0;
2398
2399 Section *debug = section_list->FindSectionByID(debug_id).get();
2400 if (!debug)
2401 return 0;
2402
2403 DataExtractor rel_data;
2404 DataExtractor symtab_data;
2405 DataExtractor debug_data;
2406
2407 if (ReadSectionData(rel, rel_data) &&
2408 ReadSectionData(symtab, symtab_data) &&
2409 ReadSectionData(debug, debug_data))
2410 {
2411 RelocateSection(m_symtab_ap.get(), &m_header, rel_hdr, symtab_hdr, debug_hdr,
2412 rel_data, symtab_data, debug_data, debug);
2413 }
2414
2415 return 0;
2416}
2417
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002418Symtab *
Greg Clayton3046e662013-07-10 01:23:25 +00002419ObjectFileELF::GetSymtab()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002420{
Michael Sartaina7499c92013-07-01 19:45:50 +00002421 ModuleSP module_sp(GetModule());
Greg Clayton3046e662013-07-10 01:23:25 +00002422 if (!module_sp)
2423 return NULL;
Michael Sartaina7499c92013-07-01 19:45:50 +00002424
Greg Clayton3046e662013-07-10 01:23:25 +00002425 // We always want to use the main object file so we (hopefully) only have one cached copy
2426 // of our symtab, dynamic sections, etc.
2427 ObjectFile *module_obj_file = module_sp->GetObjectFile();
2428 if (module_obj_file && module_obj_file != this)
2429 return module_obj_file->GetSymtab();
2430
2431 if (m_symtab_ap.get() == NULL)
2432 {
Pavel Labath783cbdc2015-03-04 10:28:15 +00002433 SectionList *section_list = module_sp->GetSectionList();
Michael Sartaina7499c92013-07-01 19:45:50 +00002434 if (!section_list)
2435 return NULL;
2436
Greg Clayton3046e662013-07-10 01:23:25 +00002437 uint64_t symbol_id = 0;
2438 lldb_private::Mutex::Locker locker(module_sp->GetMutex());
Stephen Wilson499b40e2011-03-30 16:07:05 +00002439
Greg Clayton3046e662013-07-10 01:23:25 +00002440 m_symtab_ap.reset(new Symtab(this));
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002441
Michael Sartaina7499c92013-07-01 19:45:50 +00002442 // Sharable objects and dynamic executables usually have 2 distinct symbol
2443 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller
2444 // version of the symtab that only contains global symbols. The information found
2445 // in the dynsym is therefore also found in the symtab, while the reverse is not
2446 // necessarily true.
Greg Clayton3046e662013-07-10 01:23:25 +00002447 Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get();
2448 if (!symtab)
Michael Sartaina7499c92013-07-01 19:45:50 +00002449 {
2450 // The symtab section is non-allocable and can be stripped, so if it doesn't exist
2451 // then use the dynsym section which should always be there.
Greg Clayton3046e662013-07-10 01:23:25 +00002452 symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get();
Michael Sartaina7499c92013-07-01 19:45:50 +00002453 }
Greg Clayton3046e662013-07-10 01:23:25 +00002454 if (symtab)
2455 symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab);
Michael Sartaina7499c92013-07-01 19:45:50 +00002456
Michael Sartainf7899542013-08-22 21:25:53 +00002457 // DT_JMPREL
2458 // If present, this entry's d_ptr member holds the address of relocation
2459 // entries associated solely with the procedure linkage table. Separating
2460 // these relocation entries lets the dynamic linker ignore them during
2461 // process initialization, if lazy binding is enabled. If this entry is
2462 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2463 // also be present.
Greg Clayton3046e662013-07-10 01:23:25 +00002464 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2465 if (symbol)
Michael Sartaina7499c92013-07-01 19:45:50 +00002466 {
Michael Sartainf7899542013-08-22 21:25:53 +00002467 // Synthesize trampoline symbols to help navigate the PLT.
Greg Clayton3046e662013-07-10 01:23:25 +00002468 addr_t addr = symbol->d_ptr;
2469 Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get();
2470 if (reloc_section)
Michael Sartaina7499c92013-07-01 19:45:50 +00002471 {
Greg Clayton3046e662013-07-10 01:23:25 +00002472 user_id_t reloc_id = reloc_section->GetID();
2473 const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id);
2474 assert(reloc_header);
Michael Sartaina7499c92013-07-01 19:45:50 +00002475
Greg Clayton3046e662013-07-10 01:23:25 +00002476 ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id);
Michael Sartaina7499c92013-07-01 19:45:50 +00002477 }
2478 }
Michael Sartaina7499c92013-07-01 19:45:50 +00002479 }
Andrew MacPherson17220c12014-03-05 10:12:43 +00002480
2481 for (SectionHeaderCollIter I = m_section_headers.begin();
2482 I != m_section_headers.end(); ++I)
2483 {
2484 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL)
2485 {
2486 if (CalculateType() == eTypeObjectFile)
2487 {
2488 const char *section_name = I->section_name.AsCString("");
2489 if (strstr(section_name, ".rela.debug") ||
2490 strstr(section_name, ".rel.debug"))
2491 {
2492 const ELFSectionHeader &reloc_header = *I;
2493 user_id_t reloc_id = SectionIndex(I);
2494 RelocateDebugSections(&reloc_header, reloc_id);
2495 }
2496 }
2497 }
2498 }
Greg Clayton3046e662013-07-10 01:23:25 +00002499 return m_symtab_ap.get();
2500}
2501
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002502Symbol *
2503ObjectFileELF::ResolveSymbolForAddress(const Address& so_addr, bool verify_unique)
2504{
2505 if (!m_symtab_ap.get())
2506 return nullptr; // GetSymtab() should be called first.
2507
2508 const SectionList *section_list = GetSectionList();
2509 if (!section_list)
2510 return nullptr;
2511
2512 if (DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo())
2513 {
2514 AddressRange range;
2515 if (eh_frame->GetAddressRange (so_addr, range))
2516 {
2517 const addr_t file_addr = range.GetBaseAddress().GetFileAddress();
2518 Symbol * symbol = verify_unique ? m_symtab_ap->FindSymbolContainingFileAddress(file_addr) : nullptr;
2519 if (symbol)
2520 return symbol;
2521
2522 // Note that a (stripped) symbol won't be found by GetSymtab()...
2523 lldb::SectionSP eh_sym_section_sp = section_list->FindSectionContainingFileAddress(file_addr);
2524 if (eh_sym_section_sp.get())
2525 {
2526 addr_t section_base = eh_sym_section_sp->GetFileAddress();
2527 addr_t offset = file_addr - section_base;
2528 uint64_t symbol_id = m_symtab_ap->GetNumSymbols();
2529
2530 Symbol eh_symbol(
2531 symbol_id, // Symbol table index.
2532 "???", // Symbol name.
2533 false, // Is the symbol name mangled?
2534 eSymbolTypeCode, // Type of this symbol.
2535 true, // Is this globally visible?
2536 false, // Is this symbol debug info?
2537 false, // Is this symbol a trampoline?
2538 true, // Is this symbol artificial?
2539 eh_sym_section_sp, // Section in which this symbol is defined or null.
2540 offset, // Offset in section or symbol value.
2541 range.GetByteSize(), // Size in bytes of this symbol.
2542 true, // Size is valid.
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00002543 false, // Contains linker annotations?
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002544 0); // Symbol flags.
2545 if (symbol_id == m_symtab_ap->AddSymbol(eh_symbol))
2546 return m_symtab_ap->SymbolAtIndex(symbol_id);
2547 }
2548 }
2549 }
2550 return nullptr;
2551}
2552
2553
Greg Clayton3046e662013-07-10 01:23:25 +00002554bool
2555ObjectFileELF::IsStripped ()
2556{
2557 // TODO: determine this for ELF
2558 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002559}
2560
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002561//===----------------------------------------------------------------------===//
2562// Dump
2563//
2564// Dump the specifics of the runtime file container (such as any headers
2565// segments, sections, etc).
2566//----------------------------------------------------------------------
2567void
2568ObjectFileELF::Dump(Stream *s)
2569{
2570 DumpELFHeader(s, m_header);
2571 s->EOL();
2572 DumpELFProgramHeaders(s);
2573 s->EOL();
2574 DumpELFSectionHeaders(s);
2575 s->EOL();
2576 SectionList *section_list = GetSectionList();
2577 if (section_list)
Greg Clayton10177aa2010-12-08 05:08:21 +00002578 section_list->Dump(s, NULL, true, UINT32_MAX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002579 Symtab *symtab = GetSymtab();
2580 if (symtab)
Greg Claytone0d378b2011-03-24 21:19:54 +00002581 symtab->Dump(s, NULL, eSortOrderNone);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002582 s->EOL();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002583 DumpDependentModules(s);
2584 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002585}
2586
2587//----------------------------------------------------------------------
2588// DumpELFHeader
2589//
2590// Dump the ELF header to the specified output stream
2591//----------------------------------------------------------------------
2592void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002593ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002594{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002595 s->PutCString("ELF Header\n");
2596 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2597 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n",
2598 header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]);
2599 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n",
2600 header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]);
2601 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n",
2602 header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002603
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002604 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2605 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002606 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2607 s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2608 s->Printf ("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
2609
2610 s->Printf("e_type = 0x%4.4x ", header.e_type);
2611 DumpELFHeader_e_type(s, header.e_type);
2612 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
2613 s->Printf("e_version = 0x%8.8x\n", header.e_version);
Daniel Malead01b2952012-11-29 21:49:15 +00002614 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
2615 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
2616 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002617 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
2618 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
2619 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
2620 s->Printf("e_phnum = 0x%4.4x\n", header.e_phnum);
2621 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
2622 s->Printf("e_shnum = 0x%4.4x\n", header.e_shnum);
2623 s->Printf("e_shstrndx = 0x%4.4x\n", header.e_shstrndx);
2624}
2625
2626//----------------------------------------------------------------------
2627// DumpELFHeader_e_type
2628//
2629// Dump an token value for the ELF header member e_type
2630//----------------------------------------------------------------------
2631void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002632ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002633{
2634 switch (e_type)
2635 {
2636 case ET_NONE: *s << "ET_NONE"; break;
2637 case ET_REL: *s << "ET_REL"; break;
2638 case ET_EXEC: *s << "ET_EXEC"; break;
2639 case ET_DYN: *s << "ET_DYN"; break;
2640 case ET_CORE: *s << "ET_CORE"; break;
2641 default:
2642 break;
2643 }
2644}
2645
2646//----------------------------------------------------------------------
2647// DumpELFHeader_e_ident_EI_DATA
2648//
2649// Dump an token value for the ELF header member e_ident[EI_DATA]
2650//----------------------------------------------------------------------
2651void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002652ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002653{
2654 switch (ei_data)
2655 {
2656 case ELFDATANONE: *s << "ELFDATANONE"; break;
2657 case ELFDATA2LSB: *s << "ELFDATA2LSB - Little Endian"; break;
2658 case ELFDATA2MSB: *s << "ELFDATA2MSB - Big Endian"; break;
2659 default:
2660 break;
2661 }
2662}
2663
2664
2665//----------------------------------------------------------------------
2666// DumpELFProgramHeader
2667//
2668// Dump a single ELF program header to the specified output stream
2669//----------------------------------------------------------------------
2670void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002671ObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002672{
2673 DumpELFProgramHeader_p_type(s, ph.p_type);
Daniel Malead01b2952012-11-29 21:49:15 +00002674 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr);
2675 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, ph.p_flags);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002676
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002677 DumpELFProgramHeader_p_flags(s, ph.p_flags);
Daniel Malead01b2952012-11-29 21:49:15 +00002678 s->Printf(") %8.8" PRIx64, ph.p_align);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002679}
2680
2681//----------------------------------------------------------------------
2682// DumpELFProgramHeader_p_type
2683//
2684// Dump an token value for the ELF program header member p_type which
2685// describes the type of the program header
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002686// ----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002687void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002688ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002689{
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00002690 const int kStrWidth = 15;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002691 switch (p_type)
2692 {
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00002693 CASE_AND_STREAM(s, PT_NULL , kStrWidth);
2694 CASE_AND_STREAM(s, PT_LOAD , kStrWidth);
2695 CASE_AND_STREAM(s, PT_DYNAMIC , kStrWidth);
2696 CASE_AND_STREAM(s, PT_INTERP , kStrWidth);
2697 CASE_AND_STREAM(s, PT_NOTE , kStrWidth);
2698 CASE_AND_STREAM(s, PT_SHLIB , kStrWidth);
2699 CASE_AND_STREAM(s, PT_PHDR , kStrWidth);
2700 CASE_AND_STREAM(s, PT_TLS , kStrWidth);
2701 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002702 default:
2703 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
2704 break;
2705 }
2706}
2707
2708
2709//----------------------------------------------------------------------
2710// DumpELFProgramHeader_p_flags
2711//
2712// Dump an token value for the ELF program header member p_flags
2713//----------------------------------------------------------------------
2714void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002715ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002716{
2717 *s << ((p_flags & PF_X) ? "PF_X" : " ")
2718 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
2719 << ((p_flags & PF_W) ? "PF_W" : " ")
2720 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
2721 << ((p_flags & PF_R) ? "PF_R" : " ");
2722}
2723
2724//----------------------------------------------------------------------
2725// DumpELFProgramHeaders
2726//
2727// Dump all of the ELF program header to the specified output stream
2728//----------------------------------------------------------------------
2729void
2730ObjectFileELF::DumpELFProgramHeaders(Stream *s)
2731{
Ed Maste3a8ab6e2015-02-23 15:33:11 +00002732 if (!ParseProgramHeaders())
2733 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002734
Ed Maste3a8ab6e2015-02-23 15:33:11 +00002735 s->PutCString("Program Headers\n");
2736 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
2737 "p_filesz p_memsz p_flags p_align\n");
2738 s->PutCString("==== --------------- -------- -------- -------- "
2739 "-------- -------- ------------------------- --------\n");
2740
2741 uint32_t idx = 0;
2742 for (ProgramHeaderCollConstIter I = m_program_headers.begin();
2743 I != m_program_headers.end(); ++I, ++idx)
2744 {
2745 s->Printf("[%2u] ", idx);
2746 ObjectFileELF::DumpELFProgramHeader(s, *I);
2747 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002748 }
2749}
2750
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002751//----------------------------------------------------------------------
2752// DumpELFSectionHeader
2753//
2754// Dump a single ELF section header to the specified output stream
2755//----------------------------------------------------------------------
2756void
Michael Sartaina7499c92013-07-01 19:45:50 +00002757ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002758{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002759 s->Printf("%8.8x ", sh.sh_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002760 DumpELFSectionHeader_sh_type(s, sh.sh_type);
Daniel Malead01b2952012-11-29 21:49:15 +00002761 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002762 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
Daniel Malead01b2952012-11-29 21:49:15 +00002763 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, sh.sh_offset, sh.sh_size);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002764 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
Daniel Malead01b2952012-11-29 21:49:15 +00002765 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002766}
2767
2768//----------------------------------------------------------------------
2769// DumpELFSectionHeader_sh_type
2770//
2771// Dump an token value for the ELF section header member sh_type which
2772// describes the type of the section
2773//----------------------------------------------------------------------
2774void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002775ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002776{
2777 const int kStrWidth = 12;
2778 switch (sh_type)
2779 {
2780 CASE_AND_STREAM(s, SHT_NULL , kStrWidth);
2781 CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth);
2782 CASE_AND_STREAM(s, SHT_SYMTAB , kStrWidth);
2783 CASE_AND_STREAM(s, SHT_STRTAB , kStrWidth);
2784 CASE_AND_STREAM(s, SHT_RELA , kStrWidth);
2785 CASE_AND_STREAM(s, SHT_HASH , kStrWidth);
2786 CASE_AND_STREAM(s, SHT_DYNAMIC , kStrWidth);
2787 CASE_AND_STREAM(s, SHT_NOTE , kStrWidth);
2788 CASE_AND_STREAM(s, SHT_NOBITS , kStrWidth);
2789 CASE_AND_STREAM(s, SHT_REL , kStrWidth);
2790 CASE_AND_STREAM(s, SHT_SHLIB , kStrWidth);
2791 CASE_AND_STREAM(s, SHT_DYNSYM , kStrWidth);
2792 CASE_AND_STREAM(s, SHT_LOPROC , kStrWidth);
2793 CASE_AND_STREAM(s, SHT_HIPROC , kStrWidth);
2794 CASE_AND_STREAM(s, SHT_LOUSER , kStrWidth);
2795 CASE_AND_STREAM(s, SHT_HIUSER , kStrWidth);
2796 default:
2797 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
2798 break;
2799 }
2800}
2801
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002802//----------------------------------------------------------------------
2803// DumpELFSectionHeader_sh_flags
2804//
2805// Dump an token value for the ELF section header member sh_flags
2806//----------------------------------------------------------------------
2807void
Greg Claytonc7bece562013-01-25 18:06:21 +00002808ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002809{
2810 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
2811 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
2812 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
2813 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
2814 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
2815}
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002816
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002817//----------------------------------------------------------------------
2818// DumpELFSectionHeaders
2819//
2820// Dump all of the ELF section header to the specified output stream
2821//----------------------------------------------------------------------
2822void
2823ObjectFileELF::DumpELFSectionHeaders(Stream *s)
2824{
Michael Sartaina7499c92013-07-01 19:45:50 +00002825 if (!ParseSectionHeaders())
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002826 return;
2827
2828 s->PutCString("Section Headers\n");
2829 s->PutCString("IDX name type flags "
2830 "addr offset size link info addralgn "
2831 "entsize Name\n");
2832 s->PutCString("==== -------- ------------ -------------------------------- "
2833 "-------- -------- -------- -------- -------- -------- "
2834 "-------- ====================\n");
2835
2836 uint32_t idx = 0;
2837 for (SectionHeaderCollConstIter I = m_section_headers.begin();
2838 I != m_section_headers.end(); ++I, ++idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002839 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002840 s->Printf("[%2u] ", idx);
2841 ObjectFileELF::DumpELFSectionHeader(s, *I);
Michael Sartaina7499c92013-07-01 19:45:50 +00002842 const char* section_name = I->section_name.AsCString("");
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002843 if (section_name)
2844 *s << ' ' << section_name << "\n";
2845 }
2846}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002847
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002848void
2849ObjectFileELF::DumpDependentModules(lldb_private::Stream *s)
2850{
2851 size_t num_modules = ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002852
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002853 if (num_modules > 0)
2854 {
2855 s->PutCString("Dependent Modules:\n");
2856 for (unsigned i = 0; i < num_modules; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002857 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002858 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
2859 s->Printf(" %s\n", spec.GetFilename().GetCString());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002860 }
2861 }
2862}
2863
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002864bool
Greg Clayton514487e2011-02-15 21:59:32 +00002865ObjectFileELF::GetArchitecture (ArchSpec &arch)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002866{
Stephen Wilson3f4200fd2011-02-24 19:16:15 +00002867 if (!ParseHeader())
2868 return false;
2869
Todd Fiala09512ec2014-07-11 15:43:51 +00002870 if (m_section_headers.empty())
2871 {
2872 // Allow elf notes to be parsed which may affect the detected architecture.
2873 ParseSectionHeaders();
2874 }
Todd Fialab91de782014-06-27 16:52:49 +00002875
2876 arch = m_arch_spec;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002877 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002878}
2879
Greg Clayton9e00b6a652011-07-09 00:41:34 +00002880ObjectFile::Type
2881ObjectFileELF::CalculateType()
2882{
2883 switch (m_header.e_type)
2884 {
2885 case llvm::ELF::ET_NONE:
2886 // 0 - No file type
2887 return eTypeUnknown;
2888
2889 case llvm::ELF::ET_REL:
2890 // 1 - Relocatable file
2891 return eTypeObjectFile;
2892
2893 case llvm::ELF::ET_EXEC:
2894 // 2 - Executable file
2895 return eTypeExecutable;
2896
2897 case llvm::ELF::ET_DYN:
2898 // 3 - Shared object file
2899 return eTypeSharedLibrary;
2900
2901 case ET_CORE:
2902 // 4 - Core file
2903 return eTypeCoreFile;
2904
2905 default:
2906 break;
2907 }
2908 return eTypeUnknown;
2909}
2910
2911ObjectFile::Strata
2912ObjectFileELF::CalculateStrata()
2913{
2914 switch (m_header.e_type)
2915 {
2916 case llvm::ELF::ET_NONE:
2917 // 0 - No file type
2918 return eStrataUnknown;
2919
2920 case llvm::ELF::ET_REL:
2921 // 1 - Relocatable file
2922 return eStrataUnknown;
2923
2924 case llvm::ELF::ET_EXEC:
2925 // 2 - Executable file
2926 // TODO: is there any way to detect that an executable is a kernel
2927 // related executable by inspecting the program headers, section
2928 // headers, symbols, or any other flag bits???
2929 return eStrataUser;
2930
2931 case llvm::ELF::ET_DYN:
2932 // 3 - Shared object file
2933 // TODO: is there any way to detect that an shared library is a kernel
2934 // related executable by inspecting the program headers, section
2935 // headers, symbols, or any other flag bits???
2936 return eStrataUnknown;
2937
2938 case ET_CORE:
2939 // 4 - Core file
2940 // TODO: is there any way to detect that an core file is a kernel
2941 // related executable by inspecting the program headers, section
2942 // headers, symbols, or any other flag bits???
2943 return eStrataUnknown;
2944
2945 default:
2946 break;
2947 }
2948 return eStrataUnknown;
2949}
2950