1f325ba9dSStephen Wilson //===-- ObjectFileELF.h --------------------------------------- -*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #ifndef liblldb_ObjectFileELF_h_
1130fdc8d8SChris Lattner #define liblldb_ObjectFileELF_h_
1230fdc8d8SChris Lattner 
1330fdc8d8SChris Lattner #include <stdint.h>
1430fdc8d8SChris Lattner #include <vector>
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner #include "lldb/lldb-private.h"
1730fdc8d8SChris Lattner #include "lldb/Core/FileSpec.h"
1830fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h"
1930fdc8d8SChris Lattner 
20f325ba9dSStephen Wilson #include "ELFHeader.h"
2130fdc8d8SChris Lattner 
22f325ba9dSStephen Wilson //------------------------------------------------------------------------------
23f325ba9dSStephen Wilson /// @class ObjectFileELF
24f325ba9dSStephen Wilson /// @brief Generic ELF object file reader.
25f325ba9dSStephen Wilson ///
26f325ba9dSStephen Wilson /// This class provides a generic ELF (32/64 bit) reader plugin implementing the
27f325ba9dSStephen Wilson /// ObjectFile protocol.
2830fdc8d8SChris Lattner class ObjectFileELF :
2930fdc8d8SChris Lattner     public lldb_private::ObjectFile
3030fdc8d8SChris Lattner {
3130fdc8d8SChris Lattner public:
3230fdc8d8SChris Lattner     //------------------------------------------------------------------
3330fdc8d8SChris Lattner     // Static Functions
3430fdc8d8SChris Lattner     //------------------------------------------------------------------
3530fdc8d8SChris Lattner     static void
3630fdc8d8SChris Lattner     Initialize();
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner     static void
3930fdc8d8SChris Lattner     Terminate();
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner     static const char *
4230fdc8d8SChris Lattner     GetPluginNameStatic();
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner     static const char *
4530fdc8d8SChris Lattner     GetPluginDescriptionStatic();
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner     static lldb_private::ObjectFile *
4830fdc8d8SChris Lattner     CreateInstance(lldb_private::Module* module,
4930fdc8d8SChris Lattner                    lldb::DataBufferSP& dataSP,
5030fdc8d8SChris Lattner                    const lldb_private::FileSpec* file,
5130fdc8d8SChris Lattner                    lldb::addr_t offset,
5230fdc8d8SChris Lattner                    lldb::addr_t length);
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner     //------------------------------------------------------------------
55f325ba9dSStephen Wilson     // PluginInterface protocol
5630fdc8d8SChris Lattner     //------------------------------------------------------------------
57f325ba9dSStephen Wilson     virtual const char *
58f325ba9dSStephen Wilson     GetPluginName();
5930fdc8d8SChris Lattner 
60f325ba9dSStephen Wilson     virtual const char *
61f325ba9dSStephen Wilson     GetShortPluginName();
62f325ba9dSStephen Wilson 
63f325ba9dSStephen Wilson     virtual uint32_t
64f325ba9dSStephen Wilson     GetPluginVersion();
65f325ba9dSStephen Wilson 
66f325ba9dSStephen Wilson     virtual void
67f325ba9dSStephen Wilson     GetPluginCommandHelp(const char *command, lldb_private::Stream *strm);
68f325ba9dSStephen Wilson 
69f325ba9dSStephen Wilson     virtual lldb_private::Error
70f325ba9dSStephen Wilson     ExecutePluginCommand(lldb_private::Args &command,
71f325ba9dSStephen Wilson                          lldb_private::Stream *strm);
72f325ba9dSStephen Wilson 
73f325ba9dSStephen Wilson     virtual lldb_private::Log *
74f325ba9dSStephen Wilson     EnablePluginLogging(lldb_private::Stream *strm,
75f325ba9dSStephen Wilson                         lldb_private::Args &command);
76f325ba9dSStephen Wilson 
77f325ba9dSStephen Wilson     //------------------------------------------------------------------
78f325ba9dSStephen Wilson     // ObjectFile Protocol.
79f325ba9dSStephen Wilson     //------------------------------------------------------------------
8030fdc8d8SChris Lattner     virtual
8130fdc8d8SChris Lattner     ~ObjectFileELF();
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner     virtual bool
8430fdc8d8SChris Lattner     ParseHeader();
8530fdc8d8SChris Lattner 
8630fdc8d8SChris Lattner     virtual lldb::ByteOrder
8730fdc8d8SChris Lattner     GetByteOrder() const;
8830fdc8d8SChris Lattner 
895aee162fSJim Ingham     virtual bool
905aee162fSJim Ingham     IsExecutable () const;
915aee162fSJim Ingham 
9230fdc8d8SChris Lattner     virtual size_t
9330fdc8d8SChris Lattner     GetAddressByteSize() const;
9430fdc8d8SChris Lattner 
9530fdc8d8SChris Lattner     virtual lldb_private::Symtab *
9630fdc8d8SChris Lattner     GetSymtab();
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner     virtual lldb_private::SectionList *
9930fdc8d8SChris Lattner     GetSectionList();
10030fdc8d8SChris Lattner 
10130fdc8d8SChris Lattner     virtual void
10230fdc8d8SChris Lattner     Dump(lldb_private::Stream *s);
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner     virtual bool
10530fdc8d8SChris Lattner     GetTargetTriple(lldb_private::ConstString &target_triple);
10630fdc8d8SChris Lattner 
10730fdc8d8SChris Lattner     virtual bool
10830fdc8d8SChris Lattner     GetUUID(lldb_private::UUID* uuid);
10930fdc8d8SChris Lattner 
11030fdc8d8SChris Lattner     virtual uint32_t
11130fdc8d8SChris Lattner     GetDependentModules(lldb_private::FileSpecList& files);
11230fdc8d8SChris Lattner 
113f325ba9dSStephen Wilson private:
114f325ba9dSStephen Wilson     ObjectFileELF(lldb_private::Module* module,
115f325ba9dSStephen Wilson                   lldb::DataBufferSP& dataSP,
116f325ba9dSStephen Wilson                   const lldb_private::FileSpec* file,
117f325ba9dSStephen Wilson                   lldb::addr_t offset,
118f325ba9dSStephen Wilson                   lldb::addr_t length);
11930fdc8d8SChris Lattner 
120f325ba9dSStephen Wilson     typedef std::vector<elf::ELFProgramHeader>  ProgramHeaderColl;
12130fdc8d8SChris Lattner     typedef ProgramHeaderColl::iterator         ProgramHeaderCollIter;
12230fdc8d8SChris Lattner     typedef ProgramHeaderColl::const_iterator   ProgramHeaderCollConstIter;
12330fdc8d8SChris Lattner 
124f325ba9dSStephen Wilson     typedef std::vector<elf::ELFSectionHeader>  SectionHeaderColl;
12530fdc8d8SChris Lattner     typedef SectionHeaderColl::iterator         SectionHeaderCollIter;
12630fdc8d8SChris Lattner     typedef SectionHeaderColl::const_iterator   SectionHeaderCollConstIter;
12730fdc8d8SChris Lattner 
128f325ba9dSStephen Wilson     /// Version of this reader common to all plugins based on this class.
129f325ba9dSStephen Wilson     static const uint32_t m_plugin_version = 1;
130f325ba9dSStephen Wilson 
131f325ba9dSStephen Wilson     /// ELF file header.
132f325ba9dSStephen Wilson     elf::ELFHeader m_header;
133f325ba9dSStephen Wilson 
134f325ba9dSStephen Wilson     /// Collection of program headers.
13530fdc8d8SChris Lattner     ProgramHeaderColl m_program_headers;
136f325ba9dSStephen Wilson 
137f325ba9dSStephen Wilson     /// Collection of section headers.
13830fdc8d8SChris Lattner     SectionHeaderColl m_section_headers;
139f325ba9dSStephen Wilson 
140f325ba9dSStephen Wilson     /// List of sections present in this ELF object file.
14130fdc8d8SChris Lattner     mutable std::auto_ptr<lldb_private::SectionList> m_sections_ap;
142f325ba9dSStephen Wilson 
143f325ba9dSStephen Wilson     /// Table of all non-dynamic symbols present in this object file.
14430fdc8d8SChris Lattner     mutable std::auto_ptr<lldb_private::Symtab> m_symtab_ap;
145f325ba9dSStephen Wilson 
146f325ba9dSStephen Wilson     /// List of file specifications corresponding to the modules (shared
147f325ba9dSStephen Wilson     /// libraries) on which this object file depends.
148f325ba9dSStephen Wilson     mutable std::auto_ptr<lldb_private::FileSpecList> m_filespec_ap;
149f325ba9dSStephen Wilson 
150f325ba9dSStephen Wilson     /// Data extractor holding the string table used to resolve section names.
15130fdc8d8SChris Lattner     lldb_private::DataExtractor m_shstr_data;
15230fdc8d8SChris Lattner 
153f325ba9dSStephen Wilson     /// Returns a 1 based index of the given section header.
154f325ba9dSStephen Wilson     unsigned
155f325ba9dSStephen Wilson     SectionIndex(const SectionHeaderCollIter &I);
156f325ba9dSStephen Wilson 
157f325ba9dSStephen Wilson     /// Returns a 1 based index of the given section header.
158f325ba9dSStephen Wilson     unsigned
159f325ba9dSStephen Wilson     SectionIndex(const SectionHeaderCollConstIter &I) const;
160f325ba9dSStephen Wilson 
161f325ba9dSStephen Wilson     /// Parses all section headers present in this object file and populates
162f325ba9dSStephen Wilson     /// m_program_headers.  This method will compute the header list only once.
163f325ba9dSStephen Wilson     /// Returns the number of headers parsed.
16430fdc8d8SChris Lattner     size_t
165f325ba9dSStephen Wilson     ParseProgramHeaders();
16630fdc8d8SChris Lattner 
167f325ba9dSStephen Wilson     /// Parses all section headers present in this object file and populates
168f325ba9dSStephen Wilson     /// m_section_headers.  This method will compute the header list only once.
169f325ba9dSStephen Wilson     /// Returns the number of headers parsed.
17030fdc8d8SChris Lattner     size_t
171f325ba9dSStephen Wilson     ParseSectionHeaders();
17230fdc8d8SChris Lattner 
173f325ba9dSStephen Wilson     /// Scans the dynamic section and locates all dependent modules (shared
174*710dd5aeSGreg Clayton     /// libraries) populating m_filespec_ap.  This method will compute the
175f325ba9dSStephen Wilson     /// dependent module list only once.  Returns the number of dependent
176f325ba9dSStephen Wilson     /// modules parsed.
177f325ba9dSStephen Wilson     size_t
178f325ba9dSStephen Wilson     ParseDependentModules();
17930fdc8d8SChris Lattner 
180f325ba9dSStephen Wilson     /// Populates m_symtab_ap will all non-dynamic linker symbols.  This method
181f325ba9dSStephen Wilson     /// will parse the symbols only once.  Returns the number of symbols parsed.
182f325ba9dSStephen Wilson     void
183f325ba9dSStephen Wilson     ParseSymbolTable(lldb_private::Symtab *symbol_table,
184f325ba9dSStephen Wilson                      const elf::ELFSectionHeader &symtab_section,
185f325ba9dSStephen Wilson                      lldb::user_id_t symtab_id);
186f325ba9dSStephen Wilson 
187f325ba9dSStephen Wilson     /// Loads the section name string table into m_shstr_data.  Returns the
188f325ba9dSStephen Wilson     /// number of bytes constituting the table.
189f325ba9dSStephen Wilson     size_t
190f325ba9dSStephen Wilson     GetSectionHeaderStringTable();
191f325ba9dSStephen Wilson 
192f325ba9dSStephen Wilson     /// Utility method for looking up a section given its name.  Returns the
193f325ba9dSStephen Wilson     /// index of the corresponding section or zero if no section with the given
194f325ba9dSStephen Wilson     /// name can be found (note that section indices are always 1 based, and so
195f325ba9dSStephen Wilson     /// section index 0 is never valid).
196f325ba9dSStephen Wilson     lldb::user_id_t
197f325ba9dSStephen Wilson     GetSectionIndexByName(const char *name);
198f325ba9dSStephen Wilson 
199f325ba9dSStephen Wilson     /// @name  ELF header dump routines
200f325ba9dSStephen Wilson     //@{
20130fdc8d8SChris Lattner     static void
202f325ba9dSStephen Wilson     DumpELFHeader(lldb_private::Stream *s, const elf::ELFHeader& header);
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner     static void
20530fdc8d8SChris Lattner     DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s,
206f325ba9dSStephen Wilson                                   unsigned char ei_data);
20730fdc8d8SChris Lattner 
208f325ba9dSStephen Wilson     static void
209f325ba9dSStephen Wilson     DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type);
210f325ba9dSStephen Wilson     //@}
211f325ba9dSStephen Wilson 
212f325ba9dSStephen Wilson     /// @name ELF program header dump routines
213f325ba9dSStephen Wilson     //@{
21430fdc8d8SChris Lattner     void
21530fdc8d8SChris Lattner     DumpELFProgramHeaders(lldb_private::Stream *s);
21630fdc8d8SChris Lattner 
21730fdc8d8SChris Lattner     static void
21830fdc8d8SChris Lattner     DumpELFProgramHeader(lldb_private::Stream *s,
219f325ba9dSStephen Wilson                          const elf::ELFProgramHeader &ph);
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner     static void
222f325ba9dSStephen Wilson     DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type);
22330fdc8d8SChris Lattner 
22430fdc8d8SChris Lattner     static void
22530fdc8d8SChris Lattner     DumpELFProgramHeader_p_flags(lldb_private::Stream *s,
226f325ba9dSStephen Wilson                                  elf::elf_word p_flags);
227f325ba9dSStephen Wilson     //@}
22830fdc8d8SChris Lattner 
229f325ba9dSStephen Wilson     /// @name ELF section header dump routines
230f325ba9dSStephen Wilson     //@{
23130fdc8d8SChris Lattner     void
23230fdc8d8SChris Lattner     DumpELFSectionHeaders(lldb_private::Stream *s);
23330fdc8d8SChris Lattner 
23430fdc8d8SChris Lattner     static void
23530fdc8d8SChris Lattner     DumpELFSectionHeader(lldb_private::Stream *s,
236f325ba9dSStephen Wilson                          const elf::ELFSectionHeader& sh);
23730fdc8d8SChris Lattner 
23830fdc8d8SChris Lattner     static void
23930fdc8d8SChris Lattner     DumpELFSectionHeader_sh_type(lldb_private::Stream *s,
240f325ba9dSStephen Wilson                                  elf::elf_word sh_type);
24130fdc8d8SChris Lattner 
24230fdc8d8SChris Lattner     static void
24330fdc8d8SChris Lattner     DumpELFSectionHeader_sh_flags(lldb_private::Stream *s,
244f325ba9dSStephen Wilson                                   elf::elf_word sh_flags);
245f325ba9dSStephen Wilson     //@}
24630fdc8d8SChris Lattner 
247f325ba9dSStephen Wilson     /// ELF dependent module dump routine.
248f325ba9dSStephen Wilson     void
249f325ba9dSStephen Wilson     DumpDependentModules(lldb_private::Stream *s);
25030fdc8d8SChris Lattner 
25130fdc8d8SChris Lattner };
25230fdc8d8SChris Lattner 
25330fdc8d8SChris Lattner #endif // #ifndef liblldb_ObjectFileELF_h_
254