blob: ac7d38c0468025b19ee0ce3982924ff98f7e4466 [file] [log] [blame]
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001//===-- ObjectFileELF.h --------------------------------------- -*- 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#ifndef liblldb_ObjectFileELF_h_
11#define liblldb_ObjectFileELF_h_
12
13#include <stdint.h>
14#include <vector>
15
16#include "lldb/lldb-private.h"
Greg Clayton53239f02011-02-08 05:05:52 +000017#include "lldb/Host/FileSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018#include "lldb/Symbol/ObjectFile.h"
Michael Sartainc836ae72013-05-23 20:57:03 +000019#include "lldb/Core/UUID.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020
Stephen Wilsonf325ba92010-07-13 23:07:23 +000021#include "ELFHeader.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022
Ed Mastec113ff82013-12-02 17:49:13 +000023struct ELFNote
24{
25 elf::elf_word n_namesz;
26 elf::elf_word n_descsz;
27 elf::elf_word n_type;
28
29 std::string n_name;
30
31 ELFNote() : n_namesz(0), n_descsz(0), n_type(0)
32 {
33 }
34
35 /// Parse an ELFNote entry from the given DataExtractor starting at position
36 /// \p offset.
37 ///
38 /// @param[in] data
39 /// The DataExtractor to read from.
40 ///
41 /// @param[in,out] offset
42 /// Pointer to an offset in the data. On return the offset will be
43 /// advanced by the number of bytes read.
44 ///
45 /// @return
46 /// True if the ELFRel entry was successfully read and false otherwise.
47 bool
48 Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
49};
50
Stephen Wilsonf325ba92010-07-13 23:07:23 +000051//------------------------------------------------------------------------------
52/// @class ObjectFileELF
53/// @brief Generic ELF object file reader.
54///
55/// This class provides a generic ELF (32/64 bit) reader plugin implementing the
56/// ObjectFile protocol.
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057class ObjectFileELF :
58 public lldb_private::ObjectFile
59{
60public:
61 //------------------------------------------------------------------
62 // Static Functions
63 //------------------------------------------------------------------
64 static void
65 Initialize();
66
67 static void
68 Terminate();
69
Greg Clayton57abc5d2013-05-10 21:47:16 +000070 static lldb_private::ConstString
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071 GetPluginNameStatic();
72
73 static const char *
74 GetPluginDescriptionStatic();
75
76 static lldb_private::ObjectFile *
Greg Claytone72dfb32012-02-24 01:59:29 +000077 CreateInstance(const lldb::ModuleSP &module_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +000078 lldb::DataBufferSP& data_sp,
79 lldb::offset_t data_offset,
Chris Lattner30fdc8d2010-06-08 16:52:24 +000080 const lldb_private::FileSpec* file,
Greg Clayton5ce9c562013-02-06 17:22:03 +000081 lldb::offset_t file_offset,
82 lldb::offset_t length);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000083
Greg Claytonc9660542012-02-05 02:38:54 +000084 static lldb_private::ObjectFile *
Greg Claytone72dfb32012-02-24 01:59:29 +000085 CreateMemoryInstance (const lldb::ModuleSP &module_sp,
Greg Claytonc9660542012-02-05 02:38:54 +000086 lldb::DataBufferSP& data_sp,
87 const lldb::ProcessSP &process_sp,
88 lldb::addr_t header_addr);
89
Greg Claytonf4d6de62013-04-24 22:29:28 +000090 static size_t
91 GetModuleSpecifications (const lldb_private::FileSpec& file,
92 lldb::DataBufferSP& data_sp,
93 lldb::offset_t data_offset,
94 lldb::offset_t file_offset,
95 lldb::offset_t length,
96 lldb_private::ModuleSpecList &specs);
Michael Sartain9f0013d2013-05-17 00:20:21 +000097
98 static bool
99 MagicBytesMatch (lldb::DataBufferSP& data_sp,
100 lldb::addr_t offset,
101 lldb::addr_t length);
102
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000103 //------------------------------------------------------------------
104 // PluginInterface protocol
105 //------------------------------------------------------------------
Greg Clayton57abc5d2013-05-10 21:47:16 +0000106 virtual lldb_private::ConstString
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000107 GetPluginName();
108
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000109 virtual uint32_t
110 GetPluginVersion();
111
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000112 //------------------------------------------------------------------
113 // ObjectFile Protocol.
114 //------------------------------------------------------------------
115 virtual
116 ~ObjectFileELF();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000118 virtual bool
119 ParseHeader();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000120
Steve Pucci9e02dac2014-02-06 19:02:19 +0000121 virtual bool
Greg Clayton751caf62014-02-07 22:54:47 +0000122 SetLoadAddress (lldb_private::Target &target,
123 lldb::addr_t value,
124 bool value_is_offset);
Steve Pucci9e02dac2014-02-06 19:02:19 +0000125
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000126 virtual lldb::ByteOrder
127 GetByteOrder() const;
128
Jim Ingham5aee1622010-08-09 23:31:02 +0000129 virtual bool
130 IsExecutable () const;
131
Greg Claytonc7bece562013-01-25 18:06:21 +0000132 virtual uint32_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000133 GetAddressByteSize() const;
134
135 virtual lldb_private::Symtab *
Greg Clayton3046e662013-07-10 01:23:25 +0000136 GetSymtab();
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000137
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +0000138 virtual lldb_private::Symbol *
139 ResolveSymbolForAddress(const lldb_private::Address& so_addr, bool verify_unique);
140
Greg Clayton3046e662013-07-10 01:23:25 +0000141 virtual bool
142 IsStripped ();
143
144 virtual void
145 CreateSections (lldb_private::SectionList &unified_section_list);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000146
147 virtual void
148 Dump(lldb_private::Stream *s);
149
150 virtual bool
Greg Clayton514487e2011-02-15 21:59:32 +0000151 GetArchitecture (lldb_private::ArchSpec &arch);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000152
153 virtual bool
154 GetUUID(lldb_private::UUID* uuid);
155
Michael Sartaina7499c92013-07-01 19:45:50 +0000156 virtual lldb_private::FileSpecList
157 GetDebugSymbolFilePaths();
158
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000159 virtual uint32_t
160 GetDependentModules(lldb_private::FileSpecList& files);
161
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000162 virtual lldb_private::Address
Ed Maste54803652013-10-11 17:39:07 +0000163 GetImageInfoAddress(lldb_private::Target *target);
Jim Ingham672e6f52011-03-07 23:44:08 +0000164
165 virtual lldb_private::Address
166 GetEntryPointAddress ();
Greg Clayton9e00b6a652011-07-09 00:41:34 +0000167
168 virtual ObjectFile::Type
169 CalculateType();
170
171 virtual ObjectFile::Strata
172 CalculateStrata();
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000173
Ashok Thirumurthi4822d922013-07-11 20:39:00 +0000174 // Returns number of program headers found in the ELF file.
175 size_t
176 GetProgramHeaderCount();
177
178 // Returns the program header with the given index.
179 const elf::ELFProgramHeader *
180 GetProgramHeaderByIndex(lldb::user_id_t id);
181
182 // Returns segment data for the given index.
183 lldb_private::DataExtractor
184 GetSegmentDataByIndex(lldb::user_id_t id);
185
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000186private:
Greg Claytone72dfb32012-02-24 01:59:29 +0000187 ObjectFileELF(const lldb::ModuleSP &module_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000188 lldb::DataBufferSP& data_sp,
189 lldb::offset_t data_offset,
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000190 const lldb_private::FileSpec* file,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000191 lldb::offset_t offset,
192 lldb::offset_t length);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000193
Andrew MacPherson17220c12014-03-05 10:12:43 +0000194 ObjectFileELF (const lldb::ModuleSP &module_sp,
195 lldb::DataBufferSP& data_sp,
196 const lldb::ProcessSP &process_sp,
197 lldb::addr_t header_addr);
198
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000199 typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000200 typedef ProgramHeaderColl::iterator ProgramHeaderCollIter;
201 typedef ProgramHeaderColl::const_iterator ProgramHeaderCollConstIter;
202
Michael Sartaina7499c92013-07-01 19:45:50 +0000203 struct ELFSectionHeaderInfo : public elf::ELFSectionHeader
204 {
205 lldb_private::ConstString section_name;
206 };
207 typedef std::vector<ELFSectionHeaderInfo> SectionHeaderColl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000208 typedef SectionHeaderColl::iterator SectionHeaderCollIter;
209 typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter;
210
Stephen Wilson499b40e2011-03-30 16:07:05 +0000211 typedef std::vector<elf::ELFDynamic> DynamicSymbolColl;
212 typedef DynamicSymbolColl::iterator DynamicSymbolCollIter;
213 typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter;
214
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000215 /// Version of this reader common to all plugins based on this class.
216 static const uint32_t m_plugin_version = 1;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000217 static const uint32_t g_core_uuid_magic;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000218
219 /// ELF file header.
220 elf::ELFHeader m_header;
221
Michael Sartaina7499c92013-07-01 19:45:50 +0000222 /// ELF build ID.
Michael Sartainc836ae72013-05-23 20:57:03 +0000223 lldb_private::UUID m_uuid;
224
Michael Sartaina7499c92013-07-01 19:45:50 +0000225 /// ELF .gnu_debuglink file and crc data if available.
226 std::string m_gnu_debuglink_file;
227 uint32_t m_gnu_debuglink_crc;
228
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000229 /// Collection of program headers.
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000230 ProgramHeaderColl m_program_headers;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000231
232 /// Collection of section headers.
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000233 SectionHeaderColl m_section_headers;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000234
Stephen Wilson499b40e2011-03-30 16:07:05 +0000235 /// Collection of symbols from the dynamic table.
236 DynamicSymbolColl m_dynamic_symbols;
237
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000238 /// List of file specifications corresponding to the modules (shared
239 /// libraries) on which this object file depends.
Greg Clayton7b0992d2013-04-18 22:45:39 +0000240 mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_ap;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000241
Jim Ingham672e6f52011-03-07 23:44:08 +0000242 /// Cached value of the entry point for this module.
243 lldb_private::Address m_entry_point_address;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000244
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000245 /// Returns a 1 based index of the given section header.
Greg Claytonc7bece562013-01-25 18:06:21 +0000246 size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000247 SectionIndex(const SectionHeaderCollIter &I);
248
249 /// Returns a 1 based index of the given section header.
Greg Claytonc7bece562013-01-25 18:06:21 +0000250 size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000251 SectionIndex(const SectionHeaderCollConstIter &I) const;
252
Todd Fiala4339f3a2014-03-25 19:29:09 +0000253 // Parses the ELF program headers.
254 static size_t
255 GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
256 lldb_private::DataExtractor &data,
257 const elf::ELFHeader &header);
258
259 // Finds PT_NOTE segments and calculates their crc sum.
260 static uint32_t
261 CalculateELFNotesSegmentsCRC32(const ProgramHeaderColl& program_headers,
262 lldb_private::DataExtractor &data);
263
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000264 /// Parses all section headers present in this object file and populates
265 /// m_program_headers. This method will compute the header list only once.
266 /// Returns the number of headers parsed.
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000267 size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000268 ParseProgramHeaders();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000269
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000270 /// Parses all section headers present in this object file and populates
271 /// m_section_headers. This method will compute the header list only once.
272 /// Returns the number of headers parsed.
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000273 size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000274 ParseSectionHeaders();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000275
Michael Sartaina7499c92013-07-01 19:45:50 +0000276 /// Parses the elf section headers and returns the uuid, debug link name, crc.
277 static size_t
278 GetSectionHeaderInfo(SectionHeaderColl &section_headers,
279 lldb_private::DataExtractor &data,
280 const elf::ELFHeader &header,
281 lldb_private::UUID &uuid,
282 std::string &gnu_debuglink_file,
283 uint32_t &gnu_debuglink_crc);
284
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000285 /// Scans the dynamic section and locates all dependent modules (shared
Greg Clayton710dd5a2011-01-08 20:28:42 +0000286 /// libraries) populating m_filespec_ap. This method will compute the
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000287 /// dependent module list only once. Returns the number of dependent
288 /// modules parsed.
289 size_t
290 ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000291
Stephen Wilson499b40e2011-03-30 16:07:05 +0000292 /// Parses the dynamic symbol table and populates m_dynamic_symbols. The
293 /// vector retains the order as found in the object file. Returns the
294 /// number of dynamic symbols parsed.
295 size_t
296 ParseDynamicSymbols();
297
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000298 /// Populates m_symtab_ap will all non-dynamic linker symbols. This method
299 /// will parse the symbols only once. Returns the number of symbols parsed.
Stephen Wilson499b40e2011-03-30 16:07:05 +0000300 unsigned
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000301 ParseSymbolTable(lldb_private::Symtab *symbol_table,
Stephen Wilson499b40e2011-03-30 16:07:05 +0000302 lldb::user_id_t start_id,
Greg Clayton3046e662013-07-10 01:23:25 +0000303 lldb_private::Section *symtab);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000304
Michael Sartaina7499c92013-07-01 19:45:50 +0000305 /// Helper routine for ParseSymbolTable().
306 unsigned
307 ParseSymbols(lldb_private::Symtab *symbol_table,
308 lldb::user_id_t start_id,
309 lldb_private::SectionList *section_list,
Greg Clayton3046e662013-07-10 01:23:25 +0000310 const size_t num_symbols,
Michael Sartaina7499c92013-07-01 19:45:50 +0000311 const lldb_private::DataExtractor &symtab_data,
312 const lldb_private::DataExtractor &strtab_data);
313
Stephen Wilson499b40e2011-03-30 16:07:05 +0000314 /// Scans the relocation entries and adds a set of artificial symbols to the
315 /// given symbol table for each PLT slot. Returns the number of symbols
316 /// added.
317 unsigned
318 ParseTrampolineSymbols(lldb_private::Symtab *symbol_table,
319 lldb::user_id_t start_id,
Michael Sartaina7499c92013-07-01 19:45:50 +0000320 const ELFSectionHeaderInfo *rela_hdr,
Stephen Wilson499b40e2011-03-30 16:07:05 +0000321 lldb::user_id_t section_id);
322
Andrew MacPherson17220c12014-03-05 10:12:43 +0000323 /// Relocates debug sections
324 unsigned
325 RelocateDebugSections(const elf::ELFSectionHeader *rel_hdr, lldb::user_id_t rel_id);
326
327 unsigned
328 RelocateSection(lldb_private::Symtab* symtab, const elf::ELFHeader *hdr, const elf::ELFSectionHeader *rel_hdr,
329 const elf::ELFSectionHeader *symtab_hdr, const elf::ELFSectionHeader *debug_hdr,
330 lldb_private::DataExtractor &rel_data, lldb_private::DataExtractor &symtab_data,
331 lldb_private::DataExtractor &debug_data, lldb_private::Section* rel_section);
332
333 /// Loads the section name string table into m_shstr_data. Returns the
334 /// number of bytes constituting the table.
335 size_t
336 GetSectionHeaderStringTable();
337
338 /// Utility method for looking up a section given its name. Returns the
339 /// index of the corresponding section or zero if no section with the given
340 /// name can be found (note that section indices are always 1 based, and so
341 /// section index 0 is never valid).
342 lldb::user_id_t
343 GetSectionIndexByName(const char *name);
344
345 // Returns the ID of the first section that has the given type.
346 lldb::user_id_t
347 GetSectionIndexByType(unsigned type);
348
Stephen Wilson499b40e2011-03-30 16:07:05 +0000349 /// Returns the section header with the given id or NULL.
Michael Sartaina7499c92013-07-01 19:45:50 +0000350 const ELFSectionHeaderInfo *
Stephen Wilson499b40e2011-03-30 16:07:05 +0000351 GetSectionHeaderByIndex(lldb::user_id_t id);
352
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000353 /// @name ELF header dump routines
354 //@{
355 static void
356 DumpELFHeader(lldb_private::Stream *s, const elf::ELFHeader& header);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000357
358 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000359 DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s,
360 unsigned char ei_data);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000361
362 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000363 DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type);
364 //@}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000365
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000366 /// @name ELF program header dump routines
367 //@{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000368 void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000369 DumpELFProgramHeaders(lldb_private::Stream *s);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000370
371 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000372 DumpELFProgramHeader(lldb_private::Stream *s,
373 const elf::ELFProgramHeader &ph);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000374
375 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000376 DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377
378 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000379 DumpELFProgramHeader_p_flags(lldb_private::Stream *s,
380 elf::elf_word p_flags);
381 //@}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000382
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000383 /// @name ELF section header dump routines
384 //@{
385 void
386 DumpELFSectionHeaders(lldb_private::Stream *s);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000387
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000388 static void
389 DumpELFSectionHeader(lldb_private::Stream *s,
Michael Sartaina7499c92013-07-01 19:45:50 +0000390 const ELFSectionHeaderInfo& sh);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000391
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000392 static void
393 DumpELFSectionHeader_sh_type(lldb_private::Stream *s,
394 elf::elf_word sh_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000395
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000396 static void
397 DumpELFSectionHeader_sh_flags(lldb_private::Stream *s,
Greg Claytonc7bece562013-01-25 18:06:21 +0000398 elf::elf_xword sh_flags);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000399 //@}
400
401 /// ELF dependent module dump routine.
402 void
403 DumpDependentModules(lldb_private::Stream *s);
404
Stephen Wilson499b40e2011-03-30 16:07:05 +0000405 const elf::ELFDynamic *
406 FindDynamicSymbol(unsigned tag);
407
Stephen Wilson499b40e2011-03-30 16:07:05 +0000408 unsigned
409 PLTRelocationType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000410};
411
412#endif // #ifndef liblldb_ObjectFileELF_h_