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/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 //----------------------------------------------------------------------
26 class ObjectFileELF :
27     public lldb_private::ObjectFile
28 {
29 public:
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 
116 protected:
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 
138 private:
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_
198