1 //===-- ObjectFileELF.h --------------------------------------- -*- C++ -*-===//
2 //
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"
17 #include "lldb/Host/FileSpec.h"
18 #include "lldb/Symbol/ObjectFile.h"
19 #include "lldb/Core/UUID.h"
20 
21 #include "ELFHeader.h"
22 
23 struct 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 
51 //------------------------------------------------------------------------------
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.
57 class ObjectFileELF :
58     public lldb_private::ObjectFile
59 {
60 public:
61     //------------------------------------------------------------------
62     // Static Functions
63     //------------------------------------------------------------------
64     static void
65     Initialize();
66 
67     static void
68     Terminate();
69 
70     static lldb_private::ConstString
71     GetPluginNameStatic();
72 
73     static const char *
74     GetPluginDescriptionStatic();
75 
76     static lldb_private::ObjectFile *
77     CreateInstance(const lldb::ModuleSP &module_sp,
78                    lldb::DataBufferSP& data_sp,
79                    lldb::offset_t data_offset,
80                    const lldb_private::FileSpec* file,
81                    lldb::offset_t file_offset,
82                    lldb::offset_t length);
83 
84     static lldb_private::ObjectFile *
85     CreateMemoryInstance (const lldb::ModuleSP &module_sp,
86                           lldb::DataBufferSP& data_sp,
87                           const lldb::ProcessSP &process_sp,
88                           lldb::addr_t header_addr);
89 
90     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);
97 
98     static bool
99     MagicBytesMatch (lldb::DataBufferSP& data_sp,
100                      lldb::addr_t offset,
101                      lldb::addr_t length);
102 
103     //------------------------------------------------------------------
104     // PluginInterface protocol
105     //------------------------------------------------------------------
106     virtual lldb_private::ConstString
107     GetPluginName();
108 
109     virtual uint32_t
110     GetPluginVersion();
111 
112     //------------------------------------------------------------------
113     // ObjectFile Protocol.
114     //------------------------------------------------------------------
115     virtual
116     ~ObjectFileELF();
117 
118     virtual bool
119     ParseHeader();
120 
121     virtual bool
122     SetLoadAddress (lldb_private::Target &target,
123                     lldb::addr_t value,
124                     bool value_is_offset);
125 
126     virtual lldb::ByteOrder
127     GetByteOrder() const;
128 
129     virtual bool
130     IsExecutable () const;
131 
132     virtual uint32_t
133     GetAddressByteSize() const;
134 
135     virtual lldb_private::Symtab *
136     GetSymtab();
137 
138     virtual lldb_private::Symbol *
139     ResolveSymbolForAddress(const lldb_private::Address& so_addr, bool verify_unique);
140 
141     virtual bool
142     IsStripped ();
143 
144     virtual void
145     CreateSections (lldb_private::SectionList &unified_section_list);
146 
147     virtual void
148     Dump(lldb_private::Stream *s);
149 
150     virtual bool
151     GetArchitecture (lldb_private::ArchSpec &arch);
152 
153     virtual bool
154     GetUUID(lldb_private::UUID* uuid);
155 
156     virtual lldb_private::FileSpecList
157     GetDebugSymbolFilePaths();
158 
159     virtual uint32_t
160     GetDependentModules(lldb_private::FileSpecList& files);
161 
162     virtual lldb_private::Address
163     GetImageInfoAddress(lldb_private::Target *target);
164 
165     virtual lldb_private::Address
166     GetEntryPointAddress ();
167 
168     virtual ObjectFile::Type
169     CalculateType();
170 
171     virtual ObjectFile::Strata
172     CalculateStrata();
173 
174     // 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 
186 private:
187     ObjectFileELF(const lldb::ModuleSP &module_sp,
188                   lldb::DataBufferSP& data_sp,
189                   lldb::offset_t data_offset,
190                   const lldb_private::FileSpec* file,
191                   lldb::offset_t offset,
192                   lldb::offset_t length);
193 
194     ObjectFileELF (const lldb::ModuleSP &module_sp,
195                    lldb::DataBufferSP& data_sp,
196                    const lldb::ProcessSP &process_sp,
197                    lldb::addr_t header_addr);
198 
199     typedef std::vector<elf::ELFProgramHeader>  ProgramHeaderColl;
200     typedef ProgramHeaderColl::iterator         ProgramHeaderCollIter;
201     typedef ProgramHeaderColl::const_iterator   ProgramHeaderCollConstIter;
202 
203     struct ELFSectionHeaderInfo : public elf::ELFSectionHeader
204     {
205         lldb_private::ConstString section_name;
206     };
207     typedef std::vector<ELFSectionHeaderInfo>   SectionHeaderColl;
208     typedef SectionHeaderColl::iterator         SectionHeaderCollIter;
209     typedef SectionHeaderColl::const_iterator   SectionHeaderCollConstIter;
210 
211     typedef std::vector<elf::ELFDynamic>        DynamicSymbolColl;
212     typedef DynamicSymbolColl::iterator         DynamicSymbolCollIter;
213     typedef DynamicSymbolColl::const_iterator   DynamicSymbolCollConstIter;
214 
215     /// Version of this reader common to all plugins based on this class.
216     static const uint32_t m_plugin_version = 1;
217 
218     /// ELF file header.
219     elf::ELFHeader m_header;
220 
221     /// ELF build ID.
222     lldb_private::UUID m_uuid;
223 
224     /// ELF .gnu_debuglink file and crc data if available.
225     std::string m_gnu_debuglink_file;
226     uint32_t m_gnu_debuglink_crc;
227 
228     /// Collection of program headers.
229     ProgramHeaderColl m_program_headers;
230 
231     /// Collection of section headers.
232     SectionHeaderColl m_section_headers;
233 
234     /// Collection of symbols from the dynamic table.
235     DynamicSymbolColl m_dynamic_symbols;
236 
237     /// List of file specifications corresponding to the modules (shared
238     /// libraries) on which this object file depends.
239     mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_ap;
240 
241     /// Cached value of the entry point for this module.
242     lldb_private::Address  m_entry_point_address;
243 
244     /// Returns a 1 based index of the given section header.
245     size_t
246     SectionIndex(const SectionHeaderCollIter &I);
247 
248     /// Returns a 1 based index of the given section header.
249     size_t
250     SectionIndex(const SectionHeaderCollConstIter &I) const;
251 
252     /// Parses all section headers present in this object file and populates
253     /// m_program_headers.  This method will compute the header list only once.
254     /// Returns the number of headers parsed.
255     size_t
256     ParseProgramHeaders();
257 
258     /// Parses all section headers present in this object file and populates
259     /// m_section_headers.  This method will compute the header list only once.
260     /// Returns the number of headers parsed.
261     size_t
262     ParseSectionHeaders();
263 
264     /// Parses the elf section headers and returns the uuid, debug link name, crc.
265     static size_t
266     GetSectionHeaderInfo(SectionHeaderColl &section_headers,
267                          lldb_private::DataExtractor &data,
268                          const elf::ELFHeader &header,
269                          lldb_private::UUID &uuid,
270                          std::string &gnu_debuglink_file,
271                          uint32_t &gnu_debuglink_crc);
272 
273     /// Scans the dynamic section and locates all dependent modules (shared
274     /// libraries) populating m_filespec_ap.  This method will compute the
275     /// dependent module list only once.  Returns the number of dependent
276     /// modules parsed.
277     size_t
278     ParseDependentModules();
279 
280     /// Parses the dynamic symbol table and populates m_dynamic_symbols.  The
281     /// vector retains the order as found in the object file.  Returns the
282     /// number of dynamic symbols parsed.
283     size_t
284     ParseDynamicSymbols();
285 
286     /// Populates m_symtab_ap will all non-dynamic linker symbols.  This method
287     /// will parse the symbols only once.  Returns the number of symbols parsed.
288     unsigned
289     ParseSymbolTable(lldb_private::Symtab *symbol_table,
290                      lldb::user_id_t start_id,
291                      lldb_private::Section *symtab);
292 
293     /// Helper routine for ParseSymbolTable().
294     unsigned
295     ParseSymbols(lldb_private::Symtab *symbol_table,
296                  lldb::user_id_t start_id,
297                  lldb_private::SectionList *section_list,
298                  const size_t num_symbols,
299                  const lldb_private::DataExtractor &symtab_data,
300                  const lldb_private::DataExtractor &strtab_data);
301 
302     /// Scans the relocation entries and adds a set of artificial symbols to the
303     /// given symbol table for each PLT slot.  Returns the number of symbols
304     /// added.
305     unsigned
306     ParseTrampolineSymbols(lldb_private::Symtab *symbol_table,
307                            lldb::user_id_t start_id,
308                            const ELFSectionHeaderInfo *rela_hdr,
309                            lldb::user_id_t section_id);
310 
311     /// Relocates debug sections
312     unsigned
313     RelocateDebugSections(const elf::ELFSectionHeader *rel_hdr, lldb::user_id_t rel_id);
314 
315     unsigned
316     RelocateSection(lldb_private::Symtab* symtab, const elf::ELFHeader *hdr, const elf::ELFSectionHeader *rel_hdr,
317                     const elf::ELFSectionHeader *symtab_hdr, const elf::ELFSectionHeader *debug_hdr,
318                     lldb_private::DataExtractor &rel_data, lldb_private::DataExtractor &symtab_data,
319                     lldb_private::DataExtractor &debug_data, lldb_private::Section* rel_section);
320 
321     /// Loads the section name string table into m_shstr_data.  Returns the
322     /// number of bytes constituting the table.
323     size_t
324     GetSectionHeaderStringTable();
325 
326     /// Utility method for looking up a section given its name.  Returns the
327     /// index of the corresponding section or zero if no section with the given
328     /// name can be found (note that section indices are always 1 based, and so
329     /// section index 0 is never valid).
330     lldb::user_id_t
331     GetSectionIndexByName(const char *name);
332 
333     // Returns the ID of the first section that has the given type.
334     lldb::user_id_t
335     GetSectionIndexByType(unsigned type);
336 
337     /// Returns the section header with the given id or NULL.
338     const ELFSectionHeaderInfo *
339     GetSectionHeaderByIndex(lldb::user_id_t id);
340 
341     /// @name  ELF header dump routines
342     //@{
343     static void
344     DumpELFHeader(lldb_private::Stream *s, const elf::ELFHeader& header);
345 
346     static void
347     DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s,
348                                   unsigned char ei_data);
349 
350     static void
351     DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type);
352     //@}
353 
354     /// @name ELF program header dump routines
355     //@{
356     void
357     DumpELFProgramHeaders(lldb_private::Stream *s);
358 
359     static void
360     DumpELFProgramHeader(lldb_private::Stream *s,
361                          const elf::ELFProgramHeader &ph);
362 
363     static void
364     DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type);
365 
366     static void
367     DumpELFProgramHeader_p_flags(lldb_private::Stream *s,
368                                  elf::elf_word p_flags);
369     //@}
370 
371     /// @name ELF section header dump routines
372     //@{
373     void
374     DumpELFSectionHeaders(lldb_private::Stream *s);
375 
376     static void
377     DumpELFSectionHeader(lldb_private::Stream *s,
378                          const ELFSectionHeaderInfo& sh);
379 
380     static void
381     DumpELFSectionHeader_sh_type(lldb_private::Stream *s,
382                                  elf::elf_word sh_type);
383 
384     static void
385     DumpELFSectionHeader_sh_flags(lldb_private::Stream *s,
386                                   elf::elf_xword sh_flags);
387     //@}
388 
389     /// ELF dependent module dump routine.
390     void
391     DumpDependentModules(lldb_private::Stream *s);
392 
393     const elf::ELFDynamic *
394     FindDynamicSymbol(unsigned tag);
395 
396     unsigned
397     PLTRelocationType();
398 };
399 
400 #endif // #ifndef liblldb_ObjectFileELF_h_
401