blob: d66b6a1f25248e9115a84fd2ef5cffac6356a563 [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
Stephen Wilsonf325ba92010-07-13 23:07:23 +000023//------------------------------------------------------------------------------
24/// @class ObjectFileELF
25/// @brief Generic ELF object file reader.
26///
27/// This class provides a generic ELF (32/64 bit) reader plugin implementing the
28/// ObjectFile protocol.
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029class ObjectFileELF :
30 public lldb_private::ObjectFile
31{
32public:
33 //------------------------------------------------------------------
34 // Static Functions
35 //------------------------------------------------------------------
36 static void
37 Initialize();
38
39 static void
40 Terminate();
41
Greg Clayton57abc5d2013-05-10 21:47:16 +000042 static lldb_private::ConstString
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043 GetPluginNameStatic();
44
45 static const char *
46 GetPluginDescriptionStatic();
47
48 static lldb_private::ObjectFile *
Greg Claytone72dfb32012-02-24 01:59:29 +000049 CreateInstance(const lldb::ModuleSP &module_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +000050 lldb::DataBufferSP& data_sp,
51 lldb::offset_t data_offset,
Chris Lattner30fdc8d2010-06-08 16:52:24 +000052 const lldb_private::FileSpec* file,
Greg Clayton5ce9c562013-02-06 17:22:03 +000053 lldb::offset_t file_offset,
54 lldb::offset_t length);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055
Greg Claytonc9660542012-02-05 02:38:54 +000056 static lldb_private::ObjectFile *
Greg Claytone72dfb32012-02-24 01:59:29 +000057 CreateMemoryInstance (const lldb::ModuleSP &module_sp,
Greg Claytonc9660542012-02-05 02:38:54 +000058 lldb::DataBufferSP& data_sp,
59 const lldb::ProcessSP &process_sp,
60 lldb::addr_t header_addr);
61
Greg Claytonf4d6de62013-04-24 22:29:28 +000062 static size_t
63 GetModuleSpecifications (const lldb_private::FileSpec& file,
64 lldb::DataBufferSP& data_sp,
65 lldb::offset_t data_offset,
66 lldb::offset_t file_offset,
67 lldb::offset_t length,
68 lldb_private::ModuleSpecList &specs);
Michael Sartain9f0013d2013-05-17 00:20:21 +000069
70 static bool
71 MagicBytesMatch (lldb::DataBufferSP& data_sp,
72 lldb::addr_t offset,
73 lldb::addr_t length);
74
Chris Lattner30fdc8d2010-06-08 16:52:24 +000075 //------------------------------------------------------------------
76 // PluginInterface protocol
77 //------------------------------------------------------------------
Greg Clayton57abc5d2013-05-10 21:47:16 +000078 virtual lldb_private::ConstString
Chris Lattner30fdc8d2010-06-08 16:52:24 +000079 GetPluginName();
80
Chris Lattner30fdc8d2010-06-08 16:52:24 +000081 virtual uint32_t
82 GetPluginVersion();
83
Stephen Wilsonf325ba92010-07-13 23:07:23 +000084 //------------------------------------------------------------------
85 // ObjectFile Protocol.
86 //------------------------------------------------------------------
87 virtual
88 ~ObjectFileELF();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000089
Stephen Wilsonf325ba92010-07-13 23:07:23 +000090 virtual bool
91 ParseHeader();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000092
Stephen Wilsonf325ba92010-07-13 23:07:23 +000093 virtual lldb::ByteOrder
94 GetByteOrder() const;
95
Jim Ingham5aee1622010-08-09 23:31:02 +000096 virtual bool
97 IsExecutable () const;
98
Greg Claytonc7bece562013-01-25 18:06:21 +000099 virtual uint32_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000100 GetAddressByteSize() const;
101
102 virtual lldb_private::Symtab *
Greg Clayton3046e662013-07-10 01:23:25 +0000103 GetSymtab();
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000104
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +0000105 virtual lldb_private::Symbol *
106 ResolveSymbolForAddress(const lldb_private::Address& so_addr, bool verify_unique);
107
Greg Clayton3046e662013-07-10 01:23:25 +0000108 virtual bool
109 IsStripped ();
110
111 virtual void
112 CreateSections (lldb_private::SectionList &unified_section_list);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000113
114 virtual void
115 Dump(lldb_private::Stream *s);
116
117 virtual bool
Greg Clayton514487e2011-02-15 21:59:32 +0000118 GetArchitecture (lldb_private::ArchSpec &arch);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000119
120 virtual bool
121 GetUUID(lldb_private::UUID* uuid);
122
Michael Sartaina7499c92013-07-01 19:45:50 +0000123 virtual lldb_private::FileSpecList
124 GetDebugSymbolFilePaths();
125
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000126 virtual uint32_t
127 GetDependentModules(lldb_private::FileSpecList& files);
128
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000129 virtual lldb_private::Address
130 GetImageInfoAddress();
Jim Ingham672e6f52011-03-07 23:44:08 +0000131
132 virtual lldb_private::Address
133 GetEntryPointAddress ();
Greg Clayton9e00b6a652011-07-09 00:41:34 +0000134
135 virtual ObjectFile::Type
136 CalculateType();
137
138 virtual ObjectFile::Strata
139 CalculateStrata();
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000140
Ashok Thirumurthi4822d922013-07-11 20:39:00 +0000141 // Returns number of program headers found in the ELF file.
142 size_t
143 GetProgramHeaderCount();
144
145 // Returns the program header with the given index.
146 const elf::ELFProgramHeader *
147 GetProgramHeaderByIndex(lldb::user_id_t id);
148
149 // Returns segment data for the given index.
150 lldb_private::DataExtractor
151 GetSegmentDataByIndex(lldb::user_id_t id);
152
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000153private:
Greg Claytone72dfb32012-02-24 01:59:29 +0000154 ObjectFileELF(const lldb::ModuleSP &module_sp,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000155 lldb::DataBufferSP& data_sp,
156 lldb::offset_t data_offset,
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000157 const lldb_private::FileSpec* file,
Greg Clayton5ce9c562013-02-06 17:22:03 +0000158 lldb::offset_t offset,
159 lldb::offset_t length);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000160
161 typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000162 typedef ProgramHeaderColl::iterator ProgramHeaderCollIter;
163 typedef ProgramHeaderColl::const_iterator ProgramHeaderCollConstIter;
164
Michael Sartaina7499c92013-07-01 19:45:50 +0000165 struct ELFSectionHeaderInfo : public elf::ELFSectionHeader
166 {
167 lldb_private::ConstString section_name;
168 };
169 typedef std::vector<ELFSectionHeaderInfo> SectionHeaderColl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000170 typedef SectionHeaderColl::iterator SectionHeaderCollIter;
171 typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter;
172
Stephen Wilson499b40e2011-03-30 16:07:05 +0000173 typedef std::vector<elf::ELFDynamic> DynamicSymbolColl;
174 typedef DynamicSymbolColl::iterator DynamicSymbolCollIter;
175 typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter;
176
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000177 /// Version of this reader common to all plugins based on this class.
178 static const uint32_t m_plugin_version = 1;
179
180 /// ELF file header.
181 elf::ELFHeader m_header;
182
Michael Sartaina7499c92013-07-01 19:45:50 +0000183 /// ELF build ID.
Michael Sartainc836ae72013-05-23 20:57:03 +0000184 lldb_private::UUID m_uuid;
185
Michael Sartaina7499c92013-07-01 19:45:50 +0000186 /// ELF .gnu_debuglink file and crc data if available.
187 std::string m_gnu_debuglink_file;
188 uint32_t m_gnu_debuglink_crc;
189
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000190 /// Collection of program headers.
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000191 ProgramHeaderColl m_program_headers;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000192
193 /// Collection of section headers.
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000194 SectionHeaderColl m_section_headers;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000195
Stephen Wilson499b40e2011-03-30 16:07:05 +0000196 /// Collection of symbols from the dynamic table.
197 DynamicSymbolColl m_dynamic_symbols;
198
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000199 /// List of file specifications corresponding to the modules (shared
200 /// libraries) on which this object file depends.
Greg Clayton7b0992d2013-04-18 22:45:39 +0000201 mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_ap;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000202
Jim Ingham672e6f52011-03-07 23:44:08 +0000203 /// Cached value of the entry point for this module.
204 lldb_private::Address m_entry_point_address;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000205
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000206 /// Returns a 1 based index of the given section header.
Greg Claytonc7bece562013-01-25 18:06:21 +0000207 size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000208 SectionIndex(const SectionHeaderCollIter &I);
209
210 /// Returns a 1 based index of the given section header.
Greg Claytonc7bece562013-01-25 18:06:21 +0000211 size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000212 SectionIndex(const SectionHeaderCollConstIter &I) const;
213
214 /// Parses all section headers present in this object file and populates
215 /// m_program_headers. This method will compute the header list only once.
216 /// Returns the number of headers parsed.
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000217 size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000218 ParseProgramHeaders();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000219
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000220 /// Parses all section headers present in this object file and populates
221 /// m_section_headers. This method will compute the header list only once.
222 /// Returns the number of headers parsed.
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000223 size_t
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000224 ParseSectionHeaders();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000225
Michael Sartaina7499c92013-07-01 19:45:50 +0000226 /// Parses the elf section headers and returns the uuid, debug link name, crc.
227 static size_t
228 GetSectionHeaderInfo(SectionHeaderColl &section_headers,
229 lldb_private::DataExtractor &data,
230 const elf::ELFHeader &header,
231 lldb_private::UUID &uuid,
232 std::string &gnu_debuglink_file,
233 uint32_t &gnu_debuglink_crc);
234
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000235 /// Scans the dynamic section and locates all dependent modules (shared
Greg Clayton710dd5a2011-01-08 20:28:42 +0000236 /// libraries) populating m_filespec_ap. This method will compute the
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000237 /// dependent module list only once. Returns the number of dependent
238 /// modules parsed.
239 size_t
240 ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000241
Stephen Wilson499b40e2011-03-30 16:07:05 +0000242 /// Parses the dynamic symbol table and populates m_dynamic_symbols. The
243 /// vector retains the order as found in the object file. Returns the
244 /// number of dynamic symbols parsed.
245 size_t
246 ParseDynamicSymbols();
247
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000248 /// Populates m_symtab_ap will all non-dynamic linker symbols. This method
249 /// will parse the symbols only once. Returns the number of symbols parsed.
Stephen Wilson499b40e2011-03-30 16:07:05 +0000250 unsigned
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000251 ParseSymbolTable(lldb_private::Symtab *symbol_table,
Stephen Wilson499b40e2011-03-30 16:07:05 +0000252 lldb::user_id_t start_id,
Greg Clayton3046e662013-07-10 01:23:25 +0000253 lldb_private::Section *symtab);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000254
Michael Sartaina7499c92013-07-01 19:45:50 +0000255 /// Helper routine for ParseSymbolTable().
256 unsigned
257 ParseSymbols(lldb_private::Symtab *symbol_table,
258 lldb::user_id_t start_id,
259 lldb_private::SectionList *section_list,
Greg Clayton3046e662013-07-10 01:23:25 +0000260 const size_t num_symbols,
Michael Sartaina7499c92013-07-01 19:45:50 +0000261 const lldb_private::DataExtractor &symtab_data,
262 const lldb_private::DataExtractor &strtab_data);
263
Stephen Wilson499b40e2011-03-30 16:07:05 +0000264 /// Scans the relocation entries and adds a set of artificial symbols to the
265 /// given symbol table for each PLT slot. Returns the number of symbols
266 /// added.
267 unsigned
268 ParseTrampolineSymbols(lldb_private::Symtab *symbol_table,
269 lldb::user_id_t start_id,
Michael Sartaina7499c92013-07-01 19:45:50 +0000270 const ELFSectionHeaderInfo *rela_hdr,
Stephen Wilson499b40e2011-03-30 16:07:05 +0000271 lldb::user_id_t section_id);
272
Stephen Wilson499b40e2011-03-30 16:07:05 +0000273 /// Returns the section header with the given id or NULL.
Michael Sartaina7499c92013-07-01 19:45:50 +0000274 const ELFSectionHeaderInfo *
Stephen Wilson499b40e2011-03-30 16:07:05 +0000275 GetSectionHeaderByIndex(lldb::user_id_t id);
276
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000277 /// @name ELF header dump routines
278 //@{
279 static void
280 DumpELFHeader(lldb_private::Stream *s, const elf::ELFHeader& header);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000281
282 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000283 DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s,
284 unsigned char ei_data);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000285
286 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000287 DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type);
288 //@}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000289
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000290 /// @name ELF program header dump routines
291 //@{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000292 void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000293 DumpELFProgramHeaders(lldb_private::Stream *s);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000294
295 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000296 DumpELFProgramHeader(lldb_private::Stream *s,
297 const elf::ELFProgramHeader &ph);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000298
299 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000300 DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000301
302 static void
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000303 DumpELFProgramHeader_p_flags(lldb_private::Stream *s,
304 elf::elf_word p_flags);
305 //@}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000306
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000307 /// @name ELF section header dump routines
308 //@{
309 void
310 DumpELFSectionHeaders(lldb_private::Stream *s);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000311
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000312 static void
313 DumpELFSectionHeader(lldb_private::Stream *s,
Michael Sartaina7499c92013-07-01 19:45:50 +0000314 const ELFSectionHeaderInfo& sh);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000315
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000316 static void
317 DumpELFSectionHeader_sh_type(lldb_private::Stream *s,
318 elf::elf_word sh_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000319
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000320 static void
321 DumpELFSectionHeader_sh_flags(lldb_private::Stream *s,
Greg Claytonc7bece562013-01-25 18:06:21 +0000322 elf::elf_xword sh_flags);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000323 //@}
324
325 /// ELF dependent module dump routine.
326 void
327 DumpDependentModules(lldb_private::Stream *s);
328
Stephen Wilson499b40e2011-03-30 16:07:05 +0000329 const elf::ELFDynamic *
330 FindDynamicSymbol(unsigned tag);
331
Stephen Wilson499b40e2011-03-30 16:07:05 +0000332 unsigned
333 PLTRelocationType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000334};
335
336#endif // #ifndef liblldb_ObjectFileELF_h_