blob: b2119e33f64acd6949dc8332435bdb642332e907 [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"
Greg Clayton64195a22011-02-23 00:35:02 +000030#include "lldb/Host/Host.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031
Stephen Wilson499b40e2011-03-30 16:07:05 +000032#include "llvm/ADT/PointerUnion.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";
49
50// ELF note type definitions
51const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
52const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
53
54const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
55const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
56
57const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
58
59const elf_word LLDB_NT_NETBSD_ABI_TAG = 0x01;
60const elf_word LLDB_NT_NETBSD_ABI_SIZE = 4;
61
62// GNU ABI note OS constants
63const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
64const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
65const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
66
Stephen Wilson499b40e2011-03-30 16:07:05 +000067//===----------------------------------------------------------------------===//
68/// @class ELFRelocation
69/// @brief Generic wrapper for ELFRel and ELFRela.
70///
71/// This helper class allows us to parse both ELFRel and ELFRela relocation
72/// entries in a generic manner.
73class ELFRelocation
74{
75public:
76
77 /// Constructs an ELFRelocation entry with a personality as given by @p
78 /// type.
79 ///
80 /// @param type Either DT_REL or DT_RELA. Any other value is invalid.
81 ELFRelocation(unsigned type);
82
83 ~ELFRelocation();
84
85 bool
Greg Claytonc7bece562013-01-25 18:06:21 +000086 Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +000087
88 static unsigned
89 RelocType32(const ELFRelocation &rel);
90
91 static unsigned
92 RelocType64(const ELFRelocation &rel);
93
94 static unsigned
95 RelocSymbol32(const ELFRelocation &rel);
96
97 static unsigned
98 RelocSymbol64(const ELFRelocation &rel);
99
Andrew MacPherson17220c12014-03-05 10:12:43 +0000100 static unsigned
101 RelocOffset32(const ELFRelocation &rel);
102
103 static unsigned
104 RelocOffset64(const ELFRelocation &rel);
105
106 static unsigned
107 RelocAddend32(const ELFRelocation &rel);
108
109 static unsigned
110 RelocAddend64(const ELFRelocation &rel);
111
Stephen Wilson499b40e2011-03-30 16:07:05 +0000112private:
113 typedef llvm::PointerUnion<ELFRel*, ELFRela*> RelocUnion;
114
115 RelocUnion reloc;
116};
117
118ELFRelocation::ELFRelocation(unsigned type)
119{
Andrew MacPherson17220c12014-03-05 10:12:43 +0000120 if (type == DT_REL || type == SHT_REL)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000121 reloc = new ELFRel();
Andrew MacPherson17220c12014-03-05 10:12:43 +0000122 else if (type == DT_RELA || type == SHT_RELA)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000123 reloc = new ELFRela();
124 else {
125 assert(false && "unexpected relocation type");
126 reloc = static_cast<ELFRel*>(NULL);
127 }
128}
129
130ELFRelocation::~ELFRelocation()
131{
132 if (reloc.is<ELFRel*>())
133 delete reloc.get<ELFRel*>();
134 else
135 delete reloc.get<ELFRela*>();
136}
137
138bool
Greg Claytonc7bece562013-01-25 18:06:21 +0000139ELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000140{
141 if (reloc.is<ELFRel*>())
142 return reloc.get<ELFRel*>()->Parse(data, offset);
143 else
144 return reloc.get<ELFRela*>()->Parse(data, offset);
145}
146
147unsigned
148ELFRelocation::RelocType32(const ELFRelocation &rel)
149{
150 if (rel.reloc.is<ELFRel*>())
151 return ELFRel::RelocType32(*rel.reloc.get<ELFRel*>());
152 else
153 return ELFRela::RelocType32(*rel.reloc.get<ELFRela*>());
154}
155
156unsigned
157ELFRelocation::RelocType64(const ELFRelocation &rel)
158{
159 if (rel.reloc.is<ELFRel*>())
160 return ELFRel::RelocType64(*rel.reloc.get<ELFRel*>());
161 else
162 return ELFRela::RelocType64(*rel.reloc.get<ELFRela*>());
163}
164
165unsigned
166ELFRelocation::RelocSymbol32(const ELFRelocation &rel)
167{
168 if (rel.reloc.is<ELFRel*>())
169 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel*>());
170 else
171 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela*>());
172}
173
174unsigned
175ELFRelocation::RelocSymbol64(const ELFRelocation &rel)
176{
177 if (rel.reloc.is<ELFRel*>())
178 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel*>());
179 else
180 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela*>());
181}
182
Andrew MacPherson17220c12014-03-05 10:12:43 +0000183unsigned
184ELFRelocation::RelocOffset32(const ELFRelocation &rel)
185{
186 if (rel.reloc.is<ELFRel*>())
187 return rel.reloc.get<ELFRel*>()->r_offset;
188 else
189 return rel.reloc.get<ELFRela*>()->r_offset;
190}
191
192unsigned
193ELFRelocation::RelocOffset64(const ELFRelocation &rel)
194{
195 if (rel.reloc.is<ELFRel*>())
196 return rel.reloc.get<ELFRel*>()->r_offset;
197 else
198 return rel.reloc.get<ELFRela*>()->r_offset;
199}
200
201unsigned
202ELFRelocation::RelocAddend32(const ELFRelocation &rel)
203{
204 if (rel.reloc.is<ELFRel*>())
205 return 0;
206 else
207 return rel.reloc.get<ELFRela*>()->r_addend;
208}
209
210unsigned
211ELFRelocation::RelocAddend64(const ELFRelocation &rel)
212{
213 if (rel.reloc.is<ELFRel*>())
214 return 0;
215 else
216 return rel.reloc.get<ELFRela*>()->r_addend;
217}
218
Stephen Wilson499b40e2011-03-30 16:07:05 +0000219} // end anonymous namespace
220
Ed Mastec113ff82013-12-02 17:49:13 +0000221bool
222ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset)
223{
224 // Read all fields.
225 if (data.GetU32(offset, &n_namesz, 3) == NULL)
226 return false;
227
228 // The name field is required to be nul-terminated, and n_namesz
229 // includes the terminating nul in observed implementations (contrary
230 // to the ELF-64 spec). A special case is needed for cores generated
231 // by some older Linux versions, which write a note named "CORE"
232 // without a nul terminator and n_namesz = 4.
233 if (n_namesz == 4)
234 {
235 char buf[4];
236 if (data.ExtractBytes (*offset, 4, data.GetByteOrder(), buf) != 4)
237 return false;
238 if (strncmp (buf, "CORE", 4) == 0)
239 {
240 n_name = "CORE";
241 *offset += 4;
242 return true;
243 }
244 }
245
246 const char *cstr = data.GetCStr(offset, llvm::RoundUpToAlignment (n_namesz, 4));
247 if (cstr == NULL)
248 {
249 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS));
250 if (log)
251 log->Printf("Failed to parse note name lacking nul terminator");
252
253 return false;
254 }
255 n_name = cstr;
256 return true;
257}
258
Todd Fiala4339f3a2014-03-25 19:29:09 +0000259// Arbitrary constant used as UUID prefix for core files.
260const uint32_t
261ObjectFileELF::g_core_uuid_magic(0xE210C);
262
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000263//------------------------------------------------------------------
264// Static methods.
265//------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000266void
267ObjectFileELF::Initialize()
268{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000269 PluginManager::RegisterPlugin(GetPluginNameStatic(),
270 GetPluginDescriptionStatic(),
Greg Claytonc9660542012-02-05 02:38:54 +0000271 CreateInstance,
Greg Claytonf4d6de62013-04-24 22:29:28 +0000272 CreateMemoryInstance,
273 GetModuleSpecifications);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000274}
275
276void
277ObjectFileELF::Terminate()
278{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000279 PluginManager::UnregisterPlugin(CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000280}
281
Greg Clayton57abc5d2013-05-10 21:47:16 +0000282lldb_private::ConstString
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000283ObjectFileELF::GetPluginNameStatic()
284{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000285 static ConstString g_name("elf");
286 return g_name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000287}
288
289const char *
290ObjectFileELF::GetPluginDescriptionStatic()
291{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000292 return "ELF object file reader.";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000293}
294
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000295ObjectFile *
Greg Claytone72dfb32012-02-24 01:59:29 +0000296ObjectFileELF::CreateInstance (const lldb::ModuleSP &module_sp,
297 DataBufferSP &data_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000298 lldb::offset_t data_offset,
299 const lldb_private::FileSpec* file,
300 lldb::offset_t file_offset,
301 lldb::offset_t length)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000302{
Greg Clayton5ce9c562013-02-06 17:22:03 +0000303 if (!data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000304 {
Greg Clayton5ce9c562013-02-06 17:22:03 +0000305 data_sp = file->MemoryMapFileContents(file_offset, length);
306 data_offset = 0;
307 }
308
309 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
310 {
311 const uint8_t *magic = data_sp->GetBytes() + data_offset;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000312 if (ELFHeader::MagicBytesMatch(magic))
313 {
Greg Clayton5ce9c562013-02-06 17:22:03 +0000314 // Update the data to contain the entire file if it doesn't already
Andrew Kaylor213f6722013-02-07 21:30:54 +0000315 if (data_sp->GetByteSize() < length) {
Greg Clayton5ce9c562013-02-06 17:22:03 +0000316 data_sp = file->MemoryMapFileContents(file_offset, length);
Greg Clayton64ff6c72013-02-07 21:49:54 +0000317 data_offset = 0;
318 magic = data_sp->GetBytes();
Andrew Kaylor213f6722013-02-07 21:30:54 +0000319 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000320 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
321 if (address_size == 4 || address_size == 8)
322 {
Greg Clayton7b0992d2013-04-18 22:45:39 +0000323 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 +0000324 ArchSpec spec;
325 if (objfile_ap->GetArchitecture(spec) &&
326 objfile_ap->SetModulesArchitecture(spec))
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000327 return objfile_ap.release();
328 }
329 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000330 }
331 return NULL;
332}
333
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000334
Greg Claytonc9660542012-02-05 02:38:54 +0000335ObjectFile*
Greg Claytone72dfb32012-02-24 01:59:29 +0000336ObjectFileELF::CreateMemoryInstance (const lldb::ModuleSP &module_sp,
337 DataBufferSP& data_sp,
338 const lldb::ProcessSP &process_sp,
339 lldb::addr_t header_addr)
Greg Claytonc9660542012-02-05 02:38:54 +0000340{
Andrew MacPherson17220c12014-03-05 10:12:43 +0000341 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT))
342 {
343 const uint8_t *magic = data_sp->GetBytes();
344 if (ELFHeader::MagicBytesMatch(magic))
345 {
346 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
347 if (address_size == 4 || address_size == 8)
348 {
349 std::auto_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
350 ArchSpec spec;
351 if (objfile_ap->GetArchitecture(spec) &&
352 objfile_ap->SetModulesArchitecture(spec))
353 return objfile_ap.release();
354 }
355 }
356 }
Greg Claytonc9660542012-02-05 02:38:54 +0000357 return NULL;
358}
359
Michael Sartain9f0013d2013-05-17 00:20:21 +0000360bool
361ObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp,
362 lldb::addr_t data_offset,
363 lldb::addr_t data_length)
364{
365 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset))
366 {
367 const uint8_t *magic = data_sp->GetBytes() + data_offset;
368 return ELFHeader::MagicBytesMatch(magic);
369 }
370 return false;
371}
Greg Claytonc9660542012-02-05 02:38:54 +0000372
Michael Sartain9f4517a2013-07-03 01:52:14 +0000373/*
374 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
375 *
376 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
377 * code or tables extracted from it, as desired without restriction.
378 */
379static uint32_t
Todd Fiala4339f3a2014-03-25 19:29:09 +0000380calc_crc32(uint32_t crc, const void *buf, size_t size)
Michael Sartain9f4517a2013-07-03 01:52:14 +0000381{
382 static const uint32_t g_crc32_tab[] =
383 {
384 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
385 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
386 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
387 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
388 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
389 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
390 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
391 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
392 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
393 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
394 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
395 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
396 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
397 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
398 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
399 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
400 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
401 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
402 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
403 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
404 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
405 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
406 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
407 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
408 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
409 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
410 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
411 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
412 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
413 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
414 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
415 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
416 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
417 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
418 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
419 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
420 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
421 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
422 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
423 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
424 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
425 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
426 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
427 };
428 const uint8_t *p = (const uint8_t *)buf;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000429
Todd Fiala4339f3a2014-03-25 19:29:09 +0000430 crc = crc ^ ~0U;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000431 while (size--)
432 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
433 return crc ^ ~0U;
434}
435
Todd Fiala4339f3a2014-03-25 19:29:09 +0000436static uint32_t
437calc_gnu_debuglink_crc32(const void *buf, size_t size)
438{
439 return calc_crc32(0U, buf, size);
440}
441
442uint32_t
443ObjectFileELF::CalculateELFNotesSegmentsCRC32 (const ProgramHeaderColl& program_headers,
444 DataExtractor& object_data)
445{
446 typedef ProgramHeaderCollConstIter Iter;
447
448 uint32_t core_notes_crc = 0;
449
450 for (Iter I = program_headers.begin(); I != program_headers.end(); ++I)
451 {
452 if (I->p_type == llvm::ELF::PT_NOTE)
453 {
454 const elf_off ph_offset = I->p_offset;
455 const size_t ph_size = I->p_filesz;
456
457 DataExtractor segment_data;
458 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size)
459 {
460 // The ELF program header contained incorrect data,
461 // prabably corefile is incomplete or corrupted.
462 break;
463 }
464
465 core_notes_crc = calc_crc32(core_notes_crc,
466 segment_data.GetDataStart(),
467 segment_data.GetByteSize());
468 }
469 }
470
471 return core_notes_crc;
472}
473
Todd Fialab91de782014-06-27 16:52:49 +0000474static const char*
475OSABIAsCString (unsigned char osabi_byte)
476{
477#define _MAKE_OSABI_CASE(x) case x: return #x
478 switch (osabi_byte)
479 {
480 _MAKE_OSABI_CASE(ELFOSABI_NONE);
481 _MAKE_OSABI_CASE(ELFOSABI_HPUX);
482 _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
483 _MAKE_OSABI_CASE(ELFOSABI_GNU);
484 _MAKE_OSABI_CASE(ELFOSABI_HURD);
485 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
486 _MAKE_OSABI_CASE(ELFOSABI_AIX);
487 _MAKE_OSABI_CASE(ELFOSABI_IRIX);
488 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
489 _MAKE_OSABI_CASE(ELFOSABI_TRU64);
490 _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
491 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
492 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
493 _MAKE_OSABI_CASE(ELFOSABI_NSK);
494 _MAKE_OSABI_CASE(ELFOSABI_AROS);
495 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
496 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
497 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
498 _MAKE_OSABI_CASE(ELFOSABI_ARM);
499 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
500 default:
501 return "<unknown-osabi>";
502 }
503#undef _MAKE_OSABI_CASE
504}
505
506static bool
507GetOsFromOSABI (unsigned char osabi_byte, llvm::Triple::OSType &ostype)
508{
509 switch (osabi_byte)
510 {
511 case ELFOSABI_AIX: ostype = llvm::Triple::OSType::AIX; break;
512 case ELFOSABI_FREEBSD: ostype = llvm::Triple::OSType::FreeBSD; break;
513 case ELFOSABI_GNU: ostype = llvm::Triple::OSType::Linux; break;
514 case ELFOSABI_NETBSD: ostype = llvm::Triple::OSType::NetBSD; break;
515 case ELFOSABI_OPENBSD: ostype = llvm::Triple::OSType::OpenBSD; break;
516 case ELFOSABI_SOLARIS: ostype = llvm::Triple::OSType::Solaris; break;
517 default:
518 ostype = llvm::Triple::OSType::UnknownOS;
519 }
520 return ostype != llvm::Triple::OSType::UnknownOS;
521}
522
Greg Claytonf4d6de62013-04-24 22:29:28 +0000523size_t
524ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec& file,
525 lldb::DataBufferSP& data_sp,
526 lldb::offset_t data_offset,
527 lldb::offset_t file_offset,
528 lldb::offset_t length,
529 lldb_private::ModuleSpecList &specs)
530{
Todd Fialab91de782014-06-27 16:52:49 +0000531 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
532
Michael Sartain9f0013d2013-05-17 00:20:21 +0000533 const size_t initial_count = specs.GetSize();
Michael Sartainc836ae72013-05-23 20:57:03 +0000534
Michael Sartain9f0013d2013-05-17 00:20:21 +0000535 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize()))
536 {
537 DataExtractor data;
538 data.SetData(data_sp);
539 elf::ELFHeader header;
540 if (header.Parse(data, &data_offset))
541 {
542 if (data_sp)
543 {
544 ModuleSpec spec;
545 spec.GetFileSpec() = file;
546 spec.GetArchitecture().SetArchitecture(eArchTypeELF,
547 header.e_machine,
548 LLDB_INVALID_CPUTYPE);
549 if (spec.GetArchitecture().IsValid())
550 {
Todd Fialab91de782014-06-27 16:52:49 +0000551 llvm::Triple::OSType ostype;
552 // First try to determine the OS type from the OSABI field in the elf header.
553
554 if (log)
555 log->Printf ("ObjectFileELF::%s file '%s' module OSABI: %s", __FUNCTION__, file.GetPath ().c_str (), OSABIAsCString (header.e_ident[EI_OSABI]));
556 if (GetOsFromOSABI (header.e_ident[EI_OSABI], ostype) && ostype != llvm::Triple::OSType::UnknownOS)
557 {
558 spec.GetArchitecture ().GetTriple ().setOS (ostype);
559
560 // Also clear the vendor so we don't end up with situations like
561 // x86_64-apple-FreeBSD.
562 spec.GetArchitecture ().GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
563
564 if (log)
565 log->Printf ("ObjectFileELF::%s file '%s' set ELF module OS type from ELF header OSABI.", __FUNCTION__, file.GetPath ().c_str ());
566 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000567
568 // Try to get the UUID from the section list. Usually that's at the end, so
569 // map the file in if we don't have it already.
570 size_t section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize;
571 if (section_header_end > data_sp->GetByteSize())
572 {
573 data_sp = file.MemoryMapFileContents (file_offset, section_header_end);
574 data.SetData(data_sp);
575 }
576
Michael Sartain9f4517a2013-07-03 01:52:14 +0000577 uint32_t gnu_debuglink_crc = 0;
Michael Sartaina7499c92013-07-01 19:45:50 +0000578 std::string gnu_debuglink_file;
579 SectionHeaderColl section_headers;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000580 lldb_private::UUID &uuid = spec.GetUUID();
Michael Sartain9f4517a2013-07-03 01:52:14 +0000581
Todd Fialab91de782014-06-27 16:52:49 +0000582 GetSectionHeaderInfo(section_headers, data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc, spec.GetArchitecture ());
583
584 // If the module vendor is not set and the module OS matches this host OS, set the module vendor to the host vendor.
585 llvm::Triple &spec_triple = spec.GetArchitecture ().GetTriple ();
586 if (spec_triple.getVendor () == llvm::Triple::VendorType::UnknownVendor)
587 {
588 const llvm::Triple &host_triple = Host::GetArchitecture ().GetTriple ();
589 if (spec_triple.getOS () == host_triple.getOS ())
590 spec_triple.setVendor (host_triple.getVendor ());
591 }
592
593 if (log)
594 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 +0000595
Michael Sartain9f4517a2013-07-03 01:52:14 +0000596 if (!uuid.IsValid())
597 {
Todd Fiala4339f3a2014-03-25 19:29:09 +0000598 uint32_t core_notes_crc = 0;
599
Michael Sartain9f4517a2013-07-03 01:52:14 +0000600 if (!gnu_debuglink_crc)
601 {
Todd Fiala4339f3a2014-03-25 19:29:09 +0000602 lldb_private::Timer scoped_timer (__PRETTY_FUNCTION__,
603 "Calculating module crc32 %s with size %" PRIu64 " KiB",
604 file.GetLastPathComponent().AsCString(),
605 (file.GetByteSize()-file_offset)/1024);
606
607 // For core files - which usually don't happen to have a gnu_debuglink,
608 // and are pretty bulky - calulating whole contents crc32 would be too much of luxury.
609 // Thus we will need to fallback to something simpler.
610 if (header.e_type == llvm::ELF::ET_CORE)
611 {
612 size_t program_headers_end = header.e_phoff + header.e_phnum * header.e_phentsize;
613 if (program_headers_end > data_sp->GetByteSize())
614 {
615 data_sp = file.MemoryMapFileContents(file_offset, program_headers_end);
616 data.SetData(data_sp);
617 }
618 ProgramHeaderColl program_headers;
619 GetProgramHeaderInfo(program_headers, data, header);
620
621 size_t segment_data_end = 0;
622 for (ProgramHeaderCollConstIter I = program_headers.begin();
623 I != program_headers.end(); ++I)
624 {
Enrico Granataafcbdb12014-03-25 20:53:33 +0000625 segment_data_end = std::max<unsigned long long> (I->p_offset + I->p_filesz, segment_data_end);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000626 }
627
628 if (segment_data_end > data_sp->GetByteSize())
629 {
630 data_sp = file.MemoryMapFileContents(file_offset, segment_data_end);
631 data.SetData(data_sp);
632 }
633
634 core_notes_crc = CalculateELFNotesSegmentsCRC32 (program_headers, data);
635 }
636 else
637 {
638 // Need to map entire file into memory to calculate the crc.
639 data_sp = file.MemoryMapFileContents (file_offset, SIZE_MAX);
640 data.SetData(data_sp);
641 gnu_debuglink_crc = calc_gnu_debuglink_crc32 (data.GetDataStart(), data.GetByteSize());
642 }
Michael Sartain9f4517a2013-07-03 01:52:14 +0000643 }
644 if (gnu_debuglink_crc)
645 {
646 // Use 4 bytes of crc from the .gnu_debuglink section.
647 uint32_t uuidt[4] = { gnu_debuglink_crc, 0, 0, 0 };
648 uuid.SetBytes (uuidt, sizeof(uuidt));
649 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000650 else if (core_notes_crc)
651 {
652 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it look different form
653 // .gnu_debuglink crc followed by 4 bytes of note segments crc.
654 uint32_t uuidt[4] = { g_core_uuid_magic, core_notes_crc, 0, 0 };
655 uuid.SetBytes (uuidt, sizeof(uuidt));
656 }
Michael Sartain9f4517a2013-07-03 01:52:14 +0000657 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000658
Michael Sartain9f0013d2013-05-17 00:20:21 +0000659 specs.Append(spec);
660 }
661 }
662 }
663 }
Michael Sartainc836ae72013-05-23 20:57:03 +0000664
Michael Sartain9f0013d2013-05-17 00:20:21 +0000665 return specs.GetSize() - initial_count;
Greg Claytonf4d6de62013-04-24 22:29:28 +0000666}
667
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000668//------------------------------------------------------------------
669// PluginInterface protocol
670//------------------------------------------------------------------
Greg Clayton57abc5d2013-05-10 21:47:16 +0000671lldb_private::ConstString
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000672ObjectFileELF::GetPluginName()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000673{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000674 return GetPluginNameStatic();
675}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000676
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000677uint32_t
678ObjectFileELF::GetPluginVersion()
679{
680 return m_plugin_version;
681}
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000682//------------------------------------------------------------------
683// ObjectFile protocol
684//------------------------------------------------------------------
685
Greg Claytone72dfb32012-02-24 01:59:29 +0000686ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000687 DataBufferSP& data_sp,
688 lldb::offset_t data_offset,
Greg Claytone72dfb32012-02-24 01:59:29 +0000689 const FileSpec* file,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000690 lldb::offset_t file_offset,
691 lldb::offset_t length) :
692 ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
Greg Claytone72dfb32012-02-24 01:59:29 +0000693 m_header(),
Todd Fialab91de782014-06-27 16:52:49 +0000694 m_uuid(),
695 m_gnu_debuglink_file(),
696 m_gnu_debuglink_crc(0),
Greg Claytone72dfb32012-02-24 01:59:29 +0000697 m_program_headers(),
698 m_section_headers(),
Todd Fialab91de782014-06-27 16:52:49 +0000699 m_dynamic_symbols(),
700 m_filespec_ap(),
701 m_entry_point_address(),
702 m_arch_spec()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000703{
704 if (file)
705 m_file = *file;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000706 ::memset(&m_header, 0, sizeof(m_header));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000707}
708
Andrew MacPherson17220c12014-03-05 10:12:43 +0000709ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp,
710 DataBufferSP& data_sp,
711 const lldb::ProcessSP &process_sp,
712 addr_t header_addr) :
713 ObjectFile(module_sp, process_sp, LLDB_INVALID_ADDRESS, data_sp),
714 m_header(),
Todd Fialab91de782014-06-27 16:52:49 +0000715 m_uuid(),
716 m_gnu_debuglink_file(),
717 m_gnu_debuglink_crc(0),
Andrew MacPherson17220c12014-03-05 10:12:43 +0000718 m_program_headers(),
719 m_section_headers(),
Todd Fialab91de782014-06-27 16:52:49 +0000720 m_dynamic_symbols(),
721 m_filespec_ap(),
722 m_entry_point_address(),
723 m_arch_spec()
Andrew MacPherson17220c12014-03-05 10:12:43 +0000724{
725 ::memset(&m_header, 0, sizeof(m_header));
726}
727
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000728ObjectFileELF::~ObjectFileELF()
729{
730}
731
Jim Ingham5aee1622010-08-09 23:31:02 +0000732bool
733ObjectFileELF::IsExecutable() const
734{
Stephen Wilson7f3b57c2011-01-15 00:09:50 +0000735 return m_header.e_entry != 0;
Jim Ingham5aee1622010-08-09 23:31:02 +0000736}
737
Steve Pucci9e02dac2014-02-06 19:02:19 +0000738bool
Greg Clayton751caf62014-02-07 22:54:47 +0000739ObjectFileELF::SetLoadAddress (Target &target,
740 lldb::addr_t value,
741 bool value_is_offset)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000742{
Steve Pucci9e02dac2014-02-06 19:02:19 +0000743 ModuleSP module_sp = GetModule();
744 if (module_sp)
745 {
746 size_t num_loaded_sections = 0;
747 SectionList *section_list = GetSectionList ();
748 if (section_list)
749 {
Greg Clayton751caf62014-02-07 22:54:47 +0000750 if (value_is_offset)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000751 {
Greg Clayton751caf62014-02-07 22:54:47 +0000752 const size_t num_sections = section_list->GetSize();
753 size_t sect_idx = 0;
Sylvestre Ledruf561a012014-02-21 18:08:09 +0000754
Greg Clayton751caf62014-02-07 22:54:47 +0000755 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
Steve Pucci9e02dac2014-02-06 19:02:19 +0000756 {
Greg Clayton751caf62014-02-07 22:54:47 +0000757 // Iterate through the object file sections to find all
758 // of the sections that have SHF_ALLOC in their flag bits.
759 SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
760 // if (section_sp && !section_sp->IsThreadSpecific())
761 if (section_sp && section_sp->Test(SHF_ALLOC))
762 {
763 if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + value))
764 ++num_loaded_sections;
765 }
Steve Pucci9e02dac2014-02-06 19:02:19 +0000766 }
Greg Clayton751caf62014-02-07 22:54:47 +0000767 return num_loaded_sections > 0;
768 }
769 else
770 {
771 // Not sure how to slide an ELF file given the base address
772 // of the ELF file in memory
Steve Pucci9e02dac2014-02-06 19:02:19 +0000773 }
774 }
Steve Pucci9e02dac2014-02-06 19:02:19 +0000775 }
Sylvestre Ledruf561a012014-02-21 18:08:09 +0000776 return false; // If it changed
Steve Pucci9e02dac2014-02-06 19:02:19 +0000777}
778
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000779ByteOrder
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000780ObjectFileELF::GetByteOrder() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000781{
782 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
783 return eByteOrderBig;
784 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
785 return eByteOrderLittle;
786 return eByteOrderInvalid;
787}
788
Greg Claytonc7bece562013-01-25 18:06:21 +0000789uint32_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000790ObjectFileELF::GetAddressByteSize() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000791{
792 return m_data.GetAddressByteSize();
793}
794
Greg Claytonc7bece562013-01-25 18:06:21 +0000795size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000796ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000797{
Greg Claytonc7bece562013-01-25 18:06:21 +0000798 return std::distance(m_section_headers.begin(), I) + 1u;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000799}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000800
Greg Claytonc7bece562013-01-25 18:06:21 +0000801size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000802ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const
803{
Greg Claytonc7bece562013-01-25 18:06:21 +0000804 return std::distance(m_section_headers.begin(), I) + 1u;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000805}
806
807bool
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000808ObjectFileELF::ParseHeader()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000809{
Filipe Cabecinhas22b40f72013-05-16 23:29:36 +0000810 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000811 return m_header.Parse(m_data, &offset);
812}
813
814bool
Greg Clayton60830262011-02-04 18:53:10 +0000815ObjectFileELF::GetUUID(lldb_private::UUID* uuid)
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000816{
Michael Sartaina7499c92013-07-01 19:45:50 +0000817 // Need to parse the section list to get the UUIDs, so make sure that's been done.
Todd Fiala4339f3a2014-03-25 19:29:09 +0000818 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
Michael Sartaina7499c92013-07-01 19:45:50 +0000819 return false;
820
Michael Sartainc836ae72013-05-23 20:57:03 +0000821 if (m_uuid.IsValid())
822 {
Michael Sartaina7499c92013-07-01 19:45:50 +0000823 // We have the full build id uuid.
Michael Sartainc836ae72013-05-23 20:57:03 +0000824 *uuid = m_uuid;
825 return true;
826 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000827 else if (GetType() == ObjectFile::eTypeCoreFile)
828 {
829 uint32_t core_notes_crc = 0;
830
831 if (!ParseProgramHeaders())
832 return false;
833
834 core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
835
836 if (core_notes_crc)
837 {
838 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
839 // look different form .gnu_debuglink crc - followed by 4 bytes of note
840 // segments crc.
841 uint32_t uuidt[4] = { g_core_uuid_magic, core_notes_crc, 0, 0 };
842 m_uuid.SetBytes (uuidt, sizeof(uuidt));
843 }
844 }
845 else
Michael Sartaina7499c92013-07-01 19:45:50 +0000846 {
Michael Sartain9f4517a2013-07-03 01:52:14 +0000847 if (!m_gnu_debuglink_crc)
848 m_gnu_debuglink_crc = calc_gnu_debuglink_crc32 (m_data.GetDataStart(), m_data.GetByteSize());
Michael Sartaina7499c92013-07-01 19:45:50 +0000849 if (m_gnu_debuglink_crc)
850 {
851 // Use 4 bytes of crc from the .gnu_debuglink section.
852 uint32_t uuidt[4] = { m_gnu_debuglink_crc, 0, 0, 0 };
Todd Fiala4339f3a2014-03-25 19:29:09 +0000853 m_uuid.SetBytes (uuidt, sizeof(uuidt));
Michael Sartaina7499c92013-07-01 19:45:50 +0000854 }
855 }
856
Todd Fiala4339f3a2014-03-25 19:29:09 +0000857 if (m_uuid.IsValid())
858 {
859 *uuid = m_uuid;
860 return true;
861 }
862
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000863 return false;
864}
865
Michael Sartaina7499c92013-07-01 19:45:50 +0000866lldb_private::FileSpecList
867ObjectFileELF::GetDebugSymbolFilePaths()
868{
869 FileSpecList file_spec_list;
870
871 if (!m_gnu_debuglink_file.empty())
872 {
873 FileSpec file_spec (m_gnu_debuglink_file.c_str(), false);
874 file_spec_list.Append (file_spec);
875 }
876 return file_spec_list;
877}
878
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000879uint32_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000880ObjectFileELF::GetDependentModules(FileSpecList &files)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000881{
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000882 size_t num_modules = ParseDependentModules();
883 uint32_t num_specs = 0;
884
885 for (unsigned i = 0; i < num_modules; ++i)
886 {
887 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i)))
888 num_specs++;
889 }
890
891 return num_specs;
892}
893
Stephen Wilson499b40e2011-03-30 16:07:05 +0000894Address
Ed Maste54803652013-10-11 17:39:07 +0000895ObjectFileELF::GetImageInfoAddress(Target *target)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000896{
897 if (!ParseDynamicSymbols())
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000898 return Address();
899
900 SectionList *section_list = GetSectionList();
901 if (!section_list)
902 return Address();
903
Greg Clayton3046e662013-07-10 01:23:25 +0000904 // Find the SHT_DYNAMIC (.dynamic) section.
905 SectionSP dynsym_section_sp (section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true));
906 if (!dynsym_section_sp)
Stephen Wilson499b40e2011-03-30 16:07:05 +0000907 return Address();
Greg Clayton3046e662013-07-10 01:23:25 +0000908 assert (dynsym_section_sp->GetObjectFile() == this);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000909
Greg Clayton3046e662013-07-10 01:23:25 +0000910 user_id_t dynsym_id = dynsym_section_sp->GetID();
Michael Sartaina7499c92013-07-01 19:45:50 +0000911 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000912 if (!dynsym_hdr)
913 return Address();
914
Greg Clayton3046e662013-07-10 01:23:25 +0000915 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i)
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000916 {
Greg Clayton3046e662013-07-10 01:23:25 +0000917 ELFDynamic &symbol = m_dynamic_symbols[i];
Greg Claytone72dfb32012-02-24 01:59:29 +0000918
Ed Maste54803652013-10-11 17:39:07 +0000919 if (symbol.d_tag == DT_DEBUG)
Greg Clayton3046e662013-07-10 01:23:25 +0000920 {
921 // Compute the offset as the number of previous entries plus the
922 // size of d_tag.
923 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
924 return Address(dynsym_section_sp, offset);
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000925 }
Ed Maste54803652013-10-11 17:39:07 +0000926 else if (symbol.d_tag == DT_MIPS_RLD_MAP && target)
927 {
928 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
929 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
930 if (dyn_base == LLDB_INVALID_ADDRESS)
931 return Address();
932 Address addr;
933 Error error;
934 if (target->ReadPointerFromMemory(dyn_base + offset, false, error, addr))
935 return addr;
936 }
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000937 }
938
939 return Address();
940}
941
Jim Ingham672e6f52011-03-07 23:44:08 +0000942lldb_private::Address
943ObjectFileELF::GetEntryPointAddress ()
944{
Stephen Wilsond126c8c2011-03-08 04:12:15 +0000945 if (m_entry_point_address.IsValid())
946 return m_entry_point_address;
947
948 if (!ParseHeader() || !IsExecutable())
949 return m_entry_point_address;
950
Greg Clayton3046e662013-07-10 01:23:25 +0000951 SectionList *section_list = GetSectionList();
952 addr_t offset = m_header.e_entry;
Stephen Wilsond126c8c2011-03-08 04:12:15 +0000953
Greg Clayton3046e662013-07-10 01:23:25 +0000954 if (!section_list)
Stephen Wilsond126c8c2011-03-08 04:12:15 +0000955 m_entry_point_address.SetOffset(offset);
Greg Clayton3046e662013-07-10 01:23:25 +0000956 else
957 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
Stephen Wilsond126c8c2011-03-08 04:12:15 +0000958 return m_entry_point_address;
Jim Ingham672e6f52011-03-07 23:44:08 +0000959}
960
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000961//----------------------------------------------------------------------
962// ParseDependentModules
963//----------------------------------------------------------------------
964size_t
965ObjectFileELF::ParseDependentModules()
966{
967 if (m_filespec_ap.get())
968 return m_filespec_ap->GetSize();
969
970 m_filespec_ap.reset(new FileSpecList());
971
Michael Sartaina7499c92013-07-01 19:45:50 +0000972 if (!ParseSectionHeaders())
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000973 return 0;
974
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000975 SectionList *section_list = GetSectionList();
976 if (!section_list)
977 return 0;
978
Greg Clayton3046e662013-07-10 01:23:25 +0000979 // Find the SHT_DYNAMIC section.
980 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
981 if (!dynsym)
982 return 0;
983 assert (dynsym->GetObjectFile() == this);
984
985 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex (dynsym->GetID());
986 if (!header)
987 return 0;
988 // sh_link: section header index of string table used by entries in the section.
989 Section *dynstr = section_list->FindSectionByID (header->sh_link + 1).get();
990 if (!dynstr)
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000991 return 0;
992
993 DataExtractor dynsym_data;
994 DataExtractor dynstr_data;
Greg Claytonc9660542012-02-05 02:38:54 +0000995 if (ReadSectionData(dynsym, dynsym_data) &&
996 ReadSectionData(dynstr, dynstr_data))
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000997 {
998 ELFDynamic symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +0000999 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1000 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001001
1002 // The only type of entries we are concerned with are tagged DT_NEEDED,
1003 // yielding the name of a required library.
1004 while (offset < section_size)
1005 {
1006 if (!symbol.Parse(dynsym_data, &offset))
1007 break;
1008
1009 if (symbol.d_tag != DT_NEEDED)
1010 continue;
1011
1012 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1013 const char *lib_name = dynstr_data.PeekCStr(str_index);
Greg Clayton274060b2010-10-20 20:54:39 +00001014 m_filespec_ap->Append(FileSpec(lib_name, true));
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001015 }
1016 }
1017
1018 return m_filespec_ap->GetSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001019}
1020
1021//----------------------------------------------------------------------
Todd Fiala4339f3a2014-03-25 19:29:09 +00001022// GetProgramHeaderInfo
1023//----------------------------------------------------------------------
1024size_t
1025ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
1026 DataExtractor &object_data,
1027 const ELFHeader &header)
1028{
1029 // We have already parsed the program headers
1030 if (!program_headers.empty())
1031 return program_headers.size();
1032
1033 // If there are no program headers to read we are done.
1034 if (header.e_phnum == 0)
1035 return 0;
1036
1037 program_headers.resize(header.e_phnum);
1038 if (program_headers.size() != header.e_phnum)
1039 return 0;
1040
1041 const size_t ph_size = header.e_phnum * header.e_phentsize;
1042 const elf_off ph_offset = header.e_phoff;
1043 DataExtractor data;
1044 if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
1045 return 0;
1046
1047 uint32_t idx;
1048 lldb::offset_t offset;
1049 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx)
1050 {
1051 if (program_headers[idx].Parse(data, &offset) == false)
1052 break;
1053 }
1054
1055 if (idx < program_headers.size())
1056 program_headers.resize(idx);
1057
1058 return program_headers.size();
1059
1060}
1061
1062//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001063// ParseProgramHeaders
1064//----------------------------------------------------------------------
1065size_t
1066ObjectFileELF::ParseProgramHeaders()
1067{
Todd Fiala4339f3a2014-03-25 19:29:09 +00001068 return GetProgramHeaderInfo(m_program_headers, m_data, m_header);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001069}
1070
Todd Fialab91de782014-06-27 16:52:49 +00001071lldb_private::Error
1072ObjectFileELF::RefineModuleDetailsFromNote (lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch_spec, lldb_private::UUID &uuid)
Michael Sartainc836ae72013-05-23 20:57:03 +00001073{
Todd Fialab91de782014-06-27 16:52:49 +00001074 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1075 Error error;
1076
Michael Sartainc836ae72013-05-23 20:57:03 +00001077 lldb::offset_t offset = 0;
Michael Sartainc836ae72013-05-23 20:57:03 +00001078
1079 while (true)
1080 {
Todd Fialab91de782014-06-27 16:52:49 +00001081 // Parse the note header. If this fails, bail out.
Ed Mastec113ff82013-12-02 17:49:13 +00001082 ELFNote note = ELFNote();
1083 if (!note.Parse(data, &offset))
Michael Sartainc836ae72013-05-23 20:57:03 +00001084 {
Todd Fialab91de782014-06-27 16:52:49 +00001085 // We're done.
1086 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001087 }
Todd Fialab91de782014-06-27 16:52:49 +00001088
1089 // If a tag processor handles the tag, it should set processed to true, and
1090 // the loop will assume the tag processing has moved entirely past the note's payload.
1091 // Otherwise, leave it false and the end of the loop will handle the offset properly.
1092 bool processed = false;
1093
1094 if (log)
1095 log->Printf ("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32, __FUNCTION__, note.n_name.c_str (), note.n_type);
1096
1097 // Process FreeBSD ELF notes.
1098 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1099 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1100 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE))
1101 {
1102 // We'll consume the payload below.
1103 processed = true;
1104
1105 // Pull out the min version info.
1106 uint32_t version_info;
1107 if (data.GetU32 (&offset, &version_info, 1) == nullptr)
1108 {
1109 error.SetErrorString ("failed to read FreeBSD ABI note payload");
1110 return error;
1111 }
1112
1113 // Convert the version info into a major/minor number.
1114 const uint32_t version_major = version_info / 100000;
1115 const uint32_t version_minor = (version_info / 1000) % 100;
1116
1117 char os_name[32];
1118 snprintf (os_name, sizeof (os_name), "freebsd%" PRIu32 ".%" PRIu32, version_major, version_minor);
1119
1120 // Set the elf OS version to FreeBSD. Also clear the vendor.
1121 arch_spec.GetTriple ().setOSName (os_name);
1122 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1123
1124 if (log)
1125 log->Printf ("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_major, version_minor, static_cast<uint32_t> (version_info % 1000));
1126 }
1127 // Process GNU ELF notes.
1128 else if (note.n_name == LLDB_NT_OWNER_GNU)
1129 {
1130 switch (note.n_type)
1131 {
1132 case LLDB_NT_GNU_ABI_TAG:
1133 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE)
1134 {
1135 // We'll consume the payload below.
1136 processed = true;
1137
1138 // Pull out the min OS version supporting the ABI.
1139 uint32_t version_info[4];
1140 if (data.GetU32 (&offset, &version_info[0], note.n_descsz / 4) == nullptr)
1141 {
1142 error.SetErrorString ("failed to read GNU ABI note payload");
1143 return error;
1144 }
1145
1146 // Set the OS per the OS field.
1147 switch (version_info[0])
1148 {
1149 case LLDB_NT_GNU_ABI_OS_LINUX:
1150 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::Linux);
1151 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1152 if (log)
1153 log->Printf ("ObjectFileELF::%s detected Linux, min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1154 // 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.
1155 break;
1156 case LLDB_NT_GNU_ABI_OS_HURD:
1157 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::UnknownOS);
1158 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1159 if (log)
1160 log->Printf ("ObjectFileELF::%s detected Hurd (unsupported), min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1161 break;
1162 case LLDB_NT_GNU_ABI_OS_SOLARIS:
1163 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::Solaris);
1164 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1165 if (log)
1166 log->Printf ("ObjectFileELF::%s detected Solaris, min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, __FUNCTION__, version_info[1], version_info[2], version_info[3]);
1167 break;
1168 default:
1169 if (log)
1170 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]);
1171 break;
1172 }
1173 }
1174 break;
1175
1176 case LLDB_NT_GNU_BUILD_ID_TAG:
1177 // Only bother processing this if we don't already have the uuid set.
1178 if (!uuid.IsValid())
1179 {
1180 // We'll consume the payload below.
1181 processed = true;
1182
1183 // 16 bytes is UUID|MD5, 20 bytes is SHA1
1184 if ((note.n_descsz == 16 || note.n_descsz == 20))
1185 {
1186 uint8_t uuidbuf[20];
1187 if (data.GetU8 (&offset, &uuidbuf, note.n_descsz) == nullptr)
1188 {
1189 error.SetErrorString ("failed to read GNU_BUILD_ID note payload");
1190 return error;
1191 }
1192
1193 // Save the build id as the UUID for the module.
1194 uuid.SetBytes (uuidbuf, note.n_descsz);
1195 }
1196 }
1197 break;
1198 }
1199 }
1200 // Process NetBSD ELF notes.
1201 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
1202 (note.n_type == LLDB_NT_NETBSD_ABI_TAG) &&
1203 (note.n_descsz == LLDB_NT_NETBSD_ABI_SIZE))
1204 {
1205
1206 // We'll consume the payload below.
1207 processed = true;
1208
1209 // Pull out the min version info.
1210 uint32_t version_info;
1211 if (data.GetU32 (&offset, &version_info, 1) == nullptr)
1212 {
1213 error.SetErrorString ("failed to read NetBSD ABI note payload");
1214 return error;
1215 }
1216
1217 // Set the elf OS version to NetBSD. Also clear the vendor.
1218 arch_spec.GetTriple ().setOS (llvm::Triple::OSType::NetBSD);
1219 arch_spec.GetTriple ().setVendor (llvm::Triple::VendorType::UnknownVendor);
1220
1221 if (log)
1222 log->Printf ("ObjectFileELF::%s detected NetBSD, min version constant %" PRIu32, __FUNCTION__, version_info);
1223 }
1224
1225 if (!processed)
1226 offset += llvm::RoundUpToAlignment(note.n_descsz, 4);
Michael Sartainc836ae72013-05-23 20:57:03 +00001227 }
Todd Fialab91de782014-06-27 16:52:49 +00001228
1229 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001230}
Michael Sartaina7499c92013-07-01 19:45:50 +00001231
Todd Fialab91de782014-06-27 16:52:49 +00001232
Michael Sartaina7499c92013-07-01 19:45:50 +00001233//----------------------------------------------------------------------
1234// GetSectionHeaderInfo
1235//----------------------------------------------------------------------
1236size_t
1237ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
1238 lldb_private::DataExtractor &object_data,
1239 const elf::ELFHeader &header,
1240 lldb_private::UUID &uuid,
1241 std::string &gnu_debuglink_file,
Todd Fialab91de782014-06-27 16:52:49 +00001242 uint32_t &gnu_debuglink_crc,
1243 ArchSpec &arch_spec)
Michael Sartaina7499c92013-07-01 19:45:50 +00001244{
Todd Fialab91de782014-06-27 16:52:49 +00001245 // Only intialize the arch_spec to okay defaults if they're not already set.
1246 // We'll refine this with note data as we parse the notes.
1247 if (arch_spec.GetTriple ().getOS () == llvm::Triple::OSType::UnknownOS)
1248 {
1249 arch_spec.SetArchitecture (eArchTypeELF, header.e_machine, LLDB_INVALID_CPUTYPE);
1250 arch_spec.GetTriple().setOSName (Host::GetOSString().GetCString());
1251 arch_spec.GetTriple().setVendorName(Host::GetVendorString().GetCString());
1252 }
1253
Michael Sartaina7499c92013-07-01 19:45:50 +00001254 // We have already parsed the section headers
1255 if (!section_headers.empty())
1256 return section_headers.size();
1257
1258 // If there are no section headers we are done.
1259 if (header.e_shnum == 0)
1260 return 0;
1261
Todd Fialab91de782014-06-27 16:52:49 +00001262 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
1263
Michael Sartaina7499c92013-07-01 19:45:50 +00001264 section_headers.resize(header.e_shnum);
1265 if (section_headers.size() != header.e_shnum)
1266 return 0;
1267
1268 const size_t sh_size = header.e_shnum * header.e_shentsize;
1269 const elf_off sh_offset = header.e_shoff;
1270 DataExtractor sh_data;
1271 if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size)
1272 return 0;
1273
1274 uint32_t idx;
1275 lldb::offset_t offset;
1276 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx)
1277 {
1278 if (section_headers[idx].Parse(sh_data, &offset) == false)
1279 break;
1280 }
1281 if (idx < section_headers.size())
1282 section_headers.resize(idx);
1283
1284 const unsigned strtab_idx = header.e_shstrndx;
1285 if (strtab_idx && strtab_idx < section_headers.size())
1286 {
1287 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1288 const size_t byte_size = sheader.sh_size;
1289 const Elf64_Off offset = sheader.sh_offset;
1290 lldb_private::DataExtractor shstr_data;
1291
1292 if (shstr_data.SetData (object_data, offset, byte_size) == byte_size)
1293 {
1294 for (SectionHeaderCollIter I = section_headers.begin();
1295 I != section_headers.end(); ++I)
1296 {
1297 static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink");
1298 const ELFSectionHeaderInfo &header = *I;
1299 const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1300 ConstString name(shstr_data.PeekCStr(I->sh_name));
1301
1302 I->section_name = name;
1303
1304 if (name == g_sect_name_gnu_debuglink)
1305 {
1306 DataExtractor data;
1307 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
1308 {
1309 lldb::offset_t gnu_debuglink_offset = 0;
1310 gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset);
1311 gnu_debuglink_offset = llvm::RoundUpToAlignment (gnu_debuglink_offset, 4);
1312 data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1313 }
1314 }
1315
Todd Fialab91de782014-06-27 16:52:49 +00001316 // Process ELF note section entries.
1317 if (header.sh_type == SHT_NOTE)
Michael Sartaina7499c92013-07-01 19:45:50 +00001318 {
Todd Fialab91de782014-06-27 16:52:49 +00001319 // Allow notes to refine module info.
Michael Sartaina7499c92013-07-01 19:45:50 +00001320 DataExtractor data;
1321 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
1322 {
Todd Fialab91de782014-06-27 16:52:49 +00001323 Error error = RefineModuleDetailsFromNote (data, arch_spec, uuid);
1324 if (error.Fail ())
1325 {
1326 if (log)
1327 log->Printf ("ObjectFileELF::%s ELF note processing failed: %s", __FUNCTION__, error.AsCString ());
1328 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001329 }
1330 }
1331 }
1332
1333 return section_headers.size();
1334 }
1335 }
1336
1337 section_headers.clear();
1338 return 0;
1339}
1340
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001341size_t
1342ObjectFileELF::GetProgramHeaderCount()
1343{
1344 return ParseProgramHeaders();
1345}
1346
1347const elf::ELFProgramHeader *
1348ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id)
1349{
1350 if (!id || !ParseProgramHeaders())
1351 return NULL;
1352
1353 if (--id < m_program_headers.size())
1354 return &m_program_headers[id];
1355
1356 return NULL;
1357}
1358
1359DataExtractor
1360ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id)
1361{
1362 const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id);
1363 if (segment_header == NULL)
1364 return DataExtractor();
1365 return DataExtractor(m_data, segment_header->p_offset, segment_header->p_filesz);
1366}
1367
Michael Sartaina7499c92013-07-01 19:45:50 +00001368//----------------------------------------------------------------------
1369// ParseSectionHeaders
1370//----------------------------------------------------------------------
1371size_t
1372ObjectFileELF::ParseSectionHeaders()
1373{
Todd Fialab91de782014-06-27 16:52:49 +00001374 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 +00001375}
1376
Michael Sartaina7499c92013-07-01 19:45:50 +00001377const ObjectFileELF::ELFSectionHeaderInfo *
1378ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id)
1379{
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001380 if (!id || !ParseSectionHeaders())
Michael Sartaina7499c92013-07-01 19:45:50 +00001381 return NULL;
1382
1383 if (--id < m_section_headers.size())
1384 return &m_section_headers[id];
1385
1386 return NULL;
1387}
1388
Greg Clayton3046e662013-07-10 01:23:25 +00001389void
1390ObjectFileELF::CreateSections(SectionList &unified_section_list)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001391{
Greg Clayton3046e662013-07-10 01:23:25 +00001392 if (!m_sections_ap.get() && ParseSectionHeaders())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001393 {
1394 m_sections_ap.reset(new SectionList());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001395
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001396 for (SectionHeaderCollIter I = m_section_headers.begin();
1397 I != m_section_headers.end(); ++I)
1398 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001399 const ELFSectionHeaderInfo &header = *I;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001400
Michael Sartaina7499c92013-07-01 19:45:50 +00001401 ConstString& name = I->section_name;
Greg Clayton47037bc2012-03-27 02:40:46 +00001402 const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1403 const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001404
Greg Clayton4ceb9982010-07-21 22:54:26 +00001405 static ConstString g_sect_name_text (".text");
1406 static ConstString g_sect_name_data (".data");
1407 static ConstString g_sect_name_bss (".bss");
Greg Clayton741f3f92012-03-27 21:10:07 +00001408 static ConstString g_sect_name_tdata (".tdata");
1409 static ConstString g_sect_name_tbss (".tbss");
Greg Clayton4ceb9982010-07-21 22:54:26 +00001410 static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev");
1411 static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges");
1412 static ConstString g_sect_name_dwarf_debug_frame (".debug_frame");
1413 static ConstString g_sect_name_dwarf_debug_info (".debug_info");
1414 static ConstString g_sect_name_dwarf_debug_line (".debug_line");
1415 static ConstString g_sect_name_dwarf_debug_loc (".debug_loc");
1416 static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo");
1417 static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames");
1418 static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes");
1419 static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges");
1420 static ConstString g_sect_name_dwarf_debug_str (".debug_str");
1421 static ConstString g_sect_name_eh_frame (".eh_frame");
1422
1423 SectionType sect_type = eSectionTypeOther;
1424
Greg Clayton741f3f92012-03-27 21:10:07 +00001425 bool is_thread_specific = false;
Michael Sartaina7499c92013-07-01 19:45:50 +00001426
Greg Clayton4ceb9982010-07-21 22:54:26 +00001427 if (name == g_sect_name_text) sect_type = eSectionTypeCode;
1428 else if (name == g_sect_name_data) sect_type = eSectionTypeData;
1429 else if (name == g_sect_name_bss) sect_type = eSectionTypeZeroFill;
Greg Clayton741f3f92012-03-27 21:10:07 +00001430 else if (name == g_sect_name_tdata)
1431 {
1432 sect_type = eSectionTypeData;
1433 is_thread_specific = true;
1434 }
1435 else if (name == g_sect_name_tbss)
1436 {
1437 sect_type = eSectionTypeZeroFill;
1438 is_thread_specific = true;
1439 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001440 // .debug_abbrev – Abbreviations used in the .debug_info section
1441 // .debug_aranges – Lookup table for mapping addresses to compilation units
1442 // .debug_frame – Call frame information
1443 // .debug_info – The core DWARF information section
1444 // .debug_line – Line number information
1445 // .debug_loc – Location lists used in DW_AT_location attributes
1446 // .debug_macinfo – Macro information
1447 // .debug_pubnames – Lookup table for mapping object and function names to compilation units
1448 // .debug_pubtypes – Lookup table for mapping type names to compilation units
1449 // .debug_ranges – Address ranges used in DW_AT_ranges attributes
1450 // .debug_str – String table used in .debug_info
Michael Sartain3cf443d2013-07-17 00:26:30 +00001451 // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
1452 // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
Michael Sartaina7499c92013-07-01 19:45:50 +00001453 // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
Greg Clayton4ceb9982010-07-21 22:54:26 +00001454 else if (name == g_sect_name_dwarf_debug_abbrev) sect_type = eSectionTypeDWARFDebugAbbrev;
1455 else if (name == g_sect_name_dwarf_debug_aranges) sect_type = eSectionTypeDWARFDebugAranges;
1456 else if (name == g_sect_name_dwarf_debug_frame) sect_type = eSectionTypeDWARFDebugFrame;
1457 else if (name == g_sect_name_dwarf_debug_info) sect_type = eSectionTypeDWARFDebugInfo;
1458 else if (name == g_sect_name_dwarf_debug_line) sect_type = eSectionTypeDWARFDebugLine;
1459 else if (name == g_sect_name_dwarf_debug_loc) sect_type = eSectionTypeDWARFDebugLoc;
1460 else if (name == g_sect_name_dwarf_debug_macinfo) sect_type = eSectionTypeDWARFDebugMacInfo;
1461 else if (name == g_sect_name_dwarf_debug_pubnames) sect_type = eSectionTypeDWARFDebugPubNames;
1462 else if (name == g_sect_name_dwarf_debug_pubtypes) sect_type = eSectionTypeDWARFDebugPubTypes;
1463 else if (name == g_sect_name_dwarf_debug_ranges) sect_type = eSectionTypeDWARFDebugRanges;
1464 else if (name == g_sect_name_dwarf_debug_str) sect_type = eSectionTypeDWARFDebugStr;
1465 else if (name == g_sect_name_eh_frame) sect_type = eSectionTypeEHFrame;
Michael Sartaina7499c92013-07-01 19:45:50 +00001466
1467 switch (header.sh_type)
Michael Sartainc836ae72013-05-23 20:57:03 +00001468 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001469 case SHT_SYMTAB:
1470 assert (sect_type == eSectionTypeOther);
1471 sect_type = eSectionTypeELFSymbolTable;
1472 break;
1473 case SHT_DYNSYM:
1474 assert (sect_type == eSectionTypeOther);
1475 sect_type = eSectionTypeELFDynamicSymbols;
1476 break;
1477 case SHT_RELA:
1478 case SHT_REL:
1479 assert (sect_type == eSectionTypeOther);
1480 sect_type = eSectionTypeELFRelocationEntries;
1481 break;
1482 case SHT_DYNAMIC:
1483 assert (sect_type == eSectionTypeOther);
1484 sect_type = eSectionTypeELFDynamicLinkInfo;
1485 break;
Michael Sartainc836ae72013-05-23 20:57:03 +00001486 }
Michael Sartaina7499c92013-07-01 19:45:50 +00001487
Zachary Turner736d4d82014-06-25 05:42:32 +00001488 elf::elf_xword log2align = (header.sh_addralign==0)
1489 ? 0
1490 : llvm::Log2_64(header.sh_addralign);
Greg Clayton3046e662013-07-10 01:23:25 +00001491 SectionSP section_sp (new Section(GetModule(), // Module to which this section belongs.
1492 this, // ObjectFile to which this section belongs and should read section data from.
1493 SectionIndex(I), // Section ID.
1494 name, // Section name.
1495 sect_type, // Section type.
1496 header.sh_addr, // VM address.
1497 vm_size, // VM size in bytes of this section.
1498 header.sh_offset, // Offset of this section in the file.
1499 file_size, // Size of the section as found in the file.
Zachary Turner736d4d82014-06-25 05:42:32 +00001500 log2align, // Alignment of the section
Greg Clayton3046e662013-07-10 01:23:25 +00001501 header.sh_flags)); // Flags for this section.
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001502
Greg Clayton741f3f92012-03-27 21:10:07 +00001503 if (is_thread_specific)
1504 section_sp->SetIsThreadSpecific (is_thread_specific);
1505 m_sections_ap->AddSection(section_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001506 }
1507 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001508
Greg Clayton3046e662013-07-10 01:23:25 +00001509 if (m_sections_ap.get())
1510 {
1511 if (GetType() == eTypeDebugInfo)
1512 {
1513 static const SectionType g_sections[] =
1514 {
1515 eSectionTypeDWARFDebugAranges,
1516 eSectionTypeDWARFDebugInfo,
1517 eSectionTypeDWARFDebugAbbrev,
1518 eSectionTypeDWARFDebugFrame,
1519 eSectionTypeDWARFDebugLine,
1520 eSectionTypeDWARFDebugStr,
1521 eSectionTypeDWARFDebugLoc,
1522 eSectionTypeDWARFDebugMacInfo,
1523 eSectionTypeDWARFDebugPubNames,
1524 eSectionTypeDWARFDebugPubTypes,
1525 eSectionTypeDWARFDebugRanges,
1526 eSectionTypeELFSymbolTable,
1527 };
1528 SectionList *elf_section_list = m_sections_ap.get();
1529 for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx)
1530 {
1531 SectionType section_type = g_sections[idx];
1532 SectionSP section_sp (elf_section_list->FindSectionByType (section_type, true));
1533 if (section_sp)
1534 {
1535 SectionSP module_section_sp (unified_section_list.FindSectionByType (section_type, true));
1536 if (module_section_sp)
1537 unified_section_list.ReplaceSection (module_section_sp->GetID(), section_sp);
1538 else
1539 unified_section_list.AddSection (section_sp);
1540 }
1541 }
1542 }
1543 else
1544 {
1545 unified_section_list = *m_sections_ap;
1546 }
1547 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001548}
1549
Greg Clayton3046e662013-07-10 01:23:25 +00001550// private
Michael Sartaina7499c92013-07-01 19:45:50 +00001551unsigned
Greg Clayton3046e662013-07-10 01:23:25 +00001552ObjectFileELF::ParseSymbols (Symtab *symtab,
1553 user_id_t start_id,
1554 SectionList *section_list,
1555 const size_t num_symbols,
1556 const DataExtractor &symtab_data,
1557 const DataExtractor &strtab_data)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001558{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001559 ELFSymbol symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +00001560 lldb::offset_t offset = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001561
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001562 static ConstString text_section_name(".text");
1563 static ConstString init_section_name(".init");
1564 static ConstString fini_section_name(".fini");
1565 static ConstString ctors_section_name(".ctors");
1566 static ConstString dtors_section_name(".dtors");
1567
1568 static ConstString data_section_name(".data");
1569 static ConstString rodata_section_name(".rodata");
1570 static ConstString rodata1_section_name(".rodata1");
1571 static ConstString data2_section_name(".data1");
1572 static ConstString bss_section_name(".bss");
1573
Greg Clayton9594f4c2013-04-13 23:17:23 +00001574 //StreamFile strm(stdout, false);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001575 unsigned i;
1576 for (i = 0; i < num_symbols; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001577 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001578 if (symbol.Parse(symtab_data, &offset) == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001579 break;
Greg Clayton9594f4c2013-04-13 23:17:23 +00001580
1581 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1582
Andrew MacPherson17220c12014-03-05 10:12:43 +00001583 // No need to add non-section symbols that have no names
1584 if (symbol.getType() != STT_SECTION &&
1585 (symbol_name == NULL || symbol_name[0] == '\0'))
Greg Clayton9594f4c2013-04-13 23:17:23 +00001586 continue;
1587
1588 //symbol.Dump (&strm, i, &strtab_data, section_list);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001589
Greg Claytone72dfb32012-02-24 01:59:29 +00001590 SectionSP symbol_section_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001591 SymbolType symbol_type = eSymbolTypeInvalid;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001592 Elf64_Half symbol_idx = symbol.st_shndx;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001593
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001594 switch (symbol_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001595 {
1596 case SHN_ABS:
1597 symbol_type = eSymbolTypeAbsolute;
1598 break;
1599 case SHN_UNDEF:
1600 symbol_type = eSymbolTypeUndefined;
1601 break;
1602 default:
Greg Claytone72dfb32012-02-24 01:59:29 +00001603 symbol_section_sp = section_list->GetSectionAtIndex(symbol_idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001604 break;
1605 }
1606
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001607 // If a symbol is undefined do not process it further even if it has a STT type
1608 if (symbol_type != eSymbolTypeUndefined)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001609 {
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001610 switch (symbol.getType())
1611 {
1612 default:
1613 case STT_NOTYPE:
1614 // The symbol's type is not specified.
1615 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001616
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001617 case STT_OBJECT:
1618 // The symbol is associated with a data object, such as a variable,
1619 // an array, etc.
1620 symbol_type = eSymbolTypeData;
1621 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001622
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001623 case STT_FUNC:
1624 // The symbol is associated with a function or other executable code.
1625 symbol_type = eSymbolTypeCode;
1626 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001627
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001628 case STT_SECTION:
1629 // The symbol is associated with a section. Symbol table entries of
1630 // this type exist primarily for relocation and normally have
1631 // STB_LOCAL binding.
1632 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001633
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001634 case STT_FILE:
1635 // Conventionally, the symbol's name gives the name of the source
1636 // file associated with the object file. A file symbol has STB_LOCAL
1637 // binding, its section index is SHN_ABS, and it precedes the other
1638 // STB_LOCAL symbols for the file, if it is present.
Greg Clayton9594f4c2013-04-13 23:17:23 +00001639 symbol_type = eSymbolTypeSourceFile;
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001640 break;
Matt Kopec00049b82013-02-27 20:13:38 +00001641
1642 case STT_GNU_IFUNC:
1643 // The symbol is associated with an indirect function. The actual
1644 // function will be resolved if it is referenced.
1645 symbol_type = eSymbolTypeResolver;
1646 break;
Matt Kopec92dd5cf2013-02-12 18:30:30 +00001647 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001648 }
1649
1650 if (symbol_type == eSymbolTypeInvalid)
1651 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001652 if (symbol_section_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001653 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001654 const ConstString &sect_name = symbol_section_sp->GetName();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001655 if (sect_name == text_section_name ||
1656 sect_name == init_section_name ||
1657 sect_name == fini_section_name ||
1658 sect_name == ctors_section_name ||
1659 sect_name == dtors_section_name)
1660 {
1661 symbol_type = eSymbolTypeCode;
1662 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001663 else if (sect_name == data_section_name ||
1664 sect_name == data2_section_name ||
1665 sect_name == rodata_section_name ||
1666 sect_name == rodata1_section_name ||
1667 sect_name == bss_section_name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001668 {
1669 symbol_type = eSymbolTypeData;
1670 }
1671 }
1672 }
1673
Greg Clayton3046e662013-07-10 01:23:25 +00001674 // If the symbol section we've found has no data (SHT_NOBITS), then check the module section
1675 // 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 +00001676 if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0))
1677 {
1678 ModuleSP module_sp(GetModule());
1679 if (module_sp)
1680 {
Greg Clayton3046e662013-07-10 01:23:25 +00001681 SectionList *module_section_list = module_sp->GetSectionList();
1682 if (module_section_list && module_section_list != section_list)
Michael Sartaina7499c92013-07-01 19:45:50 +00001683 {
1684 const ConstString &sect_name = symbol_section_sp->GetName();
Greg Clayton3046e662013-07-10 01:23:25 +00001685 lldb::SectionSP section_sp (module_section_list->FindSectionByName (sect_name));
Michael Sartaina7499c92013-07-01 19:45:50 +00001686 if (section_sp && section_sp->GetFileSize())
1687 {
1688 symbol_section_sp = section_sp;
1689 }
1690 }
1691 }
1692 }
1693
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001694 uint64_t symbol_value = symbol.st_value;
Andrew MacPherson17220c12014-03-05 10:12:43 +00001695 if (symbol_section_sp && CalculateType() != ObjectFile::Type::eTypeObjectFile)
Greg Claytone72dfb32012-02-24 01:59:29 +00001696 symbol_value -= symbol_section_sp->GetFileAddress();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001697 bool is_global = symbol.getBinding() == STB_GLOBAL;
1698 uint32_t flags = symbol.st_other << 8 | symbol.st_info;
Greg Clayton47037bc2012-03-27 02:40:46 +00001699 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001700 Symbol dc_symbol(
Greg Claytone72dfb32012-02-24 01:59:29 +00001701 i + start_id, // ID is the original symbol table index.
1702 symbol_name, // Symbol name.
Greg Clayton47037bc2012-03-27 02:40:46 +00001703 is_mangled, // Is the symbol name mangled?
Greg Claytone72dfb32012-02-24 01:59:29 +00001704 symbol_type, // Type of this symbol
1705 is_global, // Is this globally visible?
1706 false, // Is this symbol debug info?
1707 false, // Is this symbol a trampoline?
1708 false, // Is this symbol artificial?
1709 symbol_section_sp, // Section in which this symbol is defined or null.
1710 symbol_value, // Offset in section or symbol value.
1711 symbol.st_size, // Size in bytes of this symbol.
Greg Clayton9594f4c2013-04-13 23:17:23 +00001712 true, // Size is valid
Greg Claytone72dfb32012-02-24 01:59:29 +00001713 flags); // Symbol flags.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001714 symtab->AddSymbol(dc_symbol);
1715 }
Stephen Wilson499b40e2011-03-30 16:07:05 +00001716
1717 return i;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001718}
1719
Stephen Wilson499b40e2011-03-30 16:07:05 +00001720unsigned
Greg Clayton3046e662013-07-10 01:23:25 +00001721ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab)
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001722{
Greg Clayton3046e662013-07-10 01:23:25 +00001723 if (symtab->GetObjectFile() != this)
1724 {
1725 // If the symbol table section is owned by a different object file, have it do the
1726 // parsing.
1727 ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile());
1728 return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
1729 }
1730
1731 // Get section list for this object file.
1732 SectionList *section_list = m_sections_ap.get();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001733 if (!section_list)
Stephen Wilson499b40e2011-03-30 16:07:05 +00001734 return 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001735
Greg Clayton3046e662013-07-10 01:23:25 +00001736 user_id_t symtab_id = symtab->GetID();
1737 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
Michael Sartaina7499c92013-07-01 19:45:50 +00001738 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
1739 symtab_hdr->sh_type == SHT_DYNSYM);
1740
Greg Clayton3046e662013-07-10 01:23:25 +00001741 // sh_link: section header index of associated string table.
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001742 // Section ID's are ones based.
Stephen Wilson499b40e2011-03-30 16:07:05 +00001743 user_id_t strtab_id = symtab_hdr->sh_link + 1;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001744 Section *strtab = section_list->FindSectionByID(strtab_id).get();
Greg Clayton3046e662013-07-10 01:23:25 +00001745
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001746 if (symtab && strtab)
1747 {
Greg Clayton3046e662013-07-10 01:23:25 +00001748 assert (symtab->GetObjectFile() == this);
1749 assert (strtab->GetObjectFile() == this);
1750
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001751 DataExtractor symtab_data;
1752 DataExtractor strtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00001753 if (ReadSectionData(symtab, symtab_data) &&
1754 ReadSectionData(strtab, strtab_data))
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001755 {
Greg Clayton3046e662013-07-10 01:23:25 +00001756 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
1757
Arnaud A. de Grandmaison62e5f4d2014-03-22 20:23:26 +00001758 return ParseSymbols(symbol_table, start_id, section_list,
1759 num_symbols, symtab_data, strtab_data);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001760 }
1761 }
Stephen Wilson499b40e2011-03-30 16:07:05 +00001762
Arnaud A. de Grandmaison62e5f4d2014-03-22 20:23:26 +00001763 return 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00001764}
1765
1766size_t
1767ObjectFileELF::ParseDynamicSymbols()
1768{
1769 if (m_dynamic_symbols.size())
1770 return m_dynamic_symbols.size();
1771
Stephen Wilson499b40e2011-03-30 16:07:05 +00001772 SectionList *section_list = GetSectionList();
1773 if (!section_list)
Bill Wendlinged24dcc2012-04-03 07:50:11 +00001774 return 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00001775
Greg Clayton3046e662013-07-10 01:23:25 +00001776 // Find the SHT_DYNAMIC section.
1777 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
Stephen Wilson499b40e2011-03-30 16:07:05 +00001778 if (!dynsym)
Bill Wendlinged24dcc2012-04-03 07:50:11 +00001779 return 0;
Greg Clayton3046e662013-07-10 01:23:25 +00001780 assert (dynsym->GetObjectFile() == this);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001781
1782 ELFDynamic symbol;
1783 DataExtractor dynsym_data;
Greg Claytonc9660542012-02-05 02:38:54 +00001784 if (ReadSectionData(dynsym, dynsym_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00001785 {
Greg Claytonc7bece562013-01-25 18:06:21 +00001786 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1787 lldb::offset_t cursor = 0;
Stephen Wilson499b40e2011-03-30 16:07:05 +00001788
1789 while (cursor < section_size)
1790 {
Stephen Wilson499b40e2011-03-30 16:07:05 +00001791 if (!symbol.Parse(dynsym_data, &cursor))
1792 break;
1793
1794 m_dynamic_symbols.push_back(symbol);
1795 }
1796 }
1797
1798 return m_dynamic_symbols.size();
1799}
1800
1801const ELFDynamic *
1802ObjectFileELF::FindDynamicSymbol(unsigned tag)
1803{
1804 if (!ParseDynamicSymbols())
1805 return NULL;
1806
Stephen Wilson499b40e2011-03-30 16:07:05 +00001807 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
1808 DynamicSymbolCollIter E = m_dynamic_symbols.end();
1809 for ( ; I != E; ++I)
1810 {
1811 ELFDynamic *symbol = &*I;
1812
1813 if (symbol->d_tag == tag)
1814 return symbol;
1815 }
1816
1817 return NULL;
1818}
1819
Stephen Wilson499b40e2011-03-30 16:07:05 +00001820unsigned
1821ObjectFileELF::PLTRelocationType()
1822{
Michael Sartainf7899542013-08-22 21:25:53 +00001823 // DT_PLTREL
1824 // This member specifies the type of relocation entry to which the
1825 // procedure linkage table refers. The d_val member holds DT_REL or
1826 // DT_RELA, as appropriate. All relocations in a procedure linkage table
1827 // must use the same relocation.
Stephen Wilson499b40e2011-03-30 16:07:05 +00001828 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
1829
1830 if (symbol)
1831 return symbol->d_val;
1832
1833 return 0;
1834}
1835
1836static unsigned
1837ParsePLTRelocations(Symtab *symbol_table,
1838 user_id_t start_id,
1839 unsigned rel_type,
1840 const ELFHeader *hdr,
1841 const ELFSectionHeader *rel_hdr,
1842 const ELFSectionHeader *plt_hdr,
1843 const ELFSectionHeader *sym_hdr,
Greg Claytone72dfb32012-02-24 01:59:29 +00001844 const lldb::SectionSP &plt_section_sp,
Stephen Wilson499b40e2011-03-30 16:07:05 +00001845 DataExtractor &rel_data,
1846 DataExtractor &symtab_data,
1847 DataExtractor &strtab_data)
1848{
1849 ELFRelocation rel(rel_type);
1850 ELFSymbol symbol;
Greg Claytonc7bece562013-01-25 18:06:21 +00001851 lldb::offset_t offset = 0;
Michael Sartainf7899542013-08-22 21:25:53 +00001852 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 16 bytes.
1853 // So round the entsize up by the alignment if addralign is set.
1854 const elf_xword plt_entsize = plt_hdr->sh_addralign ?
1855 llvm::RoundUpToAlignment (plt_hdr->sh_entsize, plt_hdr->sh_addralign) : plt_hdr->sh_entsize;
Greg Claytonc7bece562013-01-25 18:06:21 +00001856 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
Stephen Wilson499b40e2011-03-30 16:07:05 +00001857
1858 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
1859 reloc_info_fn reloc_type;
1860 reloc_info_fn reloc_symbol;
1861
Greg Claytond091afe2012-11-12 22:53:16 +00001862 if (hdr->Is32Bit())
Stephen Wilson499b40e2011-03-30 16:07:05 +00001863 {
1864 reloc_type = ELFRelocation::RelocType32;
1865 reloc_symbol = ELFRelocation::RelocSymbol32;
1866 }
1867 else
1868 {
1869 reloc_type = ELFRelocation::RelocType64;
1870 reloc_symbol = ELFRelocation::RelocSymbol64;
1871 }
1872
1873 unsigned slot_type = hdr->GetRelocationJumpSlotType();
1874 unsigned i;
1875 for (i = 0; i < num_relocations; ++i)
1876 {
1877 if (rel.Parse(rel_data, &offset) == false)
1878 break;
1879
1880 if (reloc_type(rel) != slot_type)
1881 continue;
1882
Greg Claytonc7bece562013-01-25 18:06:21 +00001883 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
Stephen Wilson499b40e2011-03-30 16:07:05 +00001884 uint64_t plt_index = (i + 1) * plt_entsize;
1885
1886 if (!symbol.Parse(symtab_data, &symbol_offset))
1887 break;
1888
1889 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
Greg Clayton47037bc2012-03-27 02:40:46 +00001890 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
Stephen Wilson499b40e2011-03-30 16:07:05 +00001891
1892 Symbol jump_symbol(
1893 i + start_id, // Symbol table index
1894 symbol_name, // symbol name.
Greg Clayton47037bc2012-03-27 02:40:46 +00001895 is_mangled, // is the symbol name mangled?
Stephen Wilson499b40e2011-03-30 16:07:05 +00001896 eSymbolTypeTrampoline, // Type of this symbol
1897 false, // Is this globally visible?
1898 false, // Is this symbol debug info?
1899 true, // Is this symbol a trampoline?
1900 true, // Is this symbol artificial?
Greg Claytone72dfb32012-02-24 01:59:29 +00001901 plt_section_sp, // Section in which this symbol is defined or null.
Stephen Wilson499b40e2011-03-30 16:07:05 +00001902 plt_index, // Offset in section or symbol value.
1903 plt_entsize, // Size in bytes of this symbol.
Greg Clayton9594f4c2013-04-13 23:17:23 +00001904 true, // Size is valid
Stephen Wilson499b40e2011-03-30 16:07:05 +00001905 0); // Symbol flags.
1906
1907 symbol_table->AddSymbol(jump_symbol);
1908 }
1909
1910 return i;
1911}
1912
1913unsigned
1914ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table,
1915 user_id_t start_id,
Michael Sartaina7499c92013-07-01 19:45:50 +00001916 const ELFSectionHeaderInfo *rel_hdr,
Stephen Wilson499b40e2011-03-30 16:07:05 +00001917 user_id_t rel_id)
1918{
1919 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
1920
Greg Clayton3046e662013-07-10 01:23:25 +00001921 // The link field points to the associated symbol table. The info field
Stephen Wilson499b40e2011-03-30 16:07:05 +00001922 // points to the section holding the plt.
1923 user_id_t symtab_id = rel_hdr->sh_link;
1924 user_id_t plt_id = rel_hdr->sh_info;
1925
1926 if (!symtab_id || !plt_id)
1927 return 0;
1928
1929 // Section ID's are ones based;
1930 symtab_id++;
1931 plt_id++;
1932
Michael Sartaina7499c92013-07-01 19:45:50 +00001933 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001934 if (!plt_hdr)
1935 return 0;
1936
Michael Sartaina7499c92013-07-01 19:45:50 +00001937 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
Stephen Wilson499b40e2011-03-30 16:07:05 +00001938 if (!sym_hdr)
1939 return 0;
1940
Greg Clayton3046e662013-07-10 01:23:25 +00001941 SectionList *section_list = m_sections_ap.get();
Stephen Wilson499b40e2011-03-30 16:07:05 +00001942 if (!section_list)
1943 return 0;
1944
1945 Section *rel_section = section_list->FindSectionByID(rel_id).get();
1946 if (!rel_section)
1947 return 0;
1948
Greg Claytone72dfb32012-02-24 01:59:29 +00001949 SectionSP plt_section_sp (section_list->FindSectionByID(plt_id));
1950 if (!plt_section_sp)
Stephen Wilson499b40e2011-03-30 16:07:05 +00001951 return 0;
1952
1953 Section *symtab = section_list->FindSectionByID(symtab_id).get();
1954 if (!symtab)
1955 return 0;
1956
Greg Clayton3046e662013-07-10 01:23:25 +00001957 // sh_link points to associated string table.
Stephen Wilson499b40e2011-03-30 16:07:05 +00001958 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
1959 if (!strtab)
1960 return 0;
1961
1962 DataExtractor rel_data;
Greg Claytonc9660542012-02-05 02:38:54 +00001963 if (!ReadSectionData(rel_section, rel_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00001964 return 0;
1965
1966 DataExtractor symtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00001967 if (!ReadSectionData(symtab, symtab_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00001968 return 0;
1969
1970 DataExtractor strtab_data;
Greg Claytonc9660542012-02-05 02:38:54 +00001971 if (!ReadSectionData(strtab, strtab_data))
Stephen Wilson499b40e2011-03-30 16:07:05 +00001972 return 0;
1973
1974 unsigned rel_type = PLTRelocationType();
1975 if (!rel_type)
1976 return 0;
1977
Greg Claytone72dfb32012-02-24 01:59:29 +00001978 return ParsePLTRelocations (symbol_table,
1979 start_id,
1980 rel_type,
1981 &m_header,
1982 rel_hdr,
1983 plt_hdr,
1984 sym_hdr,
1985 plt_section_sp,
1986 rel_data,
1987 symtab_data,
1988 strtab_data);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001989}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001990
Andrew MacPherson17220c12014-03-05 10:12:43 +00001991unsigned
1992ObjectFileELF::RelocateSection(Symtab* symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
1993 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
1994 DataExtractor &rel_data, DataExtractor &symtab_data,
1995 DataExtractor &debug_data, Section* rel_section)
1996{
1997 ELFRelocation rel(rel_hdr->sh_type);
1998 lldb::addr_t offset = 0;
1999 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2000 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2001 reloc_info_fn reloc_type;
2002 reloc_info_fn reloc_symbol;
2003
2004 if (hdr->Is32Bit())
2005 {
2006 reloc_type = ELFRelocation::RelocType32;
2007 reloc_symbol = ELFRelocation::RelocSymbol32;
2008 }
2009 else
2010 {
2011 reloc_type = ELFRelocation::RelocType64;
2012 reloc_symbol = ELFRelocation::RelocSymbol64;
2013 }
2014
2015 for (unsigned i = 0; i < num_relocations; ++i)
2016 {
2017 if (rel.Parse(rel_data, &offset) == false)
2018 break;
2019
2020 Symbol* symbol = NULL;
2021
2022 if (hdr->Is32Bit())
2023 {
2024 switch (reloc_type(rel)) {
2025 case R_386_32:
2026 case R_386_PC32:
2027 default:
2028 assert(false && "unexpected relocation type");
2029 }
2030 } else {
2031 switch (reloc_type(rel)) {
2032 case R_X86_64_64:
2033 {
2034 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2035 if (symbol)
2036 {
2037 addr_t value = symbol->GetAddress().GetFileAddress();
2038 DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2039 uint64_t* dst = reinterpret_cast<uint64_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset64(rel));
2040 *dst = value + ELFRelocation::RelocAddend64(rel);
2041 }
2042 break;
2043 }
2044 case R_X86_64_32:
2045 case R_X86_64_32S:
2046 {
2047 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2048 if (symbol)
2049 {
2050 addr_t value = symbol->GetAddress().GetFileAddress();
2051 value += ELFRelocation::RelocAddend32(rel);
2052 assert((reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) ||
2053 (reloc_type(rel) == R_X86_64_32S &&
2054 ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN)));
2055 uint32_t truncated_addr = (value & 0xFFFFFFFF);
2056 DataBufferSP& data_buffer_sp = debug_data.GetSharedDataBuffer();
2057 uint32_t* dst = reinterpret_cast<uint32_t*>(data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel));
2058 *dst = truncated_addr;
2059 }
2060 break;
2061 }
2062 case R_X86_64_PC32:
2063 default:
2064 assert(false && "unexpected relocation type");
2065 }
2066 }
2067 }
2068
2069 return 0;
2070}
2071
2072unsigned
2073ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, user_id_t rel_id)
2074{
2075 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2076
2077 // Parse in the section list if needed.
2078 SectionList *section_list = GetSectionList();
2079 if (!section_list)
2080 return 0;
2081
2082 // Section ID's are ones based.
2083 user_id_t symtab_id = rel_hdr->sh_link + 1;
2084 user_id_t debug_id = rel_hdr->sh_info + 1;
2085
2086 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2087 if (!symtab_hdr)
2088 return 0;
2089
2090 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2091 if (!debug_hdr)
2092 return 0;
2093
2094 Section *rel = section_list->FindSectionByID(rel_id).get();
2095 if (!rel)
2096 return 0;
2097
2098 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2099 if (!symtab)
2100 return 0;
2101
2102 Section *debug = section_list->FindSectionByID(debug_id).get();
2103 if (!debug)
2104 return 0;
2105
2106 DataExtractor rel_data;
2107 DataExtractor symtab_data;
2108 DataExtractor debug_data;
2109
2110 if (ReadSectionData(rel, rel_data) &&
2111 ReadSectionData(symtab, symtab_data) &&
2112 ReadSectionData(debug, debug_data))
2113 {
2114 RelocateSection(m_symtab_ap.get(), &m_header, rel_hdr, symtab_hdr, debug_hdr,
2115 rel_data, symtab_data, debug_data, debug);
2116 }
2117
2118 return 0;
2119}
2120
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002121Symtab *
Greg Clayton3046e662013-07-10 01:23:25 +00002122ObjectFileELF::GetSymtab()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002123{
Michael Sartaina7499c92013-07-01 19:45:50 +00002124 ModuleSP module_sp(GetModule());
Greg Clayton3046e662013-07-10 01:23:25 +00002125 if (!module_sp)
2126 return NULL;
Michael Sartaina7499c92013-07-01 19:45:50 +00002127
Greg Clayton3046e662013-07-10 01:23:25 +00002128 // We always want to use the main object file so we (hopefully) only have one cached copy
2129 // of our symtab, dynamic sections, etc.
2130 ObjectFile *module_obj_file = module_sp->GetObjectFile();
2131 if (module_obj_file && module_obj_file != this)
2132 return module_obj_file->GetSymtab();
2133
2134 if (m_symtab_ap.get() == NULL)
2135 {
2136 SectionList *section_list = GetSectionList();
Michael Sartaina7499c92013-07-01 19:45:50 +00002137 if (!section_list)
2138 return NULL;
2139
Greg Clayton3046e662013-07-10 01:23:25 +00002140 uint64_t symbol_id = 0;
2141 lldb_private::Mutex::Locker locker(module_sp->GetMutex());
Stephen Wilson499b40e2011-03-30 16:07:05 +00002142
Greg Clayton3046e662013-07-10 01:23:25 +00002143 m_symtab_ap.reset(new Symtab(this));
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002144
Michael Sartaina7499c92013-07-01 19:45:50 +00002145 // Sharable objects and dynamic executables usually have 2 distinct symbol
2146 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller
2147 // version of the symtab that only contains global symbols. The information found
2148 // in the dynsym is therefore also found in the symtab, while the reverse is not
2149 // necessarily true.
Greg Clayton3046e662013-07-10 01:23:25 +00002150 Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get();
2151 if (!symtab)
Michael Sartaina7499c92013-07-01 19:45:50 +00002152 {
2153 // The symtab section is non-allocable and can be stripped, so if it doesn't exist
2154 // then use the dynsym section which should always be there.
Greg Clayton3046e662013-07-10 01:23:25 +00002155 symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get();
Michael Sartaina7499c92013-07-01 19:45:50 +00002156 }
Greg Clayton3046e662013-07-10 01:23:25 +00002157 if (symtab)
2158 symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab);
Michael Sartaina7499c92013-07-01 19:45:50 +00002159
Michael Sartainf7899542013-08-22 21:25:53 +00002160 // DT_JMPREL
2161 // If present, this entry's d_ptr member holds the address of relocation
2162 // entries associated solely with the procedure linkage table. Separating
2163 // these relocation entries lets the dynamic linker ignore them during
2164 // process initialization, if lazy binding is enabled. If this entry is
2165 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2166 // also be present.
Greg Clayton3046e662013-07-10 01:23:25 +00002167 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2168 if (symbol)
Michael Sartaina7499c92013-07-01 19:45:50 +00002169 {
Michael Sartainf7899542013-08-22 21:25:53 +00002170 // Synthesize trampoline symbols to help navigate the PLT.
Greg Clayton3046e662013-07-10 01:23:25 +00002171 addr_t addr = symbol->d_ptr;
2172 Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get();
2173 if (reloc_section)
Michael Sartaina7499c92013-07-01 19:45:50 +00002174 {
Greg Clayton3046e662013-07-10 01:23:25 +00002175 user_id_t reloc_id = reloc_section->GetID();
2176 const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id);
2177 assert(reloc_header);
Michael Sartaina7499c92013-07-01 19:45:50 +00002178
Greg Clayton3046e662013-07-10 01:23:25 +00002179 ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id);
Michael Sartaina7499c92013-07-01 19:45:50 +00002180 }
2181 }
Michael Sartaina7499c92013-07-01 19:45:50 +00002182 }
Andrew MacPherson17220c12014-03-05 10:12:43 +00002183
2184 for (SectionHeaderCollIter I = m_section_headers.begin();
2185 I != m_section_headers.end(); ++I)
2186 {
2187 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL)
2188 {
2189 if (CalculateType() == eTypeObjectFile)
2190 {
2191 const char *section_name = I->section_name.AsCString("");
2192 if (strstr(section_name, ".rela.debug") ||
2193 strstr(section_name, ".rel.debug"))
2194 {
2195 const ELFSectionHeader &reloc_header = *I;
2196 user_id_t reloc_id = SectionIndex(I);
2197 RelocateDebugSections(&reloc_header, reloc_id);
2198 }
2199 }
2200 }
2201 }
Greg Clayton3046e662013-07-10 01:23:25 +00002202 return m_symtab_ap.get();
2203}
2204
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002205Symbol *
2206ObjectFileELF::ResolveSymbolForAddress(const Address& so_addr, bool verify_unique)
2207{
2208 if (!m_symtab_ap.get())
2209 return nullptr; // GetSymtab() should be called first.
2210
2211 const SectionList *section_list = GetSectionList();
2212 if (!section_list)
2213 return nullptr;
2214
2215 if (DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo())
2216 {
2217 AddressRange range;
2218 if (eh_frame->GetAddressRange (so_addr, range))
2219 {
2220 const addr_t file_addr = range.GetBaseAddress().GetFileAddress();
2221 Symbol * symbol = verify_unique ? m_symtab_ap->FindSymbolContainingFileAddress(file_addr) : nullptr;
2222 if (symbol)
2223 return symbol;
2224
2225 // Note that a (stripped) symbol won't be found by GetSymtab()...
2226 lldb::SectionSP eh_sym_section_sp = section_list->FindSectionContainingFileAddress(file_addr);
2227 if (eh_sym_section_sp.get())
2228 {
2229 addr_t section_base = eh_sym_section_sp->GetFileAddress();
2230 addr_t offset = file_addr - section_base;
2231 uint64_t symbol_id = m_symtab_ap->GetNumSymbols();
2232
2233 Symbol eh_symbol(
2234 symbol_id, // Symbol table index.
2235 "???", // Symbol name.
2236 false, // Is the symbol name mangled?
2237 eSymbolTypeCode, // Type of this symbol.
2238 true, // Is this globally visible?
2239 false, // Is this symbol debug info?
2240 false, // Is this symbol a trampoline?
2241 true, // Is this symbol artificial?
2242 eh_sym_section_sp, // Section in which this symbol is defined or null.
2243 offset, // Offset in section or symbol value.
2244 range.GetByteSize(), // Size in bytes of this symbol.
2245 true, // Size is valid.
2246 0); // Symbol flags.
2247 if (symbol_id == m_symtab_ap->AddSymbol(eh_symbol))
2248 return m_symtab_ap->SymbolAtIndex(symbol_id);
2249 }
2250 }
2251 }
2252 return nullptr;
2253}
2254
2255
Greg Clayton3046e662013-07-10 01:23:25 +00002256bool
2257ObjectFileELF::IsStripped ()
2258{
2259 // TODO: determine this for ELF
2260 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002261}
2262
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002263//===----------------------------------------------------------------------===//
2264// Dump
2265//
2266// Dump the specifics of the runtime file container (such as any headers
2267// segments, sections, etc).
2268//----------------------------------------------------------------------
2269void
2270ObjectFileELF::Dump(Stream *s)
2271{
2272 DumpELFHeader(s, m_header);
2273 s->EOL();
2274 DumpELFProgramHeaders(s);
2275 s->EOL();
2276 DumpELFSectionHeaders(s);
2277 s->EOL();
2278 SectionList *section_list = GetSectionList();
2279 if (section_list)
Greg Clayton10177aa2010-12-08 05:08:21 +00002280 section_list->Dump(s, NULL, true, UINT32_MAX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002281 Symtab *symtab = GetSymtab();
2282 if (symtab)
Greg Claytone0d378b2011-03-24 21:19:54 +00002283 symtab->Dump(s, NULL, eSortOrderNone);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002284 s->EOL();
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002285 DumpDependentModules(s);
2286 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002287}
2288
2289//----------------------------------------------------------------------
2290// DumpELFHeader
2291//
2292// Dump the ELF header to the specified output stream
2293//----------------------------------------------------------------------
2294void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002295ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002296{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002297 s->PutCString("ELF Header\n");
2298 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2299 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n",
2300 header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]);
2301 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n",
2302 header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]);
2303 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n",
2304 header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002305
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002306 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2307 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002308 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2309 s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2310 s->Printf ("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
2311
2312 s->Printf("e_type = 0x%4.4x ", header.e_type);
2313 DumpELFHeader_e_type(s, header.e_type);
2314 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
2315 s->Printf("e_version = 0x%8.8x\n", header.e_version);
Daniel Malead01b2952012-11-29 21:49:15 +00002316 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
2317 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
2318 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002319 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
2320 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
2321 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
2322 s->Printf("e_phnum = 0x%4.4x\n", header.e_phnum);
2323 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
2324 s->Printf("e_shnum = 0x%4.4x\n", header.e_shnum);
2325 s->Printf("e_shstrndx = 0x%4.4x\n", header.e_shstrndx);
2326}
2327
2328//----------------------------------------------------------------------
2329// DumpELFHeader_e_type
2330//
2331// Dump an token value for the ELF header member e_type
2332//----------------------------------------------------------------------
2333void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002334ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002335{
2336 switch (e_type)
2337 {
2338 case ET_NONE: *s << "ET_NONE"; break;
2339 case ET_REL: *s << "ET_REL"; break;
2340 case ET_EXEC: *s << "ET_EXEC"; break;
2341 case ET_DYN: *s << "ET_DYN"; break;
2342 case ET_CORE: *s << "ET_CORE"; break;
2343 default:
2344 break;
2345 }
2346}
2347
2348//----------------------------------------------------------------------
2349// DumpELFHeader_e_ident_EI_DATA
2350//
2351// Dump an token value for the ELF header member e_ident[EI_DATA]
2352//----------------------------------------------------------------------
2353void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002354ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002355{
2356 switch (ei_data)
2357 {
2358 case ELFDATANONE: *s << "ELFDATANONE"; break;
2359 case ELFDATA2LSB: *s << "ELFDATA2LSB - Little Endian"; break;
2360 case ELFDATA2MSB: *s << "ELFDATA2MSB - Big Endian"; break;
2361 default:
2362 break;
2363 }
2364}
2365
2366
2367//----------------------------------------------------------------------
2368// DumpELFProgramHeader
2369//
2370// Dump a single ELF program header to the specified output stream
2371//----------------------------------------------------------------------
2372void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002373ObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002374{
2375 DumpELFProgramHeader_p_type(s, ph.p_type);
Daniel Malead01b2952012-11-29 21:49:15 +00002376 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr);
2377 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 +00002378
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002379 DumpELFProgramHeader_p_flags(s, ph.p_flags);
Daniel Malead01b2952012-11-29 21:49:15 +00002380 s->Printf(") %8.8" PRIx64, ph.p_align);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002381}
2382
2383//----------------------------------------------------------------------
2384// DumpELFProgramHeader_p_type
2385//
2386// Dump an token value for the ELF program header member p_type which
2387// describes the type of the program header
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002388// ----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002389void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002390ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002391{
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00002392 const int kStrWidth = 15;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002393 switch (p_type)
2394 {
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00002395 CASE_AND_STREAM(s, PT_NULL , kStrWidth);
2396 CASE_AND_STREAM(s, PT_LOAD , kStrWidth);
2397 CASE_AND_STREAM(s, PT_DYNAMIC , kStrWidth);
2398 CASE_AND_STREAM(s, PT_INTERP , kStrWidth);
2399 CASE_AND_STREAM(s, PT_NOTE , kStrWidth);
2400 CASE_AND_STREAM(s, PT_SHLIB , kStrWidth);
2401 CASE_AND_STREAM(s, PT_PHDR , kStrWidth);
2402 CASE_AND_STREAM(s, PT_TLS , kStrWidth);
2403 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002404 default:
2405 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
2406 break;
2407 }
2408}
2409
2410
2411//----------------------------------------------------------------------
2412// DumpELFProgramHeader_p_flags
2413//
2414// Dump an token value for the ELF program header member p_flags
2415//----------------------------------------------------------------------
2416void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002417ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002418{
2419 *s << ((p_flags & PF_X) ? "PF_X" : " ")
2420 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
2421 << ((p_flags & PF_W) ? "PF_W" : " ")
2422 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
2423 << ((p_flags & PF_R) ? "PF_R" : " ");
2424}
2425
2426//----------------------------------------------------------------------
2427// DumpELFProgramHeaders
2428//
2429// Dump all of the ELF program header to the specified output stream
2430//----------------------------------------------------------------------
2431void
2432ObjectFileELF::DumpELFProgramHeaders(Stream *s)
2433{
2434 if (ParseProgramHeaders())
2435 {
2436 s->PutCString("Program Headers\n");
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00002437 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002438 "p_filesz p_memsz p_flags p_align\n");
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00002439 s->PutCString("==== --------------- -------- -------- -------- "
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002440 "-------- -------- ------------------------- --------\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002441
2442 uint32_t idx = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002443 for (ProgramHeaderCollConstIter I = m_program_headers.begin();
2444 I != m_program_headers.end(); ++I, ++idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002445 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002446 s->Printf("[%2u] ", idx);
2447 ObjectFileELF::DumpELFProgramHeader(s, *I);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002448 s->EOL();
2449 }
2450 }
2451}
2452
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002453//----------------------------------------------------------------------
2454// DumpELFSectionHeader
2455//
2456// Dump a single ELF section header to the specified output stream
2457//----------------------------------------------------------------------
2458void
Michael Sartaina7499c92013-07-01 19:45:50 +00002459ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002460{
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002461 s->Printf("%8.8x ", sh.sh_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002462 DumpELFSectionHeader_sh_type(s, sh.sh_type);
Daniel Malead01b2952012-11-29 21:49:15 +00002463 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002464 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
Daniel Malead01b2952012-11-29 21:49:15 +00002465 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 +00002466 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
Daniel Malead01b2952012-11-29 21:49:15 +00002467 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002468}
2469
2470//----------------------------------------------------------------------
2471// DumpELFSectionHeader_sh_type
2472//
2473// Dump an token value for the ELF section header member sh_type which
2474// describes the type of the section
2475//----------------------------------------------------------------------
2476void
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002477ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002478{
2479 const int kStrWidth = 12;
2480 switch (sh_type)
2481 {
2482 CASE_AND_STREAM(s, SHT_NULL , kStrWidth);
2483 CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth);
2484 CASE_AND_STREAM(s, SHT_SYMTAB , kStrWidth);
2485 CASE_AND_STREAM(s, SHT_STRTAB , kStrWidth);
2486 CASE_AND_STREAM(s, SHT_RELA , kStrWidth);
2487 CASE_AND_STREAM(s, SHT_HASH , kStrWidth);
2488 CASE_AND_STREAM(s, SHT_DYNAMIC , kStrWidth);
2489 CASE_AND_STREAM(s, SHT_NOTE , kStrWidth);
2490 CASE_AND_STREAM(s, SHT_NOBITS , kStrWidth);
2491 CASE_AND_STREAM(s, SHT_REL , kStrWidth);
2492 CASE_AND_STREAM(s, SHT_SHLIB , kStrWidth);
2493 CASE_AND_STREAM(s, SHT_DYNSYM , kStrWidth);
2494 CASE_AND_STREAM(s, SHT_LOPROC , kStrWidth);
2495 CASE_AND_STREAM(s, SHT_HIPROC , kStrWidth);
2496 CASE_AND_STREAM(s, SHT_LOUSER , kStrWidth);
2497 CASE_AND_STREAM(s, SHT_HIUSER , kStrWidth);
2498 default:
2499 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
2500 break;
2501 }
2502}
2503
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002504//----------------------------------------------------------------------
2505// DumpELFSectionHeader_sh_flags
2506//
2507// Dump an token value for the ELF section header member sh_flags
2508//----------------------------------------------------------------------
2509void
Greg Claytonc7bece562013-01-25 18:06:21 +00002510ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002511{
2512 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
2513 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
2514 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
2515 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
2516 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
2517}
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002518
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002519//----------------------------------------------------------------------
2520// DumpELFSectionHeaders
2521//
2522// Dump all of the ELF section header to the specified output stream
2523//----------------------------------------------------------------------
2524void
2525ObjectFileELF::DumpELFSectionHeaders(Stream *s)
2526{
Michael Sartaina7499c92013-07-01 19:45:50 +00002527 if (!ParseSectionHeaders())
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002528 return;
2529
2530 s->PutCString("Section Headers\n");
2531 s->PutCString("IDX name type flags "
2532 "addr offset size link info addralgn "
2533 "entsize Name\n");
2534 s->PutCString("==== -------- ------------ -------------------------------- "
2535 "-------- -------- -------- -------- -------- -------- "
2536 "-------- ====================\n");
2537
2538 uint32_t idx = 0;
2539 for (SectionHeaderCollConstIter I = m_section_headers.begin();
2540 I != m_section_headers.end(); ++I, ++idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002541 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002542 s->Printf("[%2u] ", idx);
2543 ObjectFileELF::DumpELFSectionHeader(s, *I);
Michael Sartaina7499c92013-07-01 19:45:50 +00002544 const char* section_name = I->section_name.AsCString("");
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002545 if (section_name)
2546 *s << ' ' << section_name << "\n";
2547 }
2548}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002549
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002550void
2551ObjectFileELF::DumpDependentModules(lldb_private::Stream *s)
2552{
2553 size_t num_modules = ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002554
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002555 if (num_modules > 0)
2556 {
2557 s->PutCString("Dependent Modules:\n");
2558 for (unsigned i = 0; i < num_modules; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002559 {
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002560 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
2561 s->Printf(" %s\n", spec.GetFilename().GetCString());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002562 }
2563 }
2564}
2565
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002566bool
Greg Clayton514487e2011-02-15 21:59:32 +00002567ObjectFileELF::GetArchitecture (ArchSpec &arch)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002568{
Stephen Wilson3f4200fd2011-02-24 19:16:15 +00002569 if (!ParseHeader())
2570 return false;
2571
Todd Fialab91de782014-06-27 16:52:49 +00002572 // Allow elf notes to be parsed which may affect the detected architecture.
2573 ParseSectionHeaders();
2574
2575 arch = m_arch_spec;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00002576 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002577}
2578
Greg Clayton9e00b6a652011-07-09 00:41:34 +00002579ObjectFile::Type
2580ObjectFileELF::CalculateType()
2581{
2582 switch (m_header.e_type)
2583 {
2584 case llvm::ELF::ET_NONE:
2585 // 0 - No file type
2586 return eTypeUnknown;
2587
2588 case llvm::ELF::ET_REL:
2589 // 1 - Relocatable file
2590 return eTypeObjectFile;
2591
2592 case llvm::ELF::ET_EXEC:
2593 // 2 - Executable file
2594 return eTypeExecutable;
2595
2596 case llvm::ELF::ET_DYN:
2597 // 3 - Shared object file
2598 return eTypeSharedLibrary;
2599
2600 case ET_CORE:
2601 // 4 - Core file
2602 return eTypeCoreFile;
2603
2604 default:
2605 break;
2606 }
2607 return eTypeUnknown;
2608}
2609
2610ObjectFile::Strata
2611ObjectFileELF::CalculateStrata()
2612{
2613 switch (m_header.e_type)
2614 {
2615 case llvm::ELF::ET_NONE:
2616 // 0 - No file type
2617 return eStrataUnknown;
2618
2619 case llvm::ELF::ET_REL:
2620 // 1 - Relocatable file
2621 return eStrataUnknown;
2622
2623 case llvm::ELF::ET_EXEC:
2624 // 2 - Executable file
2625 // TODO: is there any way to detect that an executable is a kernel
2626 // related executable by inspecting the program headers, section
2627 // headers, symbols, or any other flag bits???
2628 return eStrataUser;
2629
2630 case llvm::ELF::ET_DYN:
2631 // 3 - Shared object file
2632 // TODO: is there any way to detect that an shared library is a kernel
2633 // related executable by inspecting the program headers, section
2634 // headers, symbols, or any other flag bits???
2635 return eStrataUnknown;
2636
2637 case ET_CORE:
2638 // 4 - Core file
2639 // TODO: is there any way to detect that an core file is a kernel
2640 // related executable by inspecting the program headers, section
2641 // headers, symbols, or any other flag bits???
2642 return eStrataUnknown;
2643
2644 default:
2645 break;
2646 }
2647 return eStrataUnknown;
2648}
2649