blob: 5d5778c78fbf8b6895881cb80b58da73eaadaf4d [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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/Core/FileSpec.h"
18#include "lldb/Symbol/ObjectFile.h"
19
20#include "elf.h"
21
22//----------------------------------------------------------------------
23// This class needs to be hidden as eventually belongs in a plugin that
24// will export the ObjectFile protocol
25//----------------------------------------------------------------------
26class ObjectFileELF :
27 public lldb_private::ObjectFile
28{
29public:
30 //------------------------------------------------------------------
31 // Static Functions
32 //------------------------------------------------------------------
33 static void
34 Initialize();
35
36 static void
37 Terminate();
38
39 static const char *
40 GetPluginNameStatic();
41
42 static const char *
43 GetPluginDescriptionStatic();
44
45 static lldb_private::ObjectFile *
46 CreateInstance (lldb_private::Module* module,
47 lldb::DataBufferSP& dataSP,
48 const lldb_private::FileSpec* file,
49 lldb::addr_t offset,
50 lldb::addr_t length);
51 static bool
52 MagicBytesMatch (lldb::DataBufferSP& dataSP);
53
54 //------------------------------------------------------------------
55 // Member Functions
56 //------------------------------------------------------------------
57 ObjectFileELF (lldb_private::Module* module,
58 lldb::DataBufferSP& dataSP,
59 const lldb_private::FileSpec* file,
60 lldb::addr_t offset,
61 lldb::addr_t length);
62
63 virtual
64 ~ObjectFileELF();
65
66 virtual bool
67 ParseHeader ();
68
69 virtual lldb::ByteOrder
70 GetByteOrder () const;
71
72 virtual size_t
73 GetAddressByteSize () const;
74
75 virtual lldb_private::Symtab *
76 GetSymtab();
77
78 virtual lldb_private::SectionList *
79 GetSectionList();
80
81 virtual void
82 Dump (lldb_private::Stream *s);
83
84 virtual bool
85 GetTargetTriple (lldb_private::ConstString &target_triple);
86
87 virtual bool
88 GetUUID (lldb_private::UUID* uuid);
89
90 virtual uint32_t
91 GetDependentModules(lldb_private::FileSpecList& files);
92
93 //------------------------------------------------------------------
94 // PluginInterface protocol
95 //------------------------------------------------------------------
96 virtual const char *
97 GetPluginName();
98
99 virtual const char *
100 GetShortPluginName();
101
102 virtual uint32_t
103 GetPluginVersion();
104
105 virtual void
106 GetPluginCommandHelp (const char *command, lldb_private::Stream *strm);
107
108 virtual lldb_private::Error
109 ExecutePluginCommand (lldb_private::Args &command, lldb_private::Stream *strm);
110
111 virtual lldb_private::Log *
112 EnablePluginLogging (lldb_private::Stream *strm, lldb_private::Args &command);
113
114
115
116protected:
117 typedef std::vector<Elf32_Phdr> ProgramHeaderColl;
118 typedef ProgramHeaderColl::iterator ProgramHeaderCollIter;
119 typedef ProgramHeaderColl::const_iterator ProgramHeaderCollConstIter;
120
121 typedef std::vector<Elf32_Shdr> SectionHeaderColl;
122 typedef SectionHeaderColl::iterator SectionHeaderCollIter;
123 typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter;
124
125 Elf32_Ehdr m_header;
126 ProgramHeaderColl m_program_headers;
127 SectionHeaderColl m_section_headers;
128 mutable std::auto_ptr<lldb_private::SectionList> m_sections_ap;
129 mutable std::auto_ptr<lldb_private::Symtab> m_symtab_ap;
130 lldb_private::DataExtractor m_shstr_data;
131
132 size_t
133 ParseSections ();
134
135 size_t
136 ParseSymtab (bool minimize);
137
138private:
139
140 // ELF header dump routines
141 static void
142 DumpELFHeader (lldb_private::Stream *s,
143 const Elf32_Ehdr& header);
144
145 static void
146 DumpELFHeader_e_ident_EI_DATA (lldb_private::Stream *s,
147 uint16_t ei_data);
148 static void
149 DumpELFHeader_e_type (lldb_private::Stream *s,
150 uint16_t e_type);
151
152 // ELF program header dump routines
153 void
154 DumpELFProgramHeaders (lldb_private::Stream *s);
155
156 static void
157 DumpELFProgramHeader (lldb_private::Stream *s,
158 const Elf32_Phdr& ph);
159
160 static void
161 DumpELFProgramHeader_p_type (lldb_private::Stream *s,
162 Elf32_Word p_type);
163
164 static void
165 DumpELFProgramHeader_p_flags (lldb_private::Stream *s,
166 Elf32_Word p_flags);
167
168 // ELF section header dump routines
169 void
170 DumpELFSectionHeaders (lldb_private::Stream *s);
171
172 static void
173 DumpELFSectionHeader (lldb_private::Stream *s,
174 const Elf32_Shdr& sh);
175
176 static void
177 DumpELFSectionHeader_sh_type (lldb_private::Stream *s,
178 Elf32_Word sh_type);
179
180 static void
181 DumpELFSectionHeader_sh_flags (lldb_private::Stream *s,
182 Elf32_Word sh_flags);
183
184 size_t
185 ParseProgramHeaders ();
186
187 size_t
188 ParseSectionHeaders ();
189
190 size_t
191 GetSectionHeaderStringTable ();
192
193 uint32_t
194 GetSectionIndexByName (const char *name);
195};
196
197#endif // #ifndef liblldb_ObjectFileELF_h_