Determine the architecture of an ELF by looking at the file header instead of the...
[dyninst.git] / symtabAPI / src / Object.h
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 /************************************************************************
32  * $Id: Object.h,v 1.20 2008/06/23 18:45:48 legendre Exp $
33  * Object.h: interface to objects, symbols, lines and instructions.
34 ************************************************************************/
35
36
37 #if !defined(_Object_h_)
38 #define _Object_h_
39
40 /************************************************************************
41  * header files.
42 ************************************************************************/
43
44 // trace data streams
45 #include <string>
46 #include <vector>
47
48 #include "Symbol.h"
49 #include "Symtab.h"
50 #include "LineInformation.h"
51 #include "common/src/headers.h"
52 #include "common/src/MappedFile.h"
53 #include "common/src/lprintf.h"
54
55 namespace Dyninst{
56 namespace SymtabAPI{
57
58 extern bool symbol_compare(const Symbol *s1, const Symbol *s2);
59
60 class Symtab;
61 class Region;
62 class ExceptionBlock;
63 class relocationEntry;
64
65 const char WILDCARD_CHARACTER = '?';
66 const char MULTIPLE_WILDCARD_CHARACTER = '*';
67
68 /************************************************************************
69  * class AObject
70  *
71  *  WHAT IS THIS CLASS????  COMMENTS????
72  *  Looks like it has a dictionary hash of symbols, as well as
73  *   a ptr to to the code section, an offset into the code section,
74  *   and a length of the code section, and ditto for the data
75  *   section....
76 ************************************************************************/
77
78 class AObject {
79 public:
80     SYMTAB_EXPORT unsigned nsymbols () const;
81     
82     SYMTAB_EXPORT bool get_symbols( std::string & name, std::vector< Symbol *> & symbols);
83
84     SYMTAB_EXPORT char*       code_ptr () const; 
85     SYMTAB_EXPORT Offset           code_off () const;
86     SYMTAB_EXPORT Offset           code_len () const;
87
88     SYMTAB_EXPORT char*       data_ptr () const;
89     SYMTAB_EXPORT Offset           data_off () const;
90     SYMTAB_EXPORT Offset           data_len () const;
91
92     SYMTAB_EXPORT bool        is_aout  () const;
93     SYMTAB_EXPORT bool        isDynamic() const;
94
95     SYMTAB_EXPORT unsigned            no_of_sections () const;
96     SYMTAB_EXPORT unsigned            no_of_symbols  () const;
97
98     SYMTAB_EXPORT bool getAllExceptions(std::vector<ExceptionBlock *>&excpBlocks) const;
99     SYMTAB_EXPORT std::vector<Region *> getAllRegions() const;
100
101     SYMTAB_EXPORT supportedLanguages pickLanguage(std::string &working_module, char *working_options,
102                                                                     supportedLanguages working_lang);
103
104     SYMTAB_EXPORT Offset loader_off() const;
105     SYMTAB_EXPORT unsigned loader_len() const;
106     SYMTAB_EXPORT int getAddressWidth() const;
107
108     bool isStaticBinary() const {return is_static_binary_;}
109
110     SYMTAB_EXPORT virtual char *  mem_image() const;
111
112     SYMTAB_EXPORT virtual  bool   needs_function_binding()  const;
113     SYMTAB_EXPORT virtual  bool   get_func_binding_table(std::vector<relocationEntry> &) const;
114     SYMTAB_EXPORT virtual  bool   get_func_binding_table_ptr(const std::vector<relocationEntry> *&) const; 
115     SYMTAB_EXPORT virtual  bool   addRelocationEntry(relocationEntry &re);
116     SYMTAB_EXPORT bool   getSegments(std::vector<Segment> &segs) const;
117
118     SYMTAB_EXPORT bool have_deferred_parsing( void ) const;
119     // for debuggering....
120     SYMTAB_EXPORT const std::ostream &dump_state_info(std::ostream &s);
121
122     SYMTAB_EXPORT void * getErrFunc() const;
123     SYMTAB_EXPORT dyn_hash_map< std::string, std::vector< Symbol *> > *getAllSymbols();
124     
125     SYMTAB_EXPORT virtual bool hasFrameDebugInfo() {return false;}
126     SYMTAB_EXPORT virtual bool getRegValueAtFrame(Address /*pc*/,
127                                                   Dyninst::MachRegister /*reg*/, 
128                                                   Dyninst::MachRegisterVal & /*reg_result*/,
129                                                   Dyninst::SymtabAPI::MemRegReader * /*reader*/) {return false;}
130     
131     SYMTAB_EXPORT virtual Dyninst::Architecture getArch() const { return Arch_none; };
132     SYMTAB_EXPORT const std::string findModuleForSym(Symbol *sym);
133     SYMTAB_EXPORT void setModuleForOffset(Offset sym_off, std::string module);
134     SYMTAB_EXPORT void clearSymsToMods();
135     SYMTAB_EXPORT bool hasError() const;
136     SYMTAB_EXPORT virtual bool isBigEndianDataEncoding() const { return false; }
137     SYMTAB_EXPORT virtual bool getABIVersion(int & /*major*/, int & /*minor*/) const { return false; }
138
139
140     virtual void setTruncateLinePaths(bool value);
141     virtual bool getTruncateLinePaths();
142     virtual Region::RegionType getRelType() const { return Region::RT_INVALID; }
143
144     // Only implemented for ELF right now
145     SYMTAB_EXPORT virtual void getSegmentsSymReader(std::vector<SymSegment> &) {};
146         SYMTAB_EXPORT virtual void rebase(Offset) {};
147 protected:
148     SYMTAB_EXPORT virtual ~AObject();
149     // explicitly protected
150     SYMTAB_EXPORT AObject(MappedFile *, void (*err_func)(const char *), Symtab*);
151 friend class Module;
152     virtual void parseLineInfoForCU(Module::DebugInfoT , LineInformation* ) { }
153
154     MappedFile *mf;
155
156     std::vector< Region *> regions_;
157
158     // XXX symbols_ is the owner of Symbol pointers; memory
159     //     is reclaimed from this structure
160     dyn_hash_map< std::string, std::vector< Symbol *> > symbols_;
161         std::map< Symbol *, std::string > symsToModules_;
162     dyn_hash_map<Offset, std::vector<Symbol *> > symsByOffset_;
163     std::vector<std::pair<std::string, Offset> > modules_;
164
165     char*   code_ptr_;
166     Offset code_off_;
167     Offset code_len_;
168
169     char*   data_ptr_;
170     Offset data_off_;
171     Offset data_len_;
172
173     Offset code_vldS_;
174     Offset code_vldE_;
175
176     Offset data_vldS_;
177     Offset data_vldE_;
178
179     Offset loader_off_; //only used on aix right now.  could be
180     Offset loader_len_; //needed on other platforms in the future
181
182 //    Offset loadAddress_;
183 //    Offset entryAddress_;
184 //    Offset baseAddress_;
185  
186     bool is_aout_;
187     bool is_dynamic_;
188     bool has_error;
189
190     bool is_static_binary_;
191
192     unsigned no_of_sections_;
193     unsigned no_of_symbols_;
194
195     bool deferredParse;
196     bool parsedAllLineInfo;
197     
198     void (*err_func_)(const char*);
199     int addressWidth_nbytes;
200
201     std::vector<ExceptionBlock> catch_addrs_; //Addresses of C++ try/catch blocks;
202     Symtab* associated_symtab;
203
204 private:
205     friend class SymbolIter;
206     friend class Symtab;
207
208     // declared but not implemented; no copying allowed
209     AObject(const AObject &obj);
210     const AObject& operator=(const AObject &obj);
211 };
212
213 }//namepsace Symtab
214 }//namespace Dyninst
215
216 /************************************************************************
217  * include the architecture-operating system specific object files.
218 ************************************************************************/
219
220 #if defined(os_linux) || defined(os_bg) || defined(os_freebsd) || defined(os_vxworks)
221 #include "Object-elf.h"
222 #elif defined(os_windows)
223 #include "Object-nt.h"
224 #else
225 #error "unknown platform"
226 #endif
227
228 /************************************************************************
229  * class SymbolIter
230 ************************************************************************/
231
232 namespace Dyninst{
233 namespace SymtabAPI{
234
235 class SymbolIter {
236  private:
237    dyn_hash_map< std::string, std::vector< Symbol *> > *symbols;
238    unsigned int currentPositionInVector;
239    dyn_hash_map< std::string, std::vector< Symbol *> >::iterator symbolIterator;
240    
241  public:
242    SymbolIter( Object & obj );
243    SymbolIter( const SymbolIter & src );
244    ~SymbolIter ();
245    
246    void reset ();
247    
248    operator bool() const;
249    void operator++ ( int );
250    const std::string & currkey() const;
251    
252    /* If it's important that this be const, we could try to initialize
253       currentVector to '& symbolIterator.currval()' in the constructor. */
254    Symbol *currval();
255    
256  private:       
257    
258    SymbolIter & operator = ( const SymbolIter & ); // explicitly disallowed
259 }; /* end class SymbolIter() */
260
261 }//namepsace SymtabAPI
262 }//namespace Dyninst
263
264 #endif /* !defined(_Object_h_) */