blob: 7e3ec71eb8174930f22478da434285fe9ef08691 [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"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030
Stephen Wilson499b40e2011-03-30 16:07:05 +000031#include "llvm/ADT/PointerUnion.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000032#include "llvm/ADT/StringRef.h"
Zachary Turner736d4d82014-06-25 05:42:32 +000033#include "llvm/Support/MathExtras.h"
Stephen Wilson499b40e2011-03-30 16:07:05 +000034
Stephen Wilsonf325ba92010-07-13 23:07:23 +000035#define CASE_AND_STREAM(s, def, width) \
36 case def: s->Printf("%-*s", width, #def); break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038using namespace lldb;
39using namespace lldb_private;
Stephen Wilsonf325ba92010-07-13 23:07:23 +000040using namespace elf;
41using namespace llvm::ELF;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042
Stephen Wilson499b40e2011-03-30 16:07:05 +000043namespace {
Todd Fialab91de782014-06-27 16:52:49 +000044
45// ELF note owner definitions
46const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
47const char *const LLDB_NT_OWNER_GNU = "GNU";
48const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
Todd Fialacfee9632014-07-16 15:03:10 +000049const char *const LLDB_NT_OWNER_CSR = "csr";
Tamas Berghammerdb037d92015-03-18 10:36:27 +000050const char *const LLDB_NT_OWNER_ANDROID = "Android";
Todd Fialab91de782014-06-27 16:52:49 +000051
52// ELF note type definitions
53const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
54const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
55
56const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
57const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
58
59const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
60
61const elf_word LLDB_NT_NETBSD_ABI_TAG = 0x01;
62const elf_word LLDB_NT_NETBSD_ABI_SIZE = 4;
63
64// GNU ABI note OS constants
65const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
66const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
67const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
68
Stephen Wilson499b40e2011-03-30 16:07:05 +000069//===----------------------------------------------------------------------===//
70/// @class ELFRelocation
71/// @brief Generic wrapper for ELFRel and ELFRela.
72///
73/// This helper class allows us to parse both ELFRel and ELFRela relocation
74/// entries in a generic manner.
75class ELFRelocation
76{
77public:
78
79 /// Constructs an ELFRelocation entry with a personality as given by @p
80 /// type.
81 ///
82 /// @param type Either DT_REL or DT_RELA. Any other value is invalid.
83 ELFRelocation(unsigned type);
84
85 ~ELFRelocation();
86
87 bool
Greg Claytonc7bece562013-01-25 18:06:21 +000088 Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +000089
90 static unsigned
91 RelocType32(const ELFRelocation &rel);
92
93 static unsigned
94 RelocType64(const ELFRelocation &rel);
95
96 static unsigned
97 RelocSymbol32(const ELFRelocation &rel);
98
99 static unsigned
100 RelocSymbol64(const ELFRelocation &rel);
101
Andrew MacPherson17220c12014-03-05 10:12:43 +0000102 static unsigned
103 RelocOffset32(const ELFRelocation &rel);
104
105 static unsigned
106 RelocOffset64(const ELFRelocation &rel);
107
108 static unsigned
109 RelocAddend32(const ELFRelocation &rel);
110
111 static unsigned
112 RelocAddend64(const ELFRelocation &rel);
113
Stephen Wilson499b40e2011-03-30 16:07:05 +0000114private:
115 typedef llvm::PointerUnion<ELFRel*, ELFRela*> RelocUnion;
116
117 RelocUnion reloc;
118};
119
120ELFRelocation::ELFRelocation(unsigned type)
121{
Andrew MacPherson17220c12014-03-05 10:12:43 +0000122 if (type == DT_REL || type == SHT_REL)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000123 reloc = new ELFRel();
Andrew MacPherson17220c12014-03-05 10:12:43 +0000124 else if (type == DT_RELA || type == SHT_RELA)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000125 reloc = new ELFRela();
126 else {
127 assert(false && "unexpected relocation type");
128 reloc = static_cast<ELFRel*>(NULL);
129 }
130}
131
132ELFRelocation::~ELFRelocation()
133{
134 if (reloc.is<ELFRel*>())
135 delete reloc.get<ELFRel*>();
136 else
137 delete reloc.get<ELFRela*>();
138}
139
140bool
Greg Claytonc7bece562013-01-25 18:06:21 +0000141ELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000142{
143 if (reloc.is<ELFRel*>())
144 return reloc.get<ELFRel*>()->Parse(data, offset);
145 else
146 return reloc.get<ELFRela*>()->Parse(data, offset);
147}
148
149unsigned
150ELFRelocation::RelocType32(const ELFRelocation &rel)
151{
152 if (rel.reloc.is<ELFRel*>())
153 return ELFRel::RelocType32(*rel.reloc.get<ELFRel*>());
154 else
155 return ELFRela::RelocType32(*rel.reloc.get<ELFRela*>());
156}
157
158unsigned
159ELFRelocation::RelocType64(const ELFRelocation &rel)
160{
161 if (rel.reloc.is<ELFRel*>())
162 return ELFRel::RelocType64(*rel.reloc.get<ELFRel*>());
163 else
164 return ELFRela::RelocType64(*rel.reloc.get<ELFRela*>());
165}
166
167unsigned
168ELFRelocation::RelocSymbol32(const ELFRelocation &rel)
169{
170 if (rel.reloc.is<ELFRel*>())
171 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel*>());
172 else
173 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela*>());
174}
175
176unsigned
177ELFRelocation::RelocSymbol64(const ELFRelocation &rel)
178{
179 if (rel.reloc.is<ELFRel*>())
180 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel*>());
181 else
182 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela*>());
183}
184
Andrew MacPherson17220c12014-03-05 10:12:43 +0000185unsigned
186ELFRelocation::RelocOffset32(const ELFRelocation &rel)
187{
188 if (rel.reloc.is<ELFRel*>())
189 return rel.reloc.get<ELFRel*>()->r_offset;
190 else
191 return rel.reloc.get<ELFRela*>()->r_offset;
192}
193
194unsigned
195ELFRelocation::RelocOffset64(const ELFRelocation &rel)
196{
197 if (rel.reloc.is<ELFRel*>())
198 return rel.reloc.get<ELFRel*>()->r_offset;
199 else
200 return rel.reloc.get<ELFRela*>()->r_offset;
201}
202
203unsigned
204ELFRelocation::RelocAddend32(const ELFRelocation &rel)
205{
206 if (rel.reloc.is<ELFRel*>())
207 return 0;
208 else
209 return rel.reloc.get<ELFRela*>()->r_addend;
210}
211
212unsigned
213ELFRelocation::RelocAddend64(const ELFRelocation &rel)
214{
215 if (rel.reloc.is<ELFRel*>())
216 return 0;
217 else
218 return rel.reloc.get<ELFRela*>()->r_addend;
219}
220
Stephen Wilson499b40e2011-03-30 16:07:05 +0000221} // end anonymous namespace
222
Ed Mastec113ff82013-12-02 17:49:13 +0000223bool
224ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset)
225{
226 // Read all fields.
227 if (data.GetU32(offset, &n_namesz, 3) == NULL)
228 return false;
229
230 // The name field is required to be nul-terminated, and n_namesz
231 // includes the terminating nul in observed implementations (contrary
232 // to the ELF-64 spec). A special case is needed for cores generated
233 // by some older Linux versions, which write a note named "CORE"
234 // without a nul terminator and n_namesz = 4.
235 if (n_namesz == 4)
236 {
237 char buf[4];
238 if (data.ExtractBytes (*offset, 4, data.GetByteOrder(), buf) != 4)
239 return false;
240 if (strncmp (buf, "CORE", 4) == 0)
241 {
242 n_name = "CORE";
243 *offset += 4;
244 return true;
245 }
246 }
247
248 const char *cstr = data.GetCStr(offset, llvm::RoundUpToAlignment (n_namesz, 4));
249 if (cstr == NULL)
250 {
251 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS));
252 if (log)
253 log->Printf("Failed to parse note name lacking nul terminator");
254
255 return false;
256 }
257 n_name = cstr;
258 return true;
259}
260
Matthew Gardiner5f675792014-08-27 12:09:39 +0000261static uint32_t
262kalimbaVariantFromElfFlags(const elf::elf_word e_flags)
263{
264 const uint32_t dsp_rev = e_flags & 0xFF;
265 uint32_t kal_arch_variant = LLDB_INVALID_CPUTYPE;
266 switch(dsp_rev)
267 {
268 // TODO(mg11) Support more variants
269 case 10:
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000270 kal_arch_variant = llvm::Triple::KalimbaSubArch_v3;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000271 break;
272 case 14:
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000273 kal_arch_variant = llvm::Triple::KalimbaSubArch_v4;
274 break;
275 case 17:
276 case 20:
277 kal_arch_variant = llvm::Triple::KalimbaSubArch_v5;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000278 break;
279 default:
280 break;
281 }
282 return kal_arch_variant;
283}
284
285static uint32_t
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000286mipsVariantFromElfFlags(const elf::elf_word e_flags, uint32_t endian)
287{
288 const uint32_t mips_arch = e_flags & llvm::ELF::EF_MIPS_ARCH;
289 uint32_t arch_variant = LLDB_INVALID_CPUTYPE;
290
291 switch (mips_arch)
292 {
293 case llvm::ELF::EF_MIPS_ARCH_64:
294 if (endian == ELFDATA2LSB)
295 arch_variant = llvm::Triple::mips64el;
296 else
297 arch_variant = llvm::Triple::mips64;
298 break;
299
300 default:
301 break;
302 }
303
304 return arch_variant;
305}
306
307static uint32_t
Matthew Gardiner5f675792014-08-27 12:09:39 +0000308subTypeFromElfHeader(const elf::ELFHeader& header)
309{
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000310 if (header.e_machine == llvm::ELF::EM_MIPS)
311 return mipsVariantFromElfFlags (header.e_flags,
312 header.e_ident[EI_DATA]);
313
Matthew Gardiner5f675792014-08-27 12:09:39 +0000314 return
315 llvm::ELF::EM_CSR_KALIMBA == header.e_machine ?
316 kalimbaVariantFromElfFlags(header.e_flags) :
317 LLDB_INVALID_CPUTYPE;
318}
319
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000320//! The kalimba toolchain identifies a code section as being
321//! one with the SHT_PROGBITS set in the section sh_type and the top
322//! bit in the 32-bit address field set.
323static lldb::SectionType
324kalimbaSectionType(
325 const elf::ELFHeader& header,
326 const elf::ELFSectionHeader& sect_hdr)
327{
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +0000328 if (llvm::ELF::EM_CSR_KALIMBA != header.e_machine)
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000329 {
330 return eSectionTypeOther;
331 }
332
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +0000333 if (llvm::ELF::SHT_NOBITS == sect_hdr.sh_type)
334 {
335 return eSectionTypeZeroFill;
336 }
337
338 if (llvm::ELF::SHT_PROGBITS == sect_hdr.sh_type)
339 {
340 const lldb::addr_t KAL_CODE_BIT = 1 << 31;
341 return KAL_CODE_BIT & sect_hdr.sh_addr ?
342 eSectionTypeCode : eSectionTypeData;
343 }
344
345 return eSectionTypeOther;
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000346}
347
Todd Fiala4339f3a2014-03-25 19:29:09 +0000348// Arbitrary constant used as UUID prefix for core files.
349const uint32_t
350ObjectFileELF::g_core_uuid_magic(0xE210C);
351
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000352//------------------------------------------------------------------
353// Static methods.
354//------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000355void
356ObjectFileELF::Initialize()
357{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000358 PluginManager::RegisterPlugin(GetPluginNameStatic(),
359 GetPluginDescriptionStatic(),
Greg Claytonc9660542012-02-05 02:38:54 +0000360 CreateInstance,
Greg Claytonf4d6de62013-04-24 22:29:28 +0000361 CreateMemoryInstance,
362 GetModuleSpecifications);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000363}
364
365void
366ObjectFileELF::Terminate()
367{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000368 PluginManager::UnregisterPlugin(CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000369}
370
Greg Clayton57abc5d2013-05-10 21:47:16 +0000371lldb_private::ConstString
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000372ObjectFileELF::GetPluginNameStatic()
373{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000374 static ConstString g_name("elf");
375 return g_name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000376}
377
378const char *
379ObjectFileELF::GetPluginDescriptionStatic()
380{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000381 return "ELF object file reader.";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000382}
383
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000384ObjectFile *
Greg Claytone72dfb32012-02-24 01:59:29 +0000385ObjectFileELF::CreateInstance (const lldb::ModuleSP &module_sp,
386 DataBufferSP &data_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000387 lldb::offset_t data_offset,
388 const lldb_private::FileSpec* file,
389 lldb::offset_t file_offset,
390 lldb::offset_t length)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000391{
Greg Clayton5ce9c562013-02-06 17:22:03 +0000392 if (!data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000393 {
Greg Clayton736888c2015-02-23 23:47:09 +0000394 data_sp = file->MemoryMapFileContentsIfLocal(file_offset, length);
Greg Clayton5ce9c562013-02-06 17:22:03 +0000395 data_offset = 0;
396 }
397
398 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
399 {
400 const uint8_t *magic = data_sp->GetBytes() + data_offset;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000401 if (ELFHeader::MagicBytesMatch(magic))
402 {
Greg Clayton5ce9c562013-02-06 17:22:03 +0000403 // Update the data to contain the entire file if it doesn't already
Andrew Kaylor213f6722013-02-07 21:30:54 +0000404 if (data_sp->GetByteSize() < length) {
Greg Clayton736888c2015-02-23 23:47:09 +0000405 data_sp = file->MemoryMapFileContentsIfLocal(file_offset, length);
Greg Clayton64ff6c72013-02-07 21:49:54 +0000406 data_offset = 0;
407 magic = data_sp->GetBytes();
Andrew Kaylor213f6722013-02-07 21:30:54 +0000408 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000409 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
410 if (address_size == 4 || address_size == 8)
411 {
Greg Clayton7b0992d2013-04-18 22:45:39 +0000412 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 +0000413 ArchSpec spec;
414 if (objfile_ap->GetArchitecture(spec) &&
415 objfile_ap->SetModulesArchitecture(spec))
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000416 return objfile_ap.release();
417 }
418 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000419 }
420 return NULL;
421}
422
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000423
Greg Claytonc9660542012-02-05 02:38:54 +0000424ObjectFile*
Greg Claytone72dfb32012-02-24 01:59:29 +0000425ObjectFileELF::CreateMemoryInstance (const lldb::ModuleSP &module_sp,
426 DataBufferSP& data_sp,
427 const lldb::ProcessSP &process_sp,
428 lldb::addr_t header_addr)
Greg Claytonc9660542012-02-05 02:38:54 +0000429{
Andrew MacPherson17220c12014-03-05 10:12:43 +0000430 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT))
431 {
432 const uint8_t *magic = data_sp->GetBytes();
433 if (ELFHeader::MagicBytesMatch(magic))
434 {
435 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
436 if (address_size == 4 || address_size == 8)
437 {
438 std::auto_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
439 ArchSpec spec;
440 if (objfile_ap->GetArchitecture(spec) &&
441 objfile_ap->SetModulesArchitecture(spec))
442 return objfile_ap.release();
443 }
444 }
445 }
Greg Claytonc9660542012-02-05 02:38:54 +0000446 return NULL;
447}
448
Michael Sartain9f0013d2013-05-17 00:20:21 +0000449bool
450ObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp,
451 lldb::addr_t data_offset,
452 lldb::addr_t data_length)
453{
454 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
455 {
456 const uint8_t *magic = data_sp->GetBytes() + data_offset;
457 return ELFHeader::MagicBytesMatch(magic);
458 }
459 return false;
460}
Greg Claytonc9660542012-02-05 02:38:54 +0000461
Michael Sartain9f4517a2013-07-03 01:52:14 +0000462/*
463 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
464 *
465 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
466 * code or tables extracted from it, as desired without restriction.
467 */
468static uint32_t
Todd Fiala4339f3a2014-03-25 19:29:09 +0000469calc_crc32(uint32_t crc, const void *buf, size_t size)
Michael Sartain9f4517a2013-07-03 01:52:14 +0000470{
471 static const uint32_t g_crc32_tab[] =
472 {
473 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
474 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
475 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
476 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
477 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
478 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
479 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
480 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
481 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
482 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
483 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
484 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
485 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
486 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
487 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
488 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
489 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
490 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
491 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
492 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
493 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
494 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
495 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
496 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
497 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
498 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
499 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
500 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
501 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
502 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
503 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
504 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
505 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
506 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
507 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
508 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
509 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
510 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
511 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
512 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
513 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
514 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
515 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
516 };
517 const uint8_t *p = (const uint8_t *)buf;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000518
Todd Fiala4339f3a2014-03-25 19:29:09 +0000519 crc = crc ^ ~0U;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000520 while (size--)
521 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
522 return crc ^ ~0U;
523}
524
Todd Fiala4339f3a2014-03-25 19:29:09 +0000525static uint32_t
526calc_gnu_debuglink_crc32(const void *buf, size_t size)
527{
528 return calc_crc32(0U, buf, size);
529}
530
531uint32_t
532ObjectFileELF::CalculateELFNotesSegmentsCRC32 (const ProgramHeaderColl& program_headers,
533 DataExtractor& object_data)
534{
535 typedef ProgramHeaderCollConstIter Iter;
536
537 uint32_t core_notes_crc = 0;
538
539 for (Iter I = program_headers.begin(); I != program_headers.end(); ++I)
540 {
541 if (I->p_type == llvm::ELF::PT_NOTE)
542 {
543 const elf_off ph_offset = I->p_offset;
544 const size_t ph_size = I->p_filesz;
545
546 DataExtractor segment_data;
547 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size)
548 {
549 // The ELF program header contained incorrect data,
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000550 // probably corefile is incomplete or corrupted.
Todd Fiala4339f3a2014-03-25 19:29:09 +0000551 break;
552 }
553
554 core_notes_crc = calc_crc32(core_notes_crc,
555 segment_data.GetDataStart(),
556 segment_data.GetByteSize());
557 }
558 }
559
560 return core_notes_crc;
561}
562
Todd Fialab91de782014-06-27 16:52:49 +0000563static const char*
564OSABIAsCString (unsigned char osabi_byte)
565{
566#define _MAKE_OSABI_CASE(x) case x: return #x
567 switch (osabi_byte)
568 {
569 _MAKE_OSABI_CASE(ELFOSABI_NONE);
570 _MAKE_OSABI_CASE(ELFOSABI_HPUX);
571 _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
572 _MAKE_OSABI_CASE(ELFOSABI_GNU);
573 _MAKE_OSABI_CASE(ELFOSABI_HURD);
574 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
575 _MAKE_OSABI_CASE(ELFOSABI_AIX);
576 _MAKE_OSABI_CASE(ELFOSABI_IRIX);
577 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
578 _MAKE_OSABI_CASE(ELFOSABI_TRU64);
579 _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
580 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
581 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
582 _MAKE_OSABI_CASE(ELFOSABI_NSK);
583 _MAKE_OSABI_CASE(ELFOSABI_AROS);
584 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
585 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
586 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
587 _MAKE_OSABI_CASE(ELFOSABI_ARM);
588 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
589 default:
590 return "<unknown-osabi>";
591 }
592#undef _MAKE_OSABI_CASE
593}
594
595static bool
596GetOsFromOSABI (unsigned char osabi_byte, llvm::Triple::OSType &ostype)
597{
598 switch (osabi_byte)
599 {
600 case ELFOSABI_AIX: ostype = llvm::Triple::OSType::AIX; break;
601 case ELFOSABI_FREEBSD: ostype = llvm::Triple::OSType::FreeBSD; break;
602 case ELFOSABI_GNU: ostype = llvm::Triple::OSType::Linux; break;
603 case ELFOSABI_NETBSD: ostype = llvm::Triple::OSType::NetBSD; break;
604 case ELFOSABI_OPENBSD: ostype = llvm::Triple::OSType::OpenBSD; break;
605 case ELFOSABI_SOLARIS: ostype = llvm::Triple::OSType::Solaris; break;
606 default:
607 ostype = llvm::Triple::OSType::UnknownOS;
608 }
609 return ostype != llvm::Triple::OSType::UnknownOS;
610}
611
Greg Claytonf4d6de62013-04-24 22:29:28 +0000612size_t
613ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec& file,
614 lldb::DataBufferSP& data_sp,
615 lldb::offset_t data_offset,
616 lldb::offset_t file_offset,
617 lldb::offset_t length,
618 lldb_private::ModuleSpecList &specs)
619{
Todd Fialab91de782014-06-27 16:52:49 +0000620 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
621
Michael Sartain9f0013d2013-05-17 00:20:21 +0000622 const size_t initial_count = specs.GetSize();
Michael Sartainc836ae72013-05-23 20:57:03 +0000623
Michael Sartain9f0013d2013-05-17 00:20:21 +0000624 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize()))
625 {
626 DataExtractor data;
627 data.SetData(data_sp);
628 elf::ELFHeader header;
629 if (header.Parse(data, &data_offset))
630 {
631 if (data_sp)
632 {
Oleksiy Vyalov63acdfd2015-03-10 01:15:28 +0000633 ModuleSpec spec (file);
Matthew Gardiner5f675792014-08-27 12:09:39 +0000634
635 const uint32_t sub_type = subTypeFromElfHeader(header);
Michael Sartain9f0013d2013-05-17 00:20:21 +0000636 spec.GetArchitecture().SetArchitecture(eArchTypeELF,
637 header.e_machine,
Matthew Gardiner5f675792014-08-27 12:09:39 +0000638 sub_type);
639
Michael Sartain9f0013d2013-05-17 00:20:21 +0000640 if (spec.GetArchitecture().IsValid())
641 {
Todd Fialab91de782014-06-27 16:52:49 +0000642 llvm::Triple::OSType ostype;
643 // First try to determine the OS type from the OSABI field in the elf header.
644
645 if (log)
646 log->Printf ("ObjectFileELF::%s file '%s' module OSABI: %s", __FUNCTION__, file.GetPath ().c_str (), OSABIAsCString (header.e_ident[EI_OSABI]));
647 if (GetOsFromOSABI (header.e_ident[EI_OSABI], ostype) && ostype != llvm::Triple::OSType::UnknownOS)
648 {
649 spec.GetArchitecture ().GetTriple ().setOS (ostype);
650
651 // Also clear the vendor so we don't end up with situations like
652 // x86_64-apple-FreeBSD.
653 spec.GetArchitecture ().GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
654
655 if (log)
656 log->Printf ("ObjectFileELF::%s file '%s' set ELF module OS type from ELF header OSABI.", __FUNCTION__, file.GetPath ().c_str ());
657 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000658
659 // Try to get the UUID from the section list. Usually that's at the end, so
660 // map the file in if we don't have it already.
661 size_t section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize;
662 if (section_header_end > data_sp->GetByteSize())
663 {
Greg Clayton736888c2015-02-23 23:47:09 +0000664 data_sp = file.MemoryMapFileContentsIfLocal (file_offset, section_header_end);
Michael Sartaina7499c92013-07-01 19:45:50 +0000665 data.SetData(data_sp);
666 }
667
Michael Sartain9f4517a2013-07-03 01:52:14 +0000668 uint32_t gnu_debuglink_crc = 0;
Michael Sartaina7499c92013-07-01 19:45:50 +0000669 std::string gnu_debuglink_file;
670 SectionHeaderColl section_headers;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000671 lldb_private::UUID &uuid = spec.GetUUID();
Michael Sartain9f4517a2013-07-03 01:52:14 +0000672
Todd Fialab91de782014-06-27 16:52:49 +0000673 GetSectionHeaderInfo(section_headers, data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc, spec.GetArchitecture ());
674
Todd Fialab91de782014-06-27 16:52:49 +0000675 llvm::Triple &spec_triple = spec.GetArchitecture ().GetTriple ();
Todd Fialab91de782014-06-27 16:52:49 +0000676
677 if (log)
678 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 +0000679
Michael Sartain9f4517a2013-07-03 01:52:14 +0000680 if (!uuid.IsValid())
681 {
Todd Fiala4339f3a2014-03-25 19:29:09 +0000682 uint32_t core_notes_crc = 0;
683
Michael Sartain9f4517a2013-07-03 01:52:14 +0000684 if (!gnu_debuglink_crc)
685 {
Todd Fiala4339f3a2014-03-25 19:29:09 +0000686 lldb_private::Timer scoped_timer (__PRETTY_FUNCTION__,
687 "Calculating module crc32 %s with size %" PRIu64 " KiB",
688 file.GetLastPathComponent().AsCString(),
689 (file.GetByteSize()-file_offset)/1024);
690
691 // For core files - which usually don't happen to have a gnu_debuglink,
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000692 // and are pretty bulky - calculating whole contents crc32 would be too much of luxury.
Todd Fiala4339f3a2014-03-25 19:29:09 +0000693 // Thus we will need to fallback to something simpler.
694 if (header.e_type == llvm::ELF::ET_CORE)
695 {
696 size_t program_headers_end = header.e_phoff + header.e_phnum * header.e_phentsize;
697 if (program_headers_end > data_sp->GetByteSize())
698 {
Greg Clayton736888c2015-02-23 23:47:09 +0000699 data_sp = file.MemoryMapFileContentsIfLocal(file_offset, program_headers_end);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000700 data.SetData(data_sp);
701 }
702 ProgramHeaderColl program_headers;
703 GetProgramHeaderInfo(program_headers, data, header);
704
705 size_t segment_data_end = 0;
706 for (ProgramHeaderCollConstIter I = program_headers.begin();
707 I != program_headers.end(); ++I)
708 {
Enrico Granataafcbdb12014-03-25 20:53:33 +0000709 segment_data_end = std::max<unsigned long long> (I->p_offset + I->p_filesz, segment_data_end);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000710 }
711
712 if (segment_data_end > data_sp->GetByteSize())
713 {
Greg Clayton736888c2015-02-23 23:47:09 +0000714 data_sp = file.MemoryMapFileContentsIfLocal(file_offset, segment_data_end);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000715 data.SetData(data_sp);
716 }
717
718 core_notes_crc = CalculateELFNotesSegmentsCRC32 (program_headers, data);
719 }
720 else
721 {
722 // Need to map entire file into memory to calculate the crc.
Greg Clayton736888c2015-02-23 23:47:09 +0000723 data_sp = file.MemoryMapFileContentsIfLocal (file_offset, SIZE_MAX);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000724 data.SetData(data_sp);
725 gnu_debuglink_crc = calc_gnu_debuglink_crc32 (data.GetDataStart(), data.GetByteSize());
726 }
Michael Sartain9f4517a2013-07-03 01:52:14 +0000727 }
728 if (gnu_debuglink_crc)
729 {
730 // Use 4 bytes of crc from the .gnu_debuglink section.
731 uint32_t uuidt[4] = { gnu_debuglink_crc, 0, 0, 0 };
732 uuid.SetBytes (uuidt, sizeof(uuidt));
733 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000734 else if (core_notes_crc)
735 {
736 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it look different form
737 // .gnu_debuglink crc followed by 4 bytes of note segments crc.
738 uint32_t uuidt[4] = { g_core_uuid_magic, core_notes_crc, 0, 0 };
739 uuid.SetBytes (uuidt, sizeof(uuidt));
740 }
Michael Sartain9f4517a2013-07-03 01:52:14 +0000741 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000742
Michael Sartain9f0013d2013-05-17 00:20:21 +0000743 specs.Append(spec);
744 }
745 }
746 }
747 }
Michael Sartainc836ae72013-05-23 20:57:03 +0000748
Michael Sartain9f0013d2013-05-17 00:20:21 +0000749 return specs.GetSize() - initial_count;
Greg Claytonf4d6de62013-04-24 22:29:28 +0000750}
751
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000752//------------------------------------------------------------------
753// PluginInterface protocol
754//------------------------------------------------------------------
Greg Clayton57abc5d2013-05-10 21:47:16 +0000755lldb_private::ConstString
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000756ObjectFileELF::GetPluginName()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000757{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000758 return GetPluginNameStatic();
759}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000760
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000761uint32_t
762ObjectFileELF::GetPluginVersion()
763{
764 return m_plugin_version;
765}
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000766//------------------------------------------------------------------
767// ObjectFile protocol
768//------------------------------------------------------------------
769
Greg Claytone72dfb32012-02-24 01:59:29 +0000770ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000771 DataBufferSP& data_sp,
772 lldb::offset_t data_offset,
Greg Claytone72dfb32012-02-24 01:59:29 +0000773 const FileSpec* file,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000774 lldb::offset_t file_offset,
775 lldb::offset_t length) :
776 ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
Greg Claytone72dfb32012-02-24 01:59:29 +0000777 m_header(),
Todd Fialab91de782014-06-27 16:52:49 +0000778 m_uuid(),
779 m_gnu_debuglink_file(),
780 m_gnu_debuglink_crc(0),
Greg Claytone72dfb32012-02-24 01:59:29 +0000781 m_program_headers(),
782 m_section_headers(),
Todd Fialab91de782014-06-27 16:52:49 +0000783 m_dynamic_symbols(),
784 m_filespec_ap(),
785 m_entry_point_address(),
786 m_arch_spec()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000787{
788 if (file)
789 m_file = *file;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000790 ::memset(&m_header, 0, sizeof(m_header));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000791}
792
Andrew MacPherson17220c12014-03-05 10:12:43 +0000793ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
794 DataBufferSP& data_sp,
795 const lldb::ProcessSP &process_sp,
796 addr_t header_addr) :
797 ObjectFile(module_sp, process_sp, LLDB_INVALID_ADDRESS, data_sp),
798 m_header(),
Todd Fialab91de782014-06-27 16:52:49 +0000799 m_uuid(),
800 m_gnu_debuglink_file(),
801 m_gnu_debuglink_crc(0),
Andrew MacPherson17220c12014-03-05 10:12:43 +0000802 m_program_headers(),
803 m_section_headers(),
Todd Fialab91de782014-06-27 16:52:49 +0000804 m_dynamic_symbols(),
805 m_filespec_ap(),
806 m_entry_point_address(),
807 m_arch_spec()
Andrew MacPherson17220c12014-03-05 10:12:43 +0000808{
809 ::memset(&m_header, 0, sizeof(m_header));
810}
811
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000812ObjectFileELF::~ObjectFileELF()
813{
814}
815
Jim Ingham5aee1622010-08-09 23:31:02 +0000816bool
817ObjectFileELF::IsExecutable() const
818{
Deepak Panickal71f5b502014-07-22 12:01:43 +0000819 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
Jim Ingham5aee1622010-08-09 23:31:02 +0000820}
821
Steve Pucci9e02dac2014-02-06 19:02:19 +0000822bool
Greg Clayton751caf62014-02-07 22:54:47 +0000823ObjectFileELF::SetLoadAddress (Target &target,
824 lldb::addr_t value,
825 bool value_is_offset)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000826{
Steve Pucci9e02dac2014-02-06 19:02:19 +0000827 ModuleSP module_sp = GetModule();
828 if (module_sp)
829 {
830 size_t num_loaded_sections = 0;
831 SectionList *section_list = GetSectionList ();
832 if (section_list)
833 {
Greg Clayton751caf62014-02-07 22:54:47 +0000834 if (value_is_offset)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000835 {
Greg Clayton751caf62014-02-07 22:54:47 +0000836 const size_t num_sections = section_list->GetSize();
837 size_t sect_idx = 0;
Sylvestre Ledruf561a012014-02-21 18:08:09 +0000838
Greg Clayton751caf62014-02-07 22:54:47 +0000839 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000840 {
Greg Clayton751caf62014-02-07 22:54:47 +0000841 // Iterate through the object file sections to find all
842 // of the sections that have SHF_ALLOC in their flag bits.
843 SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
844 // if (section_sp && !section_sp->IsThreadSpecific())
845 if (section_sp && section_sp->Test(SHF_ALLOC))
846 {
847 if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + value))
848 ++num_loaded_sections;
849 }
Steve Pucci9e02dac2014-02-06 19:02:19 +0000850 }
Greg Clayton751caf62014-02-07 22:54:47 +0000851 return num_loaded_sections > 0;
852 }
853 else
854 {
855 // Not sure how to slide an ELF file given the base address
856 // of the ELF file in memory
Steve Pucci9e02dac2014-02-06 19:02:19 +0000857 }
858 }
Steve Pucci9e02dac2014-02-06 19:02:19 +0000859 }
Sylvestre Ledruf561a012014-02-21 18:08:09 +0000860 return false; // If it changed
Steve Pucci9e02dac2014-02-06 19:02:19 +0000861}
862
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000863ByteOrder
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000864ObjectFileELF::GetByteOrder() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000865{
866 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
867 return eByteOrderBig;
868 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
869 return eByteOrderLittle;
870 return eByteOrderInvalid;
871}
872
Greg Claytonc7bece562013-01-25 18:06:21 +0000873uint32_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000874ObjectFileELF::GetAddressByteSize() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000875{
876 return m_data.GetAddressByteSize();
877}
878
Todd Fialafbd703a2014-09-15 22:33:39 +0000879// Top 16 bits of the `Symbol` flags are available.
880#define ARM_ELF_SYM_IS_THUMB (1 << 16)
881
882AddressClass
883ObjectFileELF::GetAddressClass (addr_t file_addr)
884{
885 auto res = ObjectFile::GetAddressClass (file_addr);
886
887 if (res != eAddressClassCode)
888 return res;
889
Tamas Berghammer83544cf2015-04-07 10:43:50 +0000890 auto ub = m_address_class_map.upper_bound(file_addr);
891 if (ub == m_address_class_map.begin())
892 {
893 // No entry in the address class map before the address. Return
894 // default address class for an address in a code section.
895 return eAddressClassCode;
896 }
Todd Fialafbd703a2014-09-15 22:33:39 +0000897
Tamas Berghammer83544cf2015-04-07 10:43:50 +0000898 // Move iterator to the address class entry preceding address
899 --ub;
Todd Fialafbd703a2014-09-15 22:33:39 +0000900
Tamas Berghammer83544cf2015-04-07 10:43:50 +0000901 return ub->second;
Todd Fialafbd703a2014-09-15 22:33:39 +0000902}
903
Greg Claytonc7bece562013-01-25 18:06:21 +0000904size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000905ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000906{
Greg Claytonc7bece562013-01-25 18:06:21 +0000907 return std::distance(m_section_headers.begin(), I) + 1u;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000908}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000909
Greg Claytonc7bece562013-01-25 18:06:21 +0000910size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000911ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const
912{
Greg Claytonc7bece562013-01-25 18:06:21 +0000913 return std::distance(m_section_headers.begin(), I) + 1u;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000914}
915
916bool
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000917ObjectFileELF::ParseHeader()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000918{
Filipe Cabecinhas22b40f72013-05-16 23:29:36 +0000919 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000920 return m_header.Parse(m_data, &offset);
921}
922
923bool
Greg Clayton60830262011-02-04 18:53:10 +0000924ObjectFileELF::GetUUID(lldb_private::UUID* uuid)
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000925{
Michael Sartaina7499c92013-07-01 19:45:50 +0000926 // Need to parse the section list to get the UUIDs, so make sure that's been done.
Todd Fiala4339f3a2014-03-25 19:29:09 +0000927 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
Michael Sartaina7499c92013-07-01 19:45:50 +0000928 return false;
929
Michael Sartainc836ae72013-05-23 20:57:03 +0000930 if (m_uuid.IsValid())
931 {
Michael Sartaina7499c92013-07-01 19:45:50 +0000932 // We have the full build id uuid.
Michael Sartainc836ae72013-05-23 20:57:03 +0000933 *uuid = m_uuid;
934 return true;
935 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000936 else if (GetType() == ObjectFile::eTypeCoreFile)
937 {
938 uint32_t core_notes_crc = 0;
939
940 if (!ParseProgramHeaders())
941 return false;
942
943 core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
944
945 if (core_notes_crc)
946 {
947 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
948 // look different form .gnu_debuglink crc - followed by 4 bytes of note
949 // segments crc.
950 uint32_t uuidt[4] = { g_core_uuid_magic, core_notes_crc, 0, 0 };
951 m_uuid.SetBytes (uuidt, sizeof(uuidt));
952 }
953 }
954 else
Michael Sartaina7499c92013-07-01 19:45:50 +0000955 {
Michael Sartain9f4517a2013-07-03 01:52:14 +0000956 if (!m_gnu_debuglink_crc)
957 m_gnu_debuglink_crc = calc_gnu_debuglink_crc32 (m_data.GetDataStart(), m_data.GetByteSize());
Michael Sartaina7499c92013-07-01 19:45:50 +0000958 if (m_gnu_debuglink_crc)
959 {
960 // Use 4 bytes of crc from the .gnu_debuglink section.
961 uint32_t uuidt[4] = { m_gnu_debuglink_crc, 0, 0, 0 };
Todd Fiala4339f3a2014-03-25 19:29:09 +0000962 m_uuid.SetBytes (uuidt, sizeof(uuidt));
Michael Sartaina7499c92013-07-01 19:45:50 +0000963 }
964 }
965
Todd Fiala4339f3a2014-03-25 19:29:09 +0000966 if (m_uuid.IsValid())
967 {
968 *uuid = m_uuid;
969 return true;
970 }
971
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000972 return false;
973}
974
Michael Sartaina7499c92013-07-01 19:45:50 +0000975lldb_private::FileSpecList
976ObjectFileELF::GetDebugSymbolFilePaths()
977{
978 FileSpecList file_spec_list;
979
980 if (!m_gnu_debuglink_file.empty())
981 {
982 FileSpec file_spec (m_gnu_debuglink_file.c_str(), false);
983 file_spec_list.Append (file_spec);
984 }
985 return file_spec_list;
986}
987
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000988uint32_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000989ObjectFileELF::GetDependentModules(FileSpecList &files)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000990{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000991 size_t num_modules = ParseDependentModules();
992 uint32_t num_specs = 0;
993
994 for (unsigned i = 0; i < num_modules; ++i)
995 {
996 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i)))
997 num_specs++;
998 }
999
1000 return num_specs;
1001}
1002
Stephen Wilson499b40e2011-03-30 16:07:05 +00001003Address
Ed Maste54803652013-10-11 17:39:07 +00001004ObjectFileELF::GetImageInfoAddress(Target *target)
Stephen Wilson499b40e2011-03-30 16:07:05 +00001005{
1006 if (!ParseDynamicSymbols())
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001007 return Address();
1008
1009 SectionList *section_list = GetSectionList();
1010 if (!section_list)
1011 return Address();
1012
Greg Clayton3046e662013-07-10 01:23:25 +00001013 // Find the SHT_DYNAMIC (.dynamic) section.
1014 SectionSP dynsym_section_sp (section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true));
1015 if (!dynsym_section_sp)
Stephen Wilson499b40e2011-03-30 16:07:05 +00001016 return Address();
Greg Clayton3046e662013-07-10 01:23:25 +00001017 assert (dynsym_section_sp->GetObjectFile() == this);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001018
Greg Clayton3046e662013-07-10 01:23:25 +00001019 user_id_t dynsym_id = dynsym_section_sp->GetID();
Michael Sartaina7499c92013-07-01 19:45:50 +00001020 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001021 if (!dynsym_hdr)
1022 return Address();
1023
Greg Clayton3046e662013-07-10 01:23:25 +00001024 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i)
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001025 {
Greg Clayton3046e662013-07-10 01:23:25 +00001026 ELFDynamic &symbol = m_dynamic_symbols[i];
Greg Claytone72dfb32012-02-24 01:59:29 +00001027
Ed Maste54803652013-10-11 17:39:07 +00001028 if (symbol.d_tag == DT_DEBUG)
Greg Clayton3046e662013-07-10 01:23:25 +00001029 {
1030 // Compute the offset as the number of previous entries plus the
1031 // size of d_tag.
1032 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
1033 return Address(dynsym_section_sp, offset);
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001034 }
Ed Maste54803652013-10-11 17:39:07 +00001035 else if (symbol.d_tag == DT_MIPS_RLD_MAP && target)
1036 {
1037 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
1038 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
1039 if (dyn_base == LLDB_INVALID_ADDRESS)
1040 return Address();
1041 Address addr;
1042 Error error;
1043 if (target->ReadPointerFromMemory(dyn_base + offset, false, error, addr))
1044 return addr;
1045 }
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001046 }
1047
1048 return Address();
1049}
1050
Jim Ingham672e6f52011-03-07 23:44:08 +00001051lldb_private::Address
1052ObjectFileELF::GetEntryPointAddress ()
1053{
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001054 if (m_entry_point_address.IsValid())
1055 return m_entry_point_address;
1056
1057 if (!ParseHeader() || !IsExecutable())
1058 return m_entry_point_address;
1059
Greg Clayton3046e662013-07-10 01:23:25 +00001060 SectionList *section_list = GetSectionList();
1061 addr_t offset = m_header.e_entry;
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001062
Greg Clayton3046e662013-07-10 01:23:25 +00001063 if (!section_list)
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001064 m_entry_point_address.SetOffset(offset);
Greg Clayton3046e662013-07-10 01:23:25 +00001065 else
1066 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001067 return m_entry_point_address;
Jim Ingham672e6f52011-03-07 23:44:08 +00001068}
1069
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001070//----------------------------------------------------------------------
1071// ParseDependentModules
1072//----------------------------------------------------------------------
1073size_t
1074ObjectFileELF::ParseDependentModules()
1075{
1076 if (m_filespec_ap.get())
1077 return m_filespec_ap->GetSize();
1078
1079 m_filespec_ap.reset(new FileSpecList());
1080
Michael Sartaina7499c92013-07-01 19:45:50 +00001081 if (!ParseSectionHeaders())
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001082 return 0;
1083
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001084 SectionList *section_list = GetSectionList();
1085 if (!section_list)
1086 return 0;
1087
Greg Clayton3046e662013-07-10 01:23:25 +00001088 // Find the SHT_DYNAMIC section.
1089 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
1090 if (!dynsym)
1091 return 0;
1092 assert (dynsym->GetObjectFile() == this);
1093
1094 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex (dynsym->GetID());
1095 if (!header)
1096 return 0;
1097 // sh_link: section header index of string table used by entries in the section.
1098 Section *dynstr = section_list->FindSectionByID (header->sh_link + 1).get();
1099 if (!dynstr)
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001100 return 0;
1101
1102 DataExtractor dynsym_data;
1103 DataExtractor dynstr_data;
Greg Claytonc9660542012-02-05 02:38:54 +00001104 if (ReadSectionData(dynsym, dynsym_data) &&
1105 ReadSectionData(dynstr, dynstr_data))
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001106 {
1107 ELFDynamic symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +00001108 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1109 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001110
1111 // The only type of entries we are concerned with are tagged DT_NEEDED,
1112 // yielding the name of a required library.
1113 while (offset < section_size)
1114 {
1115 if (!symbol.Parse(dynsym_data, &offset))
1116 break;
1117
1118 if (symbol.d_tag != DT_NEEDED)
1119 continue;
1120
1121 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1122 const char *lib_name = dynstr_data.PeekCStr(str_index);
Greg Clayton274060b2010-10-20 20:54:39 +00001123 m_filespec_ap->Append(FileSpec(lib_name, true));
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001124 }
1125 }
1126
1127 return m_filespec_ap->GetSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001128}
1129
1130//----------------------------------------------------------------------
Todd Fiala4339f3a2014-03-25 19:29:09 +00001131// GetProgramHeaderInfo
1132//----------------------------------------------------------------------
1133size_t
1134ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
1135 DataExtractor &object_data,
1136 const ELFHeader &header)
1137{
1138 // We have already parsed the program headers
1139 if (!program_headers.empty())
1140 return program_headers.size();
1141
1142 // If there are no program headers to read we are done.
1143 if (header.e_phnum == 0)
1144 return 0;
1145
1146 program_headers.resize(header.e_phnum);
1147 if (program_headers.size() != header.e_phnum)
1148 return 0;
1149
1150 const size_t ph_size = header.e_phnum * header.e_phentsize;
1151 const elf_off ph_offset = header.e_phoff;
1152 DataExtractor data;
1153 if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
1154 return 0;
1155
1156 uint32_t idx;
1157 lldb::offset_t offset;
1158 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx)
1159 {
1160 if (program_headers[idx].Parse(data, &offset) == false)
1161 break;
1162 }
1163
1164 if (idx < program_headers.size())
1165 program_headers.resize(idx);
1166
1167 return program_headers.size();
1168
1169}
1170
1171//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001172// ParseProgramHeaders
1173//----------------------------------------------------------------------
1174size_t
1175ObjectFileELF::ParseProgramHeaders()
1176{
Todd Fiala4339f3a2014-03-25 19:29:09 +00001177 return GetProgramHeaderInfo(m_program_headers, m_data, m_header);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001178}
1179
Todd Fialab91de782014-06-27 16:52:49 +00001180lldb_private::Error
1181ObjectFileELF::RefineModuleDetailsFromNote (lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch_spec, lldb_private::UUID &uuid)
Michael Sartainc836ae72013-05-23 20:57:03 +00001182{
Todd Fialab91de782014-06-27 16:52:49 +00001183 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1184 Error error;
1185
Michael Sartainc836ae72013-05-23 20:57:03 +00001186 lldb::offset_t offset = 0;
Michael Sartainc836ae72013-05-23 20:57:03 +00001187
1188 while (true)
1189 {
Todd Fialab91de782014-06-27 16:52:49 +00001190 // Parse the note header. If this fails, bail out.
Ed Mastec113ff82013-12-02 17:49:13 +00001191 ELFNote note = ELFNote();
1192 if (!note.Parse(data, &offset))
Michael Sartainc836ae72013-05-23 20:57:03 +00001193 {
Todd Fialab91de782014-06-27 16:52:49 +00001194 // We're done.
1195 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001196 }
Todd Fialab91de782014-06-27 16:52:49 +00001197
1198 // If a tag processor handles the tag, it should set processed to true, and
1199 // the loop will assume the tag processing has moved entirely past the note's payload.
1200 // Otherwise, leave it false and the end of the loop will handle the offset properly.
1201 bool processed = false;
1202
1203 if (log)
1204 log->Printf ("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32, __FUNCTION__, note.n_name.c_str (), note.n_type);
1205
1206 // Process FreeBSD ELF notes.
1207 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1208 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1209 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE))
1210 {
1211 // We'll consume the payload below.
1212 processed = true;
1213
1214 // Pull out the min version info.
1215 uint32_t version_info;
1216 if (data.GetU32 (&offset, &version_info, 1) == nullptr)
1217 {
1218 error.SetErrorString ("failed to read FreeBSD ABI note payload");
1219 return error;
1220 }
1221
1222 // Convert the version info into a major/minor number.
1223 const uint32_t version_major = version_info / 100000;
1224 const uint32_t version_minor = (version_info / 1000) % 100;
1225
1226 char os_name[32];
1227 snprintf (os_name, sizeof (os_name), "freebsd%" PRIu32 ".%" PRIu32, version_major, version_minor);
1228
1229 // Set the elf OS version to FreeBSD. Also clear the vendor.
1230 arch_spec.GetTriple ().setOSName (os_name);
1231 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1232
1233 if (log)
1234 log->Printf ("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_major, version_minor, static_cast<uint32_t> (version_info % 1000));
1235 }
1236 // Process GNU ELF notes.
1237 else if (note.n_name == LLDB_NT_OWNER_GNU)
1238 {
1239 switch (note.n_type)
1240 {
1241 case LLDB_NT_GNU_ABI_TAG:
1242 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE)
1243 {
1244 // We'll consume the payload below.
1245 processed = true;
1246
1247 // Pull out the min OS version supporting the ABI.
1248 uint32_t version_info[4];
1249 if (data.GetU32 (&offset, &version_info[0], note.n_descsz / 4) == nullptr)
1250 {
1251 error.SetErrorString ("failed to read GNU ABI note payload");
1252 return error;
1253 }
1254
1255 // Set the OS per the OS field.
1256 switch (version_info[0])
1257 {
1258 case LLDB_NT_GNU_ABI_OS_LINUX:
1259 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::Linux);
1260 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1261 if (log)
1262 log->Printf ("ObjectFileELF::%s detected Linux, min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1263 // 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.
1264 break;
1265 case LLDB_NT_GNU_ABI_OS_HURD:
1266 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::UnknownOS);
1267 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1268 if (log)
1269 log->Printf ("ObjectFileELF::%s detected Hurd (unsupported), min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1270 break;
1271 case LLDB_NT_GNU_ABI_OS_SOLARIS:
1272 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::Solaris);
1273 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1274 if (log)
1275 log->Printf ("ObjectFileELF::%s detected Solaris, min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1276 break;
1277 default:
1278 if (log)
1279 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]);
1280 break;
1281 }
1282 }
1283 break;
1284
1285 case LLDB_NT_GNU_BUILD_ID_TAG:
1286 // Only bother processing this if we don't already have the uuid set.
1287 if (!uuid.IsValid())
1288 {
1289 // We'll consume the payload below.
1290 processed = true;
1291
1292 // 16 bytes is UUID|MD5, 20 bytes is SHA1
1293 if ((note.n_descsz == 16 || note.n_descsz == 20))
1294 {
1295 uint8_t uuidbuf[20];
1296 if (data.GetU8 (&offset, &uuidbuf, note.n_descsz) == nullptr)
1297 {
1298 error.SetErrorString ("failed to read GNU_BUILD_ID note payload");
1299 return error;
1300 }
1301
1302 // Save the build id as the UUID for the module.
1303 uuid.SetBytes (uuidbuf, note.n_descsz);
1304 }
1305 }
1306 break;
1307 }
1308 }
1309 // Process NetBSD ELF notes.
1310 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
1311 (note.n_type == LLDB_NT_NETBSD_ABI_TAG) &&
1312 (note.n_descsz == LLDB_NT_NETBSD_ABI_SIZE))
1313 {
1314
1315 // We'll consume the payload below.
1316 processed = true;
1317
1318 // Pull out the min version info.
1319 uint32_t version_info;
1320 if (data.GetU32 (&offset, &version_info, 1) == nullptr)
1321 {
1322 error.SetErrorString ("failed to read NetBSD ABI note payload");
1323 return error;
1324 }
1325
1326 // Set the elf OS version to NetBSD. Also clear the vendor.
1327 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::NetBSD);
1328 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1329
1330 if (log)
1331 log->Printf ("ObjectFileELF::%s detected NetBSD, min version constant %" PRIu32, __FUNCTION__, version_info);
1332 }
Todd Fialacfee9632014-07-16 15:03:10 +00001333 // Process CSR kalimba notes
1334 else if ((note.n_type == LLDB_NT_GNU_ABI_TAG) &&
1335 (note.n_name == LLDB_NT_OWNER_CSR))
1336 {
1337 // We'll consume the payload below.
1338 processed = true;
1339 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1340 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::CSR);
1341
1342 // TODO At some point the description string could be processed.
1343 // It could provide a steer towards the kalimba variant which
1344 // this ELF targets.
1345 if(note.n_descsz)
1346 {
1347 const char *cstr = data.GetCStr(&offset, llvm::RoundUpToAlignment (note.n_descsz, 4));
1348 (void)cstr;
1349 }
1350 }
Tamas Berghammerdb037d92015-03-18 10:36:27 +00001351 else if (note.n_name == LLDB_NT_OWNER_ANDROID)
1352 {
1353 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1354 arch_spec.GetTriple().setEnvironment(llvm::Triple::EnvironmentType::Android);
1355 }
Todd Fialab91de782014-06-27 16:52:49 +00001356
1357 if (!processed)
1358 offset += llvm::RoundUpToAlignment(note.n_descsz, 4);
Michael Sartainc836ae72013-05-23 20:57:03 +00001359 }
Todd Fialab91de782014-06-27 16:52:49 +00001360
1361 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001362}
Michael Sartaina7499c92013-07-01 19:45:50 +00001363
Todd Fialab91de782014-06-27 16:52:49 +00001364
Michael Sartaina7499c92013-07-01 19:45:50 +00001365//----------------------------------------------------------------------
1366// GetSectionHeaderInfo
1367//----------------------------------------------------------------------
1368size_t
1369ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
1370 lldb_private::DataExtractor &object_data,
1371 const elf::ELFHeader &header,
1372 lldb_private::UUID &uuid,
1373 std::string &gnu_debuglink_file,
Todd Fialab91de782014-06-27 16:52:49 +00001374 uint32_t &gnu_debuglink_crc,
1375 ArchSpec &arch_spec)
Michael Sartaina7499c92013-07-01 19:45:50 +00001376{
Todd Fiala6477ea82014-07-11 15:13:33 +00001377 // Don't reparse the section headers if we already did that.
1378 if (!section_headers.empty())
1379 return section_headers.size();
1380
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001381 // Only initialize the arch_spec to okay defaults if they're not already set.
Todd Fialab91de782014-06-27 16:52:49 +00001382 // We'll refine this with note data as we parse the notes.
1383 if (arch_spec.GetTriple ().getOS () == llvm::Triple::OSType::UnknownOS)
1384 {
Matthew Gardiner5f675792014-08-27 12:09:39 +00001385 const uint32_t sub_type = subTypeFromElfHeader(header);
1386 arch_spec.SetArchitecture (eArchTypeELF, header.e_machine, sub_type);
Todd Fialab91de782014-06-27 16:52:49 +00001387 }
1388
Michael Sartaina7499c92013-07-01 19:45:50 +00001389 // If there are no section headers we are done.
1390 if (header.e_shnum == 0)
1391 return 0;
1392
Todd Fialab91de782014-06-27 16:52:49 +00001393 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1394
Michael Sartaina7499c92013-07-01 19:45:50 +00001395 section_headers.resize(header.e_shnum);
1396 if (section_headers.size() != header.e_shnum)
1397 return 0;
1398
1399 const size_t sh_size = header.e_shnum * header.e_shentsize;
1400 const elf_off sh_offset = header.e_shoff;
1401 DataExtractor sh_data;
1402 if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size)
1403 return 0;
1404
1405 uint32_t idx;
1406 lldb::offset_t offset;
1407 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx)
1408 {
1409 if (section_headers[idx].Parse(sh_data, &offset) == false)
1410 break;
1411 }
1412 if (idx < section_headers.size())
1413 section_headers.resize(idx);
1414
1415 const unsigned strtab_idx = header.e_shstrndx;
1416 if (strtab_idx && strtab_idx < section_headers.size())
1417 {
1418 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1419 const size_t byte_size = sheader.sh_size;
1420 const Elf64_Off offset = sheader.sh_offset;
1421 lldb_private::DataExtractor shstr_data;
1422
1423 if (shstr_data.SetData (object_data, offset, byte_size) == byte_size)
1424 {
1425 for (SectionHeaderCollIter I = section_headers.begin();
1426 I != section_headers.end(); ++I)
1427 {
1428 static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink");
1429 const ELFSectionHeaderInfo &header = *I;
1430 const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1431 ConstString name(shstr_data.PeekCStr(I->sh_name));
1432
1433 I->section_name = name;
1434
1435 if (name == g_sect_name_gnu_debuglink)
1436 {
1437 DataExtractor data;
1438 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
1439 {
1440 lldb::offset_t gnu_debuglink_offset = 0;
1441 gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset);
1442 gnu_debuglink_offset = llvm::RoundUpToAlignment (gnu_debuglink_offset, 4);
1443 data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1444 }
1445 }
1446
Todd Fialab91de782014-06-27 16:52:49 +00001447 // Process ELF note section entries.
Tamas Berghammerdb037d92015-03-18 10:36:27 +00001448 bool is_note_header = (header.sh_type == SHT_NOTE);
1449
1450 // The section header ".note.android.ident" is stored as a
1451 // PROGBITS type header but it is actually a note header.
1452 static ConstString g_sect_name_android_ident (".note.android.ident");
1453 if (!is_note_header && name == g_sect_name_android_ident)
1454 is_note_header = true;
1455
1456 if (is_note_header)
Michael Sartaina7499c92013-07-01 19:45:50 +00001457 {
Todd Fialab91de782014-06-27 16:52:49 +00001458 // Allow notes to refine module info.
Michael Sartaina7499c92013-07-01 19:45:50 +00001459 DataExtractor data;
1460 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
1461 {
Todd Fialab91de782014-06-27 16:52:49 +00001462 Error error = RefineModuleDetailsFromNote (data, arch_spec, uuid);
1463 if (error.Fail ())
1464 {
1465 if (log)
1466 log->Printf ("ObjectFileELF::%s ELF note processing failed: %s", __FUNCTION__, error.AsCString ());
1467 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001468 }
1469 }
1470 }
1471
1472 return section_headers.size();
1473 }
1474 }
1475
1476 section_headers.clear();
1477 return 0;
1478}
1479
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001480size_t
1481ObjectFileELF::GetProgramHeaderCount()
1482{
1483 return ParseProgramHeaders();
1484}
1485
1486const elf::ELFProgramHeader *
1487ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id)
1488{
1489 if (!id || !ParseProgramHeaders())
1490 return NULL;
1491
1492 if (--id < m_program_headers.size())
1493 return &m_program_headers[id];
1494
1495 return NULL;
1496}
1497
1498DataExtractor
1499ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id)
1500{
1501 const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id);
1502 if (segment_header == NULL)
1503 return DataExtractor();
1504 return DataExtractor(m_data, segment_header->p_offset, segment_header->p_filesz);
1505}
1506
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001507std::string
1508ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const
1509{
1510 size_t pos = symbol_name.find("@");
1511 return symbol_name.substr(0, pos).str();
1512}
1513
Michael Sartaina7499c92013-07-01 19:45:50 +00001514//----------------------------------------------------------------------
1515// ParseSectionHeaders
1516//----------------------------------------------------------------------
1517size_t
1518ObjectFileELF::ParseSectionHeaders()
1519{
Todd Fialab91de782014-06-27 16:52:49 +00001520 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 +00001521}
1522
Michael Sartaina7499c92013-07-01 19:45:50 +00001523const ObjectFileELF::ELFSectionHeaderInfo *
1524ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id)
1525{
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001526 if (!id || !ParseSectionHeaders())
Michael Sartaina7499c92013-07-01 19:45:50 +00001527 return NULL;
1528
1529 if (--id < m_section_headers.size())
1530 return &m_section_headers[id];
1531
1532 return NULL;
1533}
1534
Greg Clayton3046e662013-07-10 01:23:25 +00001535void
1536ObjectFileELF::CreateSections(SectionList &unified_section_list)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001537{
Greg Clayton3046e662013-07-10 01:23:25 +00001538 if (!m_sections_ap.get() && ParseSectionHeaders())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001539 {
1540 m_sections_ap.reset(new SectionList());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001541
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001542 for (SectionHeaderCollIter I = m_section_headers.begin();
1543 I != m_section_headers.end(); ++I)
1544 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001545 const ELFSectionHeaderInfo &header = *I;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001546
Michael Sartaina7499c92013-07-01 19:45:50 +00001547 ConstString& name = I->section_name;
Greg Clayton47037bc2012-03-27 02:40:46 +00001548 const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1549 const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001550
Greg Clayton4ceb9982010-07-21 22:54:26 +00001551 static ConstString g_sect_name_text (".text");
1552 static ConstString g_sect_name_data (".data");
1553 static ConstString g_sect_name_bss (".bss");
Greg Clayton741f3f92012-03-27 21:10:07 +00001554 static ConstString g_sect_name_tdata (".tdata");
1555 static ConstString g_sect_name_tbss (".tbss");
Greg Clayton4ceb9982010-07-21 22:54:26 +00001556 static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev");
1557 static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges");
1558 static ConstString g_sect_name_dwarf_debug_frame (".debug_frame");
1559 static ConstString g_sect_name_dwarf_debug_info (".debug_info");
1560 static ConstString g_sect_name_dwarf_debug_line (".debug_line");
1561 static ConstString g_sect_name_dwarf_debug_loc (".debug_loc");
1562 static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo");
1563 static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames");
1564 static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes");
1565 static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges");
1566 static ConstString g_sect_name_dwarf_debug_str (".debug_str");
1567 static ConstString g_sect_name_eh_frame (".eh_frame");
1568
1569 SectionType sect_type = eSectionTypeOther;
1570
Greg Clayton741f3f92012-03-27 21:10:07 +00001571 bool is_thread_specific = false;
Michael Sartaina7499c92013-07-01 19:45:50 +00001572
Greg Clayton4ceb9982010-07-21 22:54:26 +00001573 if (name == g_sect_name_text) sect_type = eSectionTypeCode;
1574 else if (name == g_sect_name_data) sect_type = eSectionTypeData;
1575 else if (name == g_sect_name_bss) sect_type = eSectionTypeZeroFill;
Greg Clayton741f3f92012-03-27 21:10:07 +00001576 else if (name == g_sect_name_tdata)
1577 {
1578 sect_type = eSectionTypeData;
1579 is_thread_specific = true;
1580 }
1581 else if (name == g_sect_name_tbss)
1582 {
1583 sect_type = eSectionTypeZeroFill;
1584 is_thread_specific = true;
1585 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001586 // .debug_abbrev – Abbreviations used in the .debug_info section
1587 // .debug_aranges – Lookup table for mapping addresses to compilation units
1588 // .debug_frame – Call frame information
1589 // .debug_info – The core DWARF information section
1590 // .debug_line – Line number information
1591 // .debug_loc – Location lists used in DW_AT_location attributes
1592 // .debug_macinfo – Macro information
1593 // .debug_pubnames – Lookup table for mapping object and function names to compilation units
1594 // .debug_pubtypes – Lookup table for mapping type names to compilation units
1595 // .debug_ranges – Address ranges used in DW_AT_ranges attributes
1596 // .debug_str – String table used in .debug_info
Michael Sartain3cf443d2013-07-17 00:26:30 +00001597 // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
1598 // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
Michael Sartaina7499c92013-07-01 19:45:50 +00001599 // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
Greg Clayton4ceb9982010-07-21 22:54:26 +00001600 else if (name == g_sect_name_dwarf_debug_abbrev) sect_type = eSectionTypeDWARFDebugAbbrev;
1601 else if (name == g_sect_name_dwarf_debug_aranges) sect_type = eSectionTypeDWARFDebugAranges;
1602 else if (name == g_sect_name_dwarf_debug_frame) sect_type = eSectionTypeDWARFDebugFrame;
1603 else if (name == g_sect_name_dwarf_debug_info) sect_type = eSectionTypeDWARFDebugInfo;
1604 else if (name == g_sect_name_dwarf_debug_line) sect_type = eSectionTypeDWARFDebugLine;
1605 else if (name == g_sect_name_dwarf_debug_loc) sect_type = eSectionTypeDWARFDebugLoc;
1606 else if (name == g_sect_name_dwarf_debug_macinfo) sect_type = eSectionTypeDWARFDebugMacInfo;
1607 else if (name == g_sect_name_dwarf_debug_pubnames) sect_type = eSectionTypeDWARFDebugPubNames;
1608 else if (name == g_sect_name_dwarf_debug_pubtypes) sect_type = eSectionTypeDWARFDebugPubTypes;
1609 else if (name == g_sect_name_dwarf_debug_ranges) sect_type = eSectionTypeDWARFDebugRanges;
1610 else if (name == g_sect_name_dwarf_debug_str) sect_type = eSectionTypeDWARFDebugStr;
1611 else if (name == g_sect_name_eh_frame) sect_type = eSectionTypeEHFrame;
Michael Sartaina7499c92013-07-01 19:45:50 +00001612
1613 switch (header.sh_type)
Michael Sartainc836ae72013-05-23 20:57:03 +00001614 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001615 case SHT_SYMTAB:
1616 assert (sect_type == eSectionTypeOther);
1617 sect_type = eSectionTypeELFSymbolTable;
1618 break;
1619 case SHT_DYNSYM:
1620 assert (sect_type == eSectionTypeOther);
1621 sect_type = eSectionTypeELFDynamicSymbols;
1622 break;
1623 case SHT_RELA:
1624 case SHT_REL:
1625 assert (sect_type == eSectionTypeOther);
1626 sect_type = eSectionTypeELFRelocationEntries;
1627 break;
1628 case SHT_DYNAMIC:
1629 assert (sect_type == eSectionTypeOther);
1630 sect_type = eSectionTypeELFDynamicLinkInfo;
1631 break;
Michael Sartainc836ae72013-05-23 20:57:03 +00001632 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001633
Matthew Gardinerf03e6d842014-09-29 08:02:24 +00001634 if (eSectionTypeOther == sect_type)
1635 {
1636 // the kalimba toolchain assumes that ELF section names are free-form. It does
1637 // supports linkscripts which (can) give rise to various arbitarily named
1638 // sections being "Code" or "Data".
1639 sect_type = kalimbaSectionType(m_header, header);
1640 }
1641
1642 const uint32_t target_bytes_size =
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +00001643 (eSectionTypeData == sect_type || eSectionTypeZeroFill == sect_type) ?
Matthew Gardinerf03e6d842014-09-29 08:02:24 +00001644 m_arch_spec.GetDataByteSize() :
1645 eSectionTypeCode == sect_type ?
1646 m_arch_spec.GetCodeByteSize() : 1;
1647
Zachary Turner736d4d82014-06-25 05:42:32 +00001648 elf::elf_xword log2align = (header.sh_addralign==0)
1649 ? 0
1650 : llvm::Log2_64(header.sh_addralign);
Greg Clayton3046e662013-07-10 01:23:25 +00001651 SectionSP section_sp (new Section(GetModule(), // Module to which this section belongs.
1652 this, // ObjectFile to which this section belongs and should read section data from.
1653 SectionIndex(I), // Section ID.
1654 name, // Section name.
1655 sect_type, // Section type.
1656 header.sh_addr, // VM address.
1657 vm_size, // VM size in bytes of this section.
1658 header.sh_offset, // Offset of this section in the file.
1659 file_size, // Size of the section as found in the file.
Zachary Turner736d4d82014-06-25 05:42:32 +00001660 log2align, // Alignment of the section
Matthew Gardinerf03e6d842014-09-29 08:02:24 +00001661 header.sh_flags, // Flags for this section.
1662 target_bytes_size));// Number of host bytes per target byte
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001663
Greg Clayton741f3f92012-03-27 21:10:07 +00001664 if (is_thread_specific)
1665 section_sp->SetIsThreadSpecific (is_thread_specific);
1666 m_sections_ap->AddSection(section_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001667 }
1668 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001669
Greg Clayton3046e662013-07-10 01:23:25 +00001670 if (m_sections_ap.get())
1671 {
1672 if (GetType() == eTypeDebugInfo)
1673 {
1674 static const SectionType g_sections[] =
1675 {
1676 eSectionTypeDWARFDebugAranges,
1677 eSectionTypeDWARFDebugInfo,
1678 eSectionTypeDWARFDebugAbbrev,
1679 eSectionTypeDWARFDebugFrame,
1680 eSectionTypeDWARFDebugLine,
1681 eSectionTypeDWARFDebugStr,
1682 eSectionTypeDWARFDebugLoc,
1683 eSectionTypeDWARFDebugMacInfo,
1684 eSectionTypeDWARFDebugPubNames,
1685 eSectionTypeDWARFDebugPubTypes,
1686 eSectionTypeDWARFDebugRanges,
1687 eSectionTypeELFSymbolTable,
1688 };
1689 SectionList *elf_section_list = m_sections_ap.get();
1690 for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx)
1691 {
1692 SectionType section_type = g_sections[idx];
1693 SectionSP section_sp (elf_section_list->FindSectionByType (section_type, true));
1694 if (section_sp)
1695 {
1696 SectionSP module_section_sp (unified_section_list.FindSectionByType (section_type, true));
1697 if (module_section_sp)
1698 unified_section_list.ReplaceSection (module_section_sp->GetID(), section_sp);
1699 else
1700 unified_section_list.AddSection (section_sp);
1701 }
1702 }
1703 }
1704 else
1705 {
1706 unified_section_list = *m_sections_ap;
1707 }
1708 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001709}
1710
Greg Clayton3046e662013-07-10 01:23:25 +00001711// private
Michael Sartaina7499c92013-07-01 19:45:50 +00001712unsigned
Greg Clayton3046e662013-07-10 01:23:25 +00001713ObjectFileELF::ParseSymbols (Symtab *symtab,
1714 user_id_t start_id,
1715 SectionList *section_list,
1716 const size_t num_symbols,
1717 const DataExtractor &symtab_data,
1718 const DataExtractor &strtab_data)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001719{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001720 ELFSymbol symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +00001721 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001722
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001723 static ConstString text_section_name(".text");
1724 static ConstString init_section_name(".init");
1725 static ConstString fini_section_name(".fini");
1726 static ConstString ctors_section_name(".ctors");
1727 static ConstString dtors_section_name(".dtors");
1728
1729 static ConstString data_section_name(".data");
1730 static ConstString rodata_section_name(".rodata");
1731 static ConstString rodata1_section_name(".rodata1");
1732 static ConstString data2_section_name(".data1");
1733 static ConstString bss_section_name(".bss");
Justin Hibbits6256a0e2014-10-31 02:34:28 +00001734 static ConstString opd_section_name(".opd"); // For ppc64
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001735
Greg Clayton9594f4c2013-04-13 23:17:23 +00001736 //StreamFile strm(stdout, false);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001737 unsigned i;
1738 for (i = 0; i < num_symbols; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001739 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001740 if (symbol.Parse(symtab_data, &offset) == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001741 break;
Greg Clayton9594f4c2013-04-13 23:17:23 +00001742
1743 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1744
Andrew MacPherson17220c12014-03-05 10:12:43 +00001745 // No need to add non-section symbols that have no names
1746 if (symbol.getType() != STT_SECTION &&
1747 (symbol_name == NULL || symbol_name[0] == '\0'))
Greg Clayton9594f4c2013-04-13 23:17:23 +00001748 continue;
1749
1750 //symbol.Dump (&strm, i, &strtab_data, section_list);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001751
Greg Claytone72dfb32012-02-24 01:59:29 +00001752 SectionSP symbol_section_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001753 SymbolType symbol_type = eSymbolTypeInvalid;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001754 Elf64_Half symbol_idx = symbol.st_shndx;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001755
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001756 switch (symbol_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001757 {
1758 case SHN_ABS:
1759 symbol_type = eSymbolTypeAbsolute;
1760 break;
1761 case SHN_UNDEF:
1762 symbol_type = eSymbolTypeUndefined;
1763 break;
1764 default:
Greg Claytone72dfb32012-02-24 01:59:29 +00001765 symbol_section_sp = section_list->GetSectionAtIndex(symbol_idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001766 break;
1767 }
1768
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001769 // If a symbol is undefined do not process it further even if it has a STT type
1770 if (symbol_type != eSymbolTypeUndefined)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001771 {
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001772 switch (symbol.getType())
1773 {
1774 default:
1775 case STT_NOTYPE:
1776 // The symbol's type is not specified.
1777 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001778
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001779 case STT_OBJECT:
1780 // The symbol is associated with a data object, such as a variable,
1781 // an array, etc.
1782 symbol_type = eSymbolTypeData;
1783 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001784
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001785 case STT_FUNC:
1786 // The symbol is associated with a function or other executable code.
1787 symbol_type = eSymbolTypeCode;
1788 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001789
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001790 case STT_SECTION:
1791 // The symbol is associated with a section. Symbol table entries of
1792 // this type exist primarily for relocation and normally have
1793 // STB_LOCAL binding.
1794 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001795
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001796 case STT_FILE:
1797 // Conventionally, the symbol's name gives the name of the source
1798 // file associated with the object file. A file symbol has STB_LOCAL
1799 // binding, its section index is SHN_ABS, and it precedes the other
1800 // STB_LOCAL symbols for the file, if it is present.
Greg Clayton9594f4c2013-04-13 23:17:23 +00001801 symbol_type = eSymbolTypeSourceFile;
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001802 break;
Matt Kopec00049b82013-02-27 20:13:38 +00001803
1804 case STT_GNU_IFUNC:
1805 // The symbol is associated with an indirect function. The actual
1806 // function will be resolved if it is referenced.
1807 symbol_type = eSymbolTypeResolver;
1808 break;
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001809 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001810 }
1811
1812 if (symbol_type == eSymbolTypeInvalid)
1813 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001814 if (symbol_section_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001815 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001816 const ConstString &sect_name = symbol_section_sp->GetName();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001817 if (sect_name == text_section_name ||
1818 sect_name == init_section_name ||
1819 sect_name == fini_section_name ||
1820 sect_name == ctors_section_name ||
1821 sect_name == dtors_section_name)
1822 {
1823 symbol_type = eSymbolTypeCode;
1824 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001825 else if (sect_name == data_section_name ||
1826 sect_name == data2_section_name ||
1827 sect_name == rodata_section_name ||
1828 sect_name == rodata1_section_name ||
1829 sect_name == bss_section_name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001830 {
1831 symbol_type = eSymbolTypeData;
1832 }
1833 }
1834 }
1835
Todd Fialafbd703a2014-09-15 22:33:39 +00001836 int64_t symbol_value_offset = 0;
1837 uint32_t additional_flags = 0;
Todd Fiala1a088662014-09-15 16:27:44 +00001838
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001839 ArchSpec arch;
1840 if (GetArchitecture(arch))
Todd Fiala1a088662014-09-15 16:27:44 +00001841 {
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001842 if (arch.GetMachine() == llvm::Triple::arm)
Todd Fialafbd703a2014-09-15 22:33:39 +00001843 {
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001844 if (symbol.getBinding() == STB_LOCAL && symbol_name && symbol_name[0] == '$')
1845 {
1846 // These are reserved for the specification (e.g.: mapping
1847 // symbols). We don't want to add them to the symbol table.
1848
Tamas Berghammerb52bbd12015-04-17 09:36:59 +00001849 if (symbol_type == eSymbolTypeCode)
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001850 {
Tamas Berghammerb52bbd12015-04-17 09:36:59 +00001851 llvm::StringRef symbol_name_ref(symbol_name);
1852 if (symbol_name_ref == "$a" || symbol_name_ref.startswith("$a."))
1853 {
1854 // $a[.<any>]* - marks an ARM instruction sequence
1855 m_address_class_map[symbol.st_value] = eAddressClassCode;
1856 }
1857 else if (symbol_name_ref == "$b" || symbol_name_ref.startswith("$b.") ||
1858 symbol_name_ref == "$t" || symbol_name_ref.startswith("$t."))
1859 {
1860 // $b[.<any>]* - marks a THUMB BL instruction sequence
1861 // $t[.<any>]* - marks a THUMB instruction sequence
1862 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
1863 }
1864 else if (symbol_name_ref == "$d" || symbol_name_ref.startswith("$d."))
1865 {
1866 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
1867 m_address_class_map[symbol.st_value] = eAddressClassData;
1868 }
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001869 }
1870
1871 continue;
1872 }
1873 }
1874 else if (arch.GetMachine() == llvm::Triple::aarch64)
1875 {
1876 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
Tamas Berghammerb52bbd12015-04-17 09:36:59 +00001881 if (symbol_type == eSymbolTypeCode)
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001882 {
Tamas Berghammerb52bbd12015-04-17 09:36:59 +00001883 llvm::StringRef symbol_name_ref(symbol_name);
1884 if (symbol_name_ref == "$x" || symbol_name_ref.startswith("$x."))
1885 {
1886 // $x[.<any>]* - marks an A64 instruction sequence
1887 m_address_class_map[symbol.st_value] = eAddressClassCode;
1888 }
1889 else if (symbol_name_ref == "$d" || symbol_name_ref.startswith("$d."))
1890 {
1891 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
1892 m_address_class_map[symbol.st_value] = eAddressClassData;
1893 }
Tamas Berghammer83544cf2015-04-07 10:43:50 +00001894 }
1895
1896 continue;
1897 }
1898 }
1899
1900 if (arch.GetMachine() == llvm::Triple::arm)
1901 {
1902 // THUMB functions have the lower bit of their address set. Fixup
1903 // the actual address and mark the symbol as THUMB.
1904 if (symbol_type == eSymbolTypeCode && symbol.st_value & 1)
1905 {
1906 // Substracting 1 from the address effectively unsets
1907 // the low order bit, which results in the address
1908 // actually pointing to the beginning of the symbol.
1909 // This delta will be used below in conjuction with
1910 // symbol.st_value to produce the final symbol_value
1911 // that we store in the symtab.
1912 symbol_value_offset = -1;
1913 additional_flags = ARM_ELF_SYM_IS_THUMB;
1914 }
Todd Fialafbd703a2014-09-15 22:33:39 +00001915 }
Todd Fiala1a088662014-09-15 16:27:44 +00001916 }
1917
Greg Clayton3046e662013-07-10 01:23:25 +00001918 // If the symbol section we've found has no data (SHT_NOBITS), then check the module section
1919 // 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 +00001920 if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0))
1921 {
1922 ModuleSP module_sp(GetModule());
1923 if (module_sp)
1924 {
Greg Clayton3046e662013-07-10 01:23:25 +00001925 SectionList *module_section_list = module_sp->GetSectionList();
1926 if (module_section_list && module_section_list != section_list)
Michael Sartaina7499c92013-07-01 19:45:50 +00001927 {
1928 const ConstString &sect_name = symbol_section_sp->GetName();
Greg Clayton3046e662013-07-10 01:23:25 +00001929 lldb::SectionSP section_sp (module_section_list->FindSectionByName (sect_name));
Michael Sartaina7499c92013-07-01 19:45:50 +00001930 if (section_sp && section_sp->GetFileSize())
1931 {
1932 symbol_section_sp = section_sp;
1933 }
1934 }
1935 }
1936 }
1937
Todd Fialafbd703a2014-09-15 22:33:39 +00001938 // symbol_value_offset may contain 0 for ARM symbols or -1 for
1939 // THUMB symbols. See above for more details.
Tamas Berghammer1b222b12015-04-16 14:06:18 +00001940 uint64_t symbol_value = symbol.st_value + symbol_value_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +00001941 if (symbol_section_sp && CalculateType() != ObjectFile::Type::eTypeObjectFile)
Greg Claytone72dfb32012-02-24 01:59:29 +00001942 symbol_value -= symbol_section_sp->GetFileAddress();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001943 bool is_global = symbol.getBinding() == STB_GLOBAL;
Todd Fialafbd703a2014-09-15 22:33:39 +00001944 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
Greg Clayton47037bc2012-03-27 02:40:46 +00001945 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
Todd Fialafbd703a2014-09-15 22:33:39 +00001946
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001947 llvm::StringRef symbol_ref(symbol_name);
1948
1949 // Symbol names may contain @VERSION suffixes. Find those and strip them temporarily.
1950 size_t version_pos = symbol_ref.find('@');
1951 bool has_suffix = version_pos != llvm::StringRef::npos;
1952 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos);
1953 Mangled mangled(ConstString(symbol_bare), is_mangled);
1954
1955 // Now append the suffix back to mangled and unmangled names. Only do it if the
1956 // demangling was sucessful (string is not empty).
1957 if (has_suffix)
1958 {
1959 llvm::StringRef suffix = symbol_ref.substr(version_pos);
1960
1961 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef();
1962 if (! mangled_name.empty())
1963 mangled.SetMangledName( ConstString((mangled_name + suffix).str()) );
1964
1965 llvm::StringRef demangled_name = mangled.GetDemangledName().GetStringRef();
1966 if (! demangled_name.empty())
1967 mangled.SetDemangledName( ConstString((demangled_name + suffix).str()) );
1968 }
1969
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001970 Symbol dc_symbol(
Greg Claytone72dfb32012-02-24 01:59:29 +00001971 i + start_id, // ID is the original symbol table index.
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001972 mangled,
Greg Claytone72dfb32012-02-24 01:59:29 +00001973 symbol_type, // Type of this symbol
1974 is_global, // Is this globally visible?
1975 false, // Is this symbol debug info?
1976 false, // Is this symbol a trampoline?
1977 false, // Is this symbol artificial?
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001978 AddressRange(
1979 symbol_section_sp, // Section in which this symbol is defined or null.
1980 symbol_value, // Offset in section or symbol value.
1981 symbol.st_size), // Size in bytes of this symbol.
Greg Clayton9594f4c2013-04-13 23:17:23 +00001982 true, // Size is valid
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001983 has_suffix, // Contains linker annotations?
Greg Claytone72dfb32012-02-24 01:59:29 +00001984 flags); // Symbol flags.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001985 symtab->AddSymbol(dc_symbol);
1986 }
Stephen Wilson499b40e2011-03-30 16:07:05 +00001987 return i;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001988}
1989
Stephen Wilson499b40e2011-03-30 16:07:05 +00001990unsigned
Greg Clayton3046e662013-07-10 01:23:25 +00001991ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab)
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001992{
Greg Clayton3046e662013-07-10 01:23:25 +00001993 if (symtab->GetObjectFile() != this)
1994 {
1995 // If the symbol table section is owned by a different object file, have it do the
1996 // parsing.
1997 ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile());
1998 return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
1999 }
2000
2001 // Get section list for this object file.
2002 SectionList *section_list = m_sections_ap.get();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002003 if (!section_list)
Stephen Wilson499b40e2011-03-30 16:07:05 +00002004 return 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002005
Greg Clayton3046e662013-07-10 01:23:25 +00002006 user_id_t symtab_id = symtab->GetID();
2007 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
Michael Sartaina7499c92013-07-01 19:45:50 +00002008 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
2009 symtab_hdr->sh_type == SHT_DYNSYM);
2010
Greg Clayton3046e662013-07-10 01:23:25 +00002011 // sh_link: section header index of associated string table.
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002012 // Section ID's are ones based.
Stephen Wilson499b40e2011-03-30 16:07:05 +00002013 user_id_t strtab_id = symtab_hdr->sh_link + 1;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002014 Section *strtab = section_list->FindSectionByID(strtab_id).get();
Greg Clayton3046e662013-07-10 01:23:25 +00002015
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002016 if (symtab && strtab)
2017 {
Greg Clayton3046e662013-07-10 01:23:25 +00002018 assert (symtab->GetObjectFile() == this);
2019 assert (strtab->GetObjectFile() == this);
2020
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002021 DataExtractor symtab_data;
2022 DataExtractor strtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002023 if (ReadSectionData(symtab, symtab_data) &&
2024 ReadSectionData(strtab, strtab_data))
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002025 {
Greg Clayton3046e662013-07-10 01:23:25 +00002026 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
2027
Arnaud A. de Grandmaison62e5f4d2014-03-22 20:23:26 +00002028 return ParseSymbols(symbol_table, start_id, section_list,
2029 num_symbols, symtab_data, strtab_data);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002030 }
2031 }
Stephen Wilson499b40e2011-03-30 16:07:05 +00002032
Arnaud A. de Grandmaison62e5f4d2014-03-22 20:23:26 +00002033 return 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002034}
2035
2036size_t
2037ObjectFileELF::ParseDynamicSymbols()
2038{
2039 if (m_dynamic_symbols.size())
2040 return m_dynamic_symbols.size();
2041
Stephen Wilson499b40e2011-03-30 16:07:05 +00002042 SectionList *section_list = GetSectionList();
2043 if (!section_list)
Bill Wendlinged24dcc2012-04-03 07:50:11 +00002044 return 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002045
Greg Clayton3046e662013-07-10 01:23:25 +00002046 // Find the SHT_DYNAMIC section.
2047 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
Stephen Wilson499b40e2011-03-30 16:07:05 +00002048 if (!dynsym)
Bill Wendlinged24dcc2012-04-03 07:50:11 +00002049 return 0;
Greg Clayton3046e662013-07-10 01:23:25 +00002050 assert (dynsym->GetObjectFile() == this);
Stephen Wilson499b40e2011-03-30 16:07:05 +00002051
2052 ELFDynamic symbol;
2053 DataExtractor dynsym_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002054 if (ReadSectionData(dynsym, dynsym_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00002055 {
Greg Claytonc7bece562013-01-25 18:06:21 +00002056 const lldb::offset_t section_size = dynsym_data.GetByteSize();
2057 lldb::offset_t cursor = 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002058
2059 while (cursor < section_size)
2060 {
Stephen Wilson499b40e2011-03-30 16:07:05 +00002061 if (!symbol.Parse(dynsym_data, &cursor))
2062 break;
2063
2064 m_dynamic_symbols.push_back(symbol);
2065 }
2066 }
2067
2068 return m_dynamic_symbols.size();
2069}
2070
2071const ELFDynamic *
2072ObjectFileELF::FindDynamicSymbol(unsigned tag)
2073{
2074 if (!ParseDynamicSymbols())
2075 return NULL;
2076
Stephen Wilson499b40e2011-03-30 16:07:05 +00002077 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2078 DynamicSymbolCollIter E = m_dynamic_symbols.end();
2079 for ( ; I != E; ++I)
2080 {
2081 ELFDynamic *symbol = &*I;
2082
2083 if (symbol->d_tag == tag)
2084 return symbol;
2085 }
2086
2087 return NULL;
2088}
2089
Stephen Wilson499b40e2011-03-30 16:07:05 +00002090unsigned
2091ObjectFileELF::PLTRelocationType()
2092{
Michael Sartainf7899542013-08-22 21:25:53 +00002093 // DT_PLTREL
2094 // This member specifies the type of relocation entry to which the
2095 // procedure linkage table refers. The d_val member holds DT_REL or
2096 // DT_RELA, as appropriate. All relocations in a procedure linkage table
2097 // must use the same relocation.
Stephen Wilson499b40e2011-03-30 16:07:05 +00002098 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2099
2100 if (symbol)
2101 return symbol->d_val;
2102
2103 return 0;
2104}
2105
2106static unsigned
2107ParsePLTRelocations(Symtab *symbol_table,
2108 user_id_t start_id,
2109 unsigned rel_type,
2110 const ELFHeader *hdr,
2111 const ELFSectionHeader *rel_hdr,
2112 const ELFSectionHeader *plt_hdr,
2113 const ELFSectionHeader *sym_hdr,
Greg Claytone72dfb32012-02-24 01:59:29 +00002114 const lldb::SectionSP &plt_section_sp,
Stephen Wilson499b40e2011-03-30 16:07:05 +00002115 DataExtractor &rel_data,
2116 DataExtractor &symtab_data,
2117 DataExtractor &strtab_data)
2118{
2119 ELFRelocation rel(rel_type);
2120 ELFSymbol symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +00002121 lldb::offset_t offset = 0;
Michael Sartainf7899542013-08-22 21:25:53 +00002122 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 16 bytes.
2123 // So round the entsize up by the alignment if addralign is set.
2124 const elf_xword plt_entsize = plt_hdr->sh_addralign ?
2125 llvm::RoundUpToAlignment (plt_hdr->sh_entsize, plt_hdr->sh_addralign) : plt_hdr->sh_entsize;
Greg Claytonc7bece562013-01-25 18:06:21 +00002126 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002127
2128 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2129 reloc_info_fn reloc_type;
2130 reloc_info_fn reloc_symbol;
2131
Greg Claytond091afe2012-11-12 22:53:16 +00002132 if (hdr->Is32Bit())
Stephen Wilson499b40e2011-03-30 16:07:05 +00002133 {
2134 reloc_type = ELFRelocation::RelocType32;
2135 reloc_symbol = ELFRelocation::RelocSymbol32;
2136 }
2137 else
2138 {
2139 reloc_type = ELFRelocation::RelocType64;
2140 reloc_symbol = ELFRelocation::RelocSymbol64;
2141 }
2142
2143 unsigned slot_type = hdr->GetRelocationJumpSlotType();
2144 unsigned i;
2145 for (i = 0; i < num_relocations; ++i)
2146 {
2147 if (rel.Parse(rel_data, &offset) == false)
2148 break;
2149
2150 if (reloc_type(rel) != slot_type)
2151 continue;
2152
Greg Claytonc7bece562013-01-25 18:06:21 +00002153 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002154 uint64_t plt_index = (i + 1) * plt_entsize;
2155
2156 if (!symbol.Parse(symtab_data, &symbol_offset))
2157 break;
2158
2159 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
Greg Clayton47037bc2012-03-27 02:40:46 +00002160 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
Stephen Wilson499b40e2011-03-30 16:07:05 +00002161
2162 Symbol jump_symbol(
2163 i + start_id, // Symbol table index
2164 symbol_name, // symbol name.
Greg Clayton47037bc2012-03-27 02:40:46 +00002165 is_mangled, // is the symbol name mangled?
Stephen Wilson499b40e2011-03-30 16:07:05 +00002166 eSymbolTypeTrampoline, // Type of this symbol
2167 false, // Is this globally visible?
2168 false, // Is this symbol debug info?
2169 true, // Is this symbol a trampoline?
2170 true, // Is this symbol artificial?
Greg Claytone72dfb32012-02-24 01:59:29 +00002171 plt_section_sp, // Section in which this symbol is defined or null.
Stephen Wilson499b40e2011-03-30 16:07:05 +00002172 plt_index, // Offset in section or symbol value.
2173 plt_entsize, // Size in bytes of this symbol.
Greg Clayton9594f4c2013-04-13 23:17:23 +00002174 true, // Size is valid
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00002175 false, // Contains linker annotations?
Stephen Wilson499b40e2011-03-30 16:07:05 +00002176 0); // Symbol flags.
2177
2178 symbol_table->AddSymbol(jump_symbol);
2179 }
2180
2181 return i;
2182}
2183
2184unsigned
2185ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table,
2186 user_id_t start_id,
Michael Sartaina7499c92013-07-01 19:45:50 +00002187 const ELFSectionHeaderInfo *rel_hdr,
Stephen Wilson499b40e2011-03-30 16:07:05 +00002188 user_id_t rel_id)
2189{
2190 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2191
Greg Clayton3046e662013-07-10 01:23:25 +00002192 // The link field points to the associated symbol table. The info field
Stephen Wilson499b40e2011-03-30 16:07:05 +00002193 // points to the section holding the plt.
2194 user_id_t symtab_id = rel_hdr->sh_link;
2195 user_id_t plt_id = rel_hdr->sh_info;
2196
2197 if (!symtab_id || !plt_id)
2198 return 0;
2199
2200 // Section ID's are ones based;
2201 symtab_id++;
2202 plt_id++;
2203
Michael Sartaina7499c92013-07-01 19:45:50 +00002204 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +00002205 if (!plt_hdr)
2206 return 0;
2207
Michael Sartaina7499c92013-07-01 19:45:50 +00002208 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +00002209 if (!sym_hdr)
2210 return 0;
2211
Greg Clayton3046e662013-07-10 01:23:25 +00002212 SectionList *section_list = m_sections_ap.get();
Stephen Wilson499b40e2011-03-30 16:07:05 +00002213 if (!section_list)
2214 return 0;
2215
2216 Section *rel_section = section_list->FindSectionByID(rel_id).get();
2217 if (!rel_section)
2218 return 0;
2219
Greg Claytone72dfb32012-02-24 01:59:29 +00002220 SectionSP plt_section_sp (section_list->FindSectionByID(plt_id));
2221 if (!plt_section_sp)
Stephen Wilson499b40e2011-03-30 16:07:05 +00002222 return 0;
2223
2224 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2225 if (!symtab)
2226 return 0;
2227
Greg Clayton3046e662013-07-10 01:23:25 +00002228 // sh_link points to associated string table.
Stephen Wilson499b40e2011-03-30 16:07:05 +00002229 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
2230 if (!strtab)
2231 return 0;
2232
2233 DataExtractor rel_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002234 if (!ReadSectionData(rel_section, rel_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00002235 return 0;
2236
2237 DataExtractor symtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002238 if (!ReadSectionData(symtab, symtab_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00002239 return 0;
2240
2241 DataExtractor strtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00002242 if (!ReadSectionData(strtab, strtab_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00002243 return 0;
2244
2245 unsigned rel_type = PLTRelocationType();
2246 if (!rel_type)
2247 return 0;
2248
Greg Claytone72dfb32012-02-24 01:59:29 +00002249 return ParsePLTRelocations (symbol_table,
2250 start_id,
2251 rel_type,
2252 &m_header,
2253 rel_hdr,
2254 plt_hdr,
2255 sym_hdr,
2256 plt_section_sp,
2257 rel_data,
2258 symtab_data,
2259 strtab_data);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002260}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002261
Andrew MacPherson17220c12014-03-05 10:12:43 +00002262unsigned
2263ObjectFileELF::RelocateSection(Symtab* symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2264 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2265 DataExtractor &rel_data, DataExtractor &symtab_data,
2266 DataExtractor &debug_data, Section* rel_section)
2267{
2268 ELFRelocation rel(rel_hdr->sh_type);
2269 lldb::addr_t offset = 0;
2270 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2271 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2272 reloc_info_fn reloc_type;
2273 reloc_info_fn reloc_symbol;
2274
2275 if (hdr->Is32Bit())
2276 {
2277 reloc_type = ELFRelocation::RelocType32;
2278 reloc_symbol = ELFRelocation::RelocSymbol32;
2279 }
2280 else
2281 {
2282 reloc_type = ELFRelocation::RelocType64;
2283 reloc_symbol = ELFRelocation::RelocSymbol64;
2284 }
2285
2286 for (unsigned i = 0; i < num_relocations; ++i)
2287 {
2288 if (rel.Parse(rel_data, &offset) == false)
2289 break;
2290
2291 Symbol* symbol = NULL;
2292
2293 if (hdr->Is32Bit())
2294 {
2295 switch (reloc_type(rel)) {
2296 case R_386_32:
2297 case R_386_PC32:
2298 default:
2299 assert(false && "unexpected relocation type");
2300 }
2301 } else {
2302 switch (reloc_type(rel)) {
2303 case R_X86_64_64:
2304 {
2305 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2306 if (symbol)
2307 {
2308 addr_t value = symbol->GetAddress().GetFileAddress();
2309 DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2310 uint64_t* dst = reinterpret_cast<uint64_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset64(rel));
2311 *dst = value + ELFRelocation::RelocAddend64(rel);
2312 }
2313 break;
2314 }
2315 case R_X86_64_32:
2316 case R_X86_64_32S:
2317 {
2318 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2319 if (symbol)
2320 {
2321 addr_t value = symbol->GetAddress().GetFileAddress();
2322 value += ELFRelocation::RelocAddend32(rel);
2323 assert((reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) ||
2324 (reloc_type(rel) == R_X86_64_32S &&
2325 ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN)));
2326 uint32_t truncated_addr = (value & 0xFFFFFFFF);
2327 DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2328 uint32_t* dst = reinterpret_cast<uint32_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel));
2329 *dst = truncated_addr;
2330 }
2331 break;
2332 }
2333 case R_X86_64_PC32:
2334 default:
2335 assert(false && "unexpected relocation type");
2336 }
2337 }
2338 }
2339
2340 return 0;
2341}
2342
2343unsigned
2344ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, user_id_t rel_id)
2345{
2346 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2347
2348 // Parse in the section list if needed.
2349 SectionList *section_list = GetSectionList();
2350 if (!section_list)
2351 return 0;
2352
2353 // Section ID's are ones based.
2354 user_id_t symtab_id = rel_hdr->sh_link + 1;
2355 user_id_t debug_id = rel_hdr->sh_info + 1;
2356
2357 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2358 if (!symtab_hdr)
2359 return 0;
2360
2361 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2362 if (!debug_hdr)
2363 return 0;
2364
2365 Section *rel = section_list->FindSectionByID(rel_id).get();
2366 if (!rel)
2367 return 0;
2368
2369 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2370 if (!symtab)
2371 return 0;
2372
2373 Section *debug = section_list->FindSectionByID(debug_id).get();
2374 if (!debug)
2375 return 0;
2376
2377 DataExtractor rel_data;
2378 DataExtractor symtab_data;
2379 DataExtractor debug_data;
2380
2381 if (ReadSectionData(rel, rel_data) &&
2382 ReadSectionData(symtab, symtab_data) &&
2383 ReadSectionData(debug, debug_data))
2384 {
2385 RelocateSection(m_symtab_ap.get(), &m_header, rel_hdr, symtab_hdr, debug_hdr,
2386 rel_data, symtab_data, debug_data, debug);
2387 }
2388
2389 return 0;
2390}
2391
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002392Symtab *
Greg Clayton3046e662013-07-10 01:23:25 +00002393ObjectFileELF::GetSymtab()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002394{
Michael Sartaina7499c92013-07-01 19:45:50 +00002395 ModuleSP module_sp(GetModule());
Greg Clayton3046e662013-07-10 01:23:25 +00002396 if (!module_sp)
2397 return NULL;
Michael Sartaina7499c92013-07-01 19:45:50 +00002398
Greg Clayton3046e662013-07-10 01:23:25 +00002399 // We always want to use the main object file so we (hopefully) only have one cached copy
2400 // of our symtab, dynamic sections, etc.
2401 ObjectFile *module_obj_file = module_sp->GetObjectFile();
2402 if (module_obj_file && module_obj_file != this)
2403 return module_obj_file->GetSymtab();
2404
2405 if (m_symtab_ap.get() == NULL)
2406 {
Pavel Labath783cbdc2015-03-04 10:28:15 +00002407 SectionList *section_list = module_sp->GetSectionList();
Michael Sartaina7499c92013-07-01 19:45:50 +00002408 if (!section_list)
2409 return NULL;
2410
Greg Clayton3046e662013-07-10 01:23:25 +00002411 uint64_t symbol_id = 0;
2412 lldb_private::Mutex::Locker locker(module_sp->GetMutex());
Stephen Wilson499b40e2011-03-30 16:07:05 +00002413
Greg Clayton3046e662013-07-10 01:23:25 +00002414 m_symtab_ap.reset(new Symtab(this));
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002415
Michael Sartaina7499c92013-07-01 19:45:50 +00002416 // Sharable objects and dynamic executables usually have 2 distinct symbol
2417 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller
2418 // version of the symtab that only contains global symbols. The information found
2419 // in the dynsym is therefore also found in the symtab, while the reverse is not
2420 // necessarily true.
Greg Clayton3046e662013-07-10 01:23:25 +00002421 Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get();
2422 if (!symtab)
Michael Sartaina7499c92013-07-01 19:45:50 +00002423 {
2424 // The symtab section is non-allocable and can be stripped, so if it doesn't exist
2425 // then use the dynsym section which should always be there.
Greg Clayton3046e662013-07-10 01:23:25 +00002426 symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get();
Michael Sartaina7499c92013-07-01 19:45:50 +00002427 }
Greg Clayton3046e662013-07-10 01:23:25 +00002428 if (symtab)
2429 symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab);
Michael Sartaina7499c92013-07-01 19:45:50 +00002430
Michael Sartainf7899542013-08-22 21:25:53 +00002431 // DT_JMPREL
2432 // If present, this entry's d_ptr member holds the address of relocation
2433 // entries associated solely with the procedure linkage table. Separating
2434 // these relocation entries lets the dynamic linker ignore them during
2435 // process initialization, if lazy binding is enabled. If this entry is
2436 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2437 // also be present.
Greg Clayton3046e662013-07-10 01:23:25 +00002438 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2439 if (symbol)
Michael Sartaina7499c92013-07-01 19:45:50 +00002440 {
Michael Sartainf7899542013-08-22 21:25:53 +00002441 // Synthesize trampoline symbols to help navigate the PLT.
Greg Clayton3046e662013-07-10 01:23:25 +00002442 addr_t addr = symbol->d_ptr;
2443 Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get();
2444 if (reloc_section)
Michael Sartaina7499c92013-07-01 19:45:50 +00002445 {
Greg Clayton3046e662013-07-10 01:23:25 +00002446 user_id_t reloc_id = reloc_section->GetID();
2447 const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id);
2448 assert(reloc_header);
Michael Sartaina7499c92013-07-01 19:45:50 +00002449
Greg Clayton3046e662013-07-10 01:23:25 +00002450 ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id);
Michael Sartaina7499c92013-07-01 19:45:50 +00002451 }
2452 }
Michael Sartaina7499c92013-07-01 19:45:50 +00002453 }
Andrew MacPherson17220c12014-03-05 10:12:43 +00002454
2455 for (SectionHeaderCollIter I = m_section_headers.begin();
2456 I != m_section_headers.end(); ++I)
2457 {
2458 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL)
2459 {
2460 if (CalculateType() == eTypeObjectFile)
2461 {
2462 const char *section_name = I->section_name.AsCString("");
2463 if (strstr(section_name, ".rela.debug") ||
2464 strstr(section_name, ".rel.debug"))
2465 {
2466 const ELFSectionHeader &reloc_header = *I;
2467 user_id_t reloc_id = SectionIndex(I);
2468 RelocateDebugSections(&reloc_header, reloc_id);
2469 }
2470 }
2471 }
2472 }
Greg Clayton3046e662013-07-10 01:23:25 +00002473 return m_symtab_ap.get();
2474}
2475
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002476Symbol *
2477ObjectFileELF::ResolveSymbolForAddress(const Address& so_addr, bool verify_unique)
2478{
2479 if (!m_symtab_ap.get())
2480 return nullptr; // GetSymtab() should be called first.
2481
2482 const SectionList *section_list = GetSectionList();
2483 if (!section_list)
2484 return nullptr;
2485
2486 if (DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo())
2487 {
2488 AddressRange range;
2489 if (eh_frame->GetAddressRange (so_addr, range))
2490 {
2491 const addr_t file_addr = range.GetBaseAddress().GetFileAddress();
2492 Symbol * symbol = verify_unique ? m_symtab_ap->FindSymbolContainingFileAddress(file_addr) : nullptr;
2493 if (symbol)
2494 return symbol;
2495
2496 // Note that a (stripped) symbol won't be found by GetSymtab()...
2497 lldb::SectionSP eh_sym_section_sp = section_list->FindSectionContainingFileAddress(file_addr);
2498 if (eh_sym_section_sp.get())
2499 {
2500 addr_t section_base = eh_sym_section_sp->GetFileAddress();
2501 addr_t offset = file_addr - section_base;
2502 uint64_t symbol_id = m_symtab_ap->GetNumSymbols();
2503
2504 Symbol eh_symbol(
2505 symbol_id, // Symbol table index.
2506 "???", // Symbol name.
2507 false, // Is the symbol name mangled?
2508 eSymbolTypeCode, // Type of this symbol.
2509 true, // Is this globally visible?
2510 false, // Is this symbol debug info?
2511 false, // Is this symbol a trampoline?
2512 true, // Is this symbol artificial?
2513 eh_sym_section_sp, // Section in which this symbol is defined or null.
2514 offset, // Offset in section or symbol value.
2515 range.GetByteSize(), // Size in bytes of this symbol.
2516 true, // Size is valid.
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00002517 false, // Contains linker annotations?
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002518 0); // Symbol flags.
2519 if (symbol_id == m_symtab_ap->AddSymbol(eh_symbol))
2520 return m_symtab_ap->SymbolAtIndex(symbol_id);
2521 }
2522 }
2523 }
2524 return nullptr;
2525}
2526
2527
Greg Clayton3046e662013-07-10 01:23:25 +00002528bool
2529ObjectFileELF::IsStripped ()
2530{
2531 // TODO: determine this for ELF
2532 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002533}
2534
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002535//===----------------------------------------------------------------------===//
2536// Dump
2537//
2538// Dump the specifics of the runtime file container (such as any headers
2539// segments, sections, etc).
2540//----------------------------------------------------------------------
2541void
2542ObjectFileELF::Dump(Stream *s)
2543{
2544 DumpELFHeader(s, m_header);
2545 s->EOL();
2546 DumpELFProgramHeaders(s);
2547 s->EOL();
2548 DumpELFSectionHeaders(s);
2549 s->EOL();
2550 SectionList *section_list = GetSectionList();
2551 if (section_list)
Greg Clayton10177aa2010-12-08 05:08:21 +00002552 section_list->Dump(s, NULL, true, UINT32_MAX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002553 Symtab *symtab = GetSymtab();
2554 if (symtab)
Greg Claytone0d378b2011-03-24 21:19:54 +00002555 symtab->Dump(s, NULL, eSortOrderNone);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002556 s->EOL();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002557 DumpDependentModules(s);
2558 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002559}
2560
2561//----------------------------------------------------------------------
2562// DumpELFHeader
2563//
2564// Dump the ELF header to the specified output stream
2565//----------------------------------------------------------------------
2566void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002567ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002568{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002569 s->PutCString("ELF Header\n");
2570 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2571 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n",
2572 header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]);
2573 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n",
2574 header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]);
2575 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n",
2576 header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002577
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002578 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2579 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002580 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2581 s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2582 s->Printf ("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
2583
2584 s->Printf("e_type = 0x%4.4x ", header.e_type);
2585 DumpELFHeader_e_type(s, header.e_type);
2586 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
2587 s->Printf("e_version = 0x%8.8x\n", header.e_version);
Daniel Malead01b2952012-11-29 21:49:15 +00002588 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
2589 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
2590 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002591 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
2592 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
2593 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
2594 s->Printf("e_phnum = 0x%4.4x\n", header.e_phnum);
2595 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
2596 s->Printf("e_shnum = 0x%4.4x\n", header.e_shnum);
2597 s->Printf("e_shstrndx = 0x%4.4x\n", header.e_shstrndx);
2598}
2599
2600//----------------------------------------------------------------------
2601// DumpELFHeader_e_type
2602//
2603// Dump an token value for the ELF header member e_type
2604//----------------------------------------------------------------------
2605void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002606ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002607{
2608 switch (e_type)
2609 {
2610 case ET_NONE: *s << "ET_NONE"; break;
2611 case ET_REL: *s << "ET_REL"; break;
2612 case ET_EXEC: *s << "ET_EXEC"; break;
2613 case ET_DYN: *s << "ET_DYN"; break;
2614 case ET_CORE: *s << "ET_CORE"; break;
2615 default:
2616 break;
2617 }
2618}
2619
2620//----------------------------------------------------------------------
2621// DumpELFHeader_e_ident_EI_DATA
2622//
2623// Dump an token value for the ELF header member e_ident[EI_DATA]
2624//----------------------------------------------------------------------
2625void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002626ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002627{
2628 switch (ei_data)
2629 {
2630 case ELFDATANONE: *s << "ELFDATANONE"; break;
2631 case ELFDATA2LSB: *s << "ELFDATA2LSB - Little Endian"; break;
2632 case ELFDATA2MSB: *s << "ELFDATA2MSB - Big Endian"; break;
2633 default:
2634 break;
2635 }
2636}
2637
2638
2639//----------------------------------------------------------------------
2640// DumpELFProgramHeader
2641//
2642// Dump a single ELF program header to the specified output stream
2643//----------------------------------------------------------------------
2644void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002645ObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002646{
2647 DumpELFProgramHeader_p_type(s, ph.p_type);
Daniel Malead01b2952012-11-29 21:49:15 +00002648 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr);
2649 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 +00002650
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002651 DumpELFProgramHeader_p_flags(s, ph.p_flags);
Daniel Malead01b2952012-11-29 21:49:15 +00002652 s->Printf(") %8.8" PRIx64, ph.p_align);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002653}
2654
2655//----------------------------------------------------------------------
2656// DumpELFProgramHeader_p_type
2657//
2658// Dump an token value for the ELF program header member p_type which
2659// describes the type of the program header
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002660// ----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002661void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002662ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002663{
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00002664 const int kStrWidth = 15;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002665 switch (p_type)
2666 {
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00002667 CASE_AND_STREAM(s, PT_NULL , kStrWidth);
2668 CASE_AND_STREAM(s, PT_LOAD , kStrWidth);
2669 CASE_AND_STREAM(s, PT_DYNAMIC , kStrWidth);
2670 CASE_AND_STREAM(s, PT_INTERP , kStrWidth);
2671 CASE_AND_STREAM(s, PT_NOTE , kStrWidth);
2672 CASE_AND_STREAM(s, PT_SHLIB , kStrWidth);
2673 CASE_AND_STREAM(s, PT_PHDR , kStrWidth);
2674 CASE_AND_STREAM(s, PT_TLS , kStrWidth);
2675 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002676 default:
2677 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
2678 break;
2679 }
2680}
2681
2682
2683//----------------------------------------------------------------------
2684// DumpELFProgramHeader_p_flags
2685//
2686// Dump an token value for the ELF program header member p_flags
2687//----------------------------------------------------------------------
2688void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002689ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002690{
2691 *s << ((p_flags & PF_X) ? "PF_X" : " ")
2692 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
2693 << ((p_flags & PF_W) ? "PF_W" : " ")
2694 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
2695 << ((p_flags & PF_R) ? "PF_R" : " ");
2696}
2697
2698//----------------------------------------------------------------------
2699// DumpELFProgramHeaders
2700//
2701// Dump all of the ELF program header to the specified output stream
2702//----------------------------------------------------------------------
2703void
2704ObjectFileELF::DumpELFProgramHeaders(Stream *s)
2705{
Ed Maste3a8ab6e2015-02-23 15:33:11 +00002706 if (!ParseProgramHeaders())
2707 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002708
Ed Maste3a8ab6e2015-02-23 15:33:11 +00002709 s->PutCString("Program Headers\n");
2710 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
2711 "p_filesz p_memsz p_flags p_align\n");
2712 s->PutCString("==== --------------- -------- -------- -------- "
2713 "-------- -------- ------------------------- --------\n");
2714
2715 uint32_t idx = 0;
2716 for (ProgramHeaderCollConstIter I = m_program_headers.begin();
2717 I != m_program_headers.end(); ++I, ++idx)
2718 {
2719 s->Printf("[%2u] ", idx);
2720 ObjectFileELF::DumpELFProgramHeader(s, *I);
2721 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002722 }
2723}
2724
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002725//----------------------------------------------------------------------
2726// DumpELFSectionHeader
2727//
2728// Dump a single ELF section header to the specified output stream
2729//----------------------------------------------------------------------
2730void
Michael Sartaina7499c92013-07-01 19:45:50 +00002731ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002732{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002733 s->Printf("%8.8x ", sh.sh_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002734 DumpELFSectionHeader_sh_type(s, sh.sh_type);
Daniel Malead01b2952012-11-29 21:49:15 +00002735 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002736 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
Daniel Malead01b2952012-11-29 21:49:15 +00002737 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 +00002738 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
Daniel Malead01b2952012-11-29 21:49:15 +00002739 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002740}
2741
2742//----------------------------------------------------------------------
2743// DumpELFSectionHeader_sh_type
2744//
2745// Dump an token value for the ELF section header member sh_type which
2746// describes the type of the section
2747//----------------------------------------------------------------------
2748void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002749ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002750{
2751 const int kStrWidth = 12;
2752 switch (sh_type)
2753 {
2754 CASE_AND_STREAM(s, SHT_NULL , kStrWidth);
2755 CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth);
2756 CASE_AND_STREAM(s, SHT_SYMTAB , kStrWidth);
2757 CASE_AND_STREAM(s, SHT_STRTAB , kStrWidth);
2758 CASE_AND_STREAM(s, SHT_RELA , kStrWidth);
2759 CASE_AND_STREAM(s, SHT_HASH , kStrWidth);
2760 CASE_AND_STREAM(s, SHT_DYNAMIC , kStrWidth);
2761 CASE_AND_STREAM(s, SHT_NOTE , kStrWidth);
2762 CASE_AND_STREAM(s, SHT_NOBITS , kStrWidth);
2763 CASE_AND_STREAM(s, SHT_REL , kStrWidth);
2764 CASE_AND_STREAM(s, SHT_SHLIB , kStrWidth);
2765 CASE_AND_STREAM(s, SHT_DYNSYM , kStrWidth);
2766 CASE_AND_STREAM(s, SHT_LOPROC , kStrWidth);
2767 CASE_AND_STREAM(s, SHT_HIPROC , kStrWidth);
2768 CASE_AND_STREAM(s, SHT_LOUSER , kStrWidth);
2769 CASE_AND_STREAM(s, SHT_HIUSER , kStrWidth);
2770 default:
2771 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
2772 break;
2773 }
2774}
2775
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002776//----------------------------------------------------------------------
2777// DumpELFSectionHeader_sh_flags
2778//
2779// Dump an token value for the ELF section header member sh_flags
2780//----------------------------------------------------------------------
2781void
Greg Claytonc7bece562013-01-25 18:06:21 +00002782ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002783{
2784 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
2785 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
2786 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
2787 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
2788 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
2789}
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002790
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002791//----------------------------------------------------------------------
2792// DumpELFSectionHeaders
2793//
2794// Dump all of the ELF section header to the specified output stream
2795//----------------------------------------------------------------------
2796void
2797ObjectFileELF::DumpELFSectionHeaders(Stream *s)
2798{
Michael Sartaina7499c92013-07-01 19:45:50 +00002799 if (!ParseSectionHeaders())
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002800 return;
2801
2802 s->PutCString("Section Headers\n");
2803 s->PutCString("IDX name type flags "
2804 "addr offset size link info addralgn "
2805 "entsize Name\n");
2806 s->PutCString("==== -------- ------------ -------------------------------- "
2807 "-------- -------- -------- -------- -------- -------- "
2808 "-------- ====================\n");
2809
2810 uint32_t idx = 0;
2811 for (SectionHeaderCollConstIter I = m_section_headers.begin();
2812 I != m_section_headers.end(); ++I, ++idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002813 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002814 s->Printf("[%2u] ", idx);
2815 ObjectFileELF::DumpELFSectionHeader(s, *I);
Michael Sartaina7499c92013-07-01 19:45:50 +00002816 const char* section_name = I->section_name.AsCString("");
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002817 if (section_name)
2818 *s << ' ' << section_name << "\n";
2819 }
2820}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002821
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002822void
2823ObjectFileELF::DumpDependentModules(lldb_private::Stream *s)
2824{
2825 size_t num_modules = ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002826
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002827 if (num_modules > 0)
2828 {
2829 s->PutCString("Dependent Modules:\n");
2830 for (unsigned i = 0; i < num_modules; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002831 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002832 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
2833 s->Printf(" %s\n", spec.GetFilename().GetCString());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002834 }
2835 }
2836}
2837
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002838bool
Greg Clayton514487e2011-02-15 21:59:32 +00002839ObjectFileELF::GetArchitecture (ArchSpec &arch)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002840{
Stephen Wilson3f4200fd2011-02-24 19:16:15 +00002841 if (!ParseHeader())
2842 return false;
2843
Todd Fiala09512ec2014-07-11 15:43:51 +00002844 if (m_section_headers.empty())
2845 {
2846 // Allow elf notes to be parsed which may affect the detected architecture.
2847 ParseSectionHeaders();
2848 }
Todd Fialab91de782014-06-27 16:52:49 +00002849
2850 arch = m_arch_spec;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002851 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002852}
2853
Greg Clayton9e00b6a652011-07-09 00:41:34 +00002854ObjectFile::Type
2855ObjectFileELF::CalculateType()
2856{
2857 switch (m_header.e_type)
2858 {
2859 case llvm::ELF::ET_NONE:
2860 // 0 - No file type
2861 return eTypeUnknown;
2862
2863 case llvm::ELF::ET_REL:
2864 // 1 - Relocatable file
2865 return eTypeObjectFile;
2866
2867 case llvm::ELF::ET_EXEC:
2868 // 2 - Executable file
2869 return eTypeExecutable;
2870
2871 case llvm::ELF::ET_DYN:
2872 // 3 - Shared object file
2873 return eTypeSharedLibrary;
2874
2875 case ET_CORE:
2876 // 4 - Core file
2877 return eTypeCoreFile;
2878
2879 default:
2880 break;
2881 }
2882 return eTypeUnknown;
2883}
2884
2885ObjectFile::Strata
2886ObjectFileELF::CalculateStrata()
2887{
2888 switch (m_header.e_type)
2889 {
2890 case llvm::ELF::ET_NONE:
2891 // 0 - No file type
2892 return eStrataUnknown;
2893
2894 case llvm::ELF::ET_REL:
2895 // 1 - Relocatable file
2896 return eStrataUnknown;
2897
2898 case llvm::ELF::ET_EXEC:
2899 // 2 - Executable file
2900 // TODO: is there any way to detect that an executable is a kernel
2901 // related executable by inspecting the program headers, section
2902 // headers, symbols, or any other flag bits???
2903 return eStrataUser;
2904
2905 case llvm::ELF::ET_DYN:
2906 // 3 - Shared object file
2907 // TODO: is there any way to detect that an shared library is a kernel
2908 // related executable by inspecting the program headers, section
2909 // headers, symbols, or any other flag bits???
2910 return eStrataUnknown;
2911
2912 case ET_CORE:
2913 // 4 - Core file
2914 // TODO: is there any way to detect that an core file is a kernel
2915 // related executable by inspecting the program headers, section
2916 // headers, symbols, or any other flag bits???
2917 return eStrataUnknown;
2918
2919 default:
2920 break;
2921 }
2922 return eStrataUnknown;
2923}
2924