On ELF, can now compile w/o dyninstSTART and dyninstEND.
[dyninst.git] / common / h / Object-elf.h
1 /*
2  * Copyright (c) 1996 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 /************************************************************************
43  * Object-elf32.h: ELF-32 object files.
44 ************************************************************************/
45
46
47 #if !defined(_Object_elf32_h_)
48 #define _Object_elf32_h_
49
50
51
52 /************************************************************************
53  * header files.
54 ************************************************************************/
55 #include "util/h/String.h"
56 #include "util/h/Symbol.h"
57 #include "util/h/Types.h"
58 #include "util/h/Vector.h"
59 #include <libelf.h>
60
61 extern "C" {
62 #include <libelf.h>
63 #include <fcntl.h>
64 #include <stdlib.h>
65 #include <unistd.h>
66
67 #include <sys/types.h>
68 #include <sys/mman.h>
69 #include <sys/stat.h>
70 }
71
72 /***
73    The standard symbol table in an elf file is the .symtab section. This section does
74    not have information to find the module to which a global symbol belongs, so we must
75    also read the .stab section to get this info.
76 ***/
77
78 // Declarations for the .stab section.
79 // These are not declared in any system header files, so we must provide our own
80 // declarations. The declarations below were taken from:
81 //       SPARCWorks 3.0.x Debugger Interface, July 1994/
82
83 struct stab_entry { // an entry in the stab section
84   unsigned long name;  // stabstr table index for this symbol
85   unsigned char type; // type of this symbol
86   unsigned char other; 
87   unsigned short desc; 
88   unsigned long val; // value of this symbol -- usually zero. The real value must
89                      // be obtained from the symtab section
90 };
91
92 // Types 
93 #define N_UNDF  0x00 /* start of object file */
94 #define N_GSYM  0x20 /* global symbol */
95 #define N_FUN   0x24 /* function or procedure */
96 #define N_STSYM 0x26 /* initialized static symbol */
97 #define N_LCSYM 0x28 /* unitialized static symbol */
98 #define N_ROSYM 0x2c /* read-only static symbol */
99 #define N_ENDM  0x62 /* end module */
100 #define N_SO    0x64 /* source directory and file */
101 #define N_ENTRY 0xa4 /* fortran alternate subroutine entry point */
102
103 // Language code -- the desc field in a N_SO entry is a language code
104 #define N_SO_AS      1 /* assembler source */
105 #define N_SO_C       2 /* K & R C source */
106 #define N_SO_ANSI_C  3 /* ANSI C source */
107 #define N_SO_CC      4 /* C++ source */
108 #define N_SO_FORTRAN 5 /* fortran source */
109 #define N_SO_PASCAL  6 /* Pascal source */
110
111 // Symbol descriptors
112 // The format of a name is "<name>:<symbol descriptor><rest of name>
113 // The following are the descriptors of interest
114 #define SD_GLOBAL_FUN 'F' /* global function or procedure */
115 #define SD_PROTOTYPE 'P'  /* function prototypes */
116 #define SD_GLOBAL_VAR 'G' /* global variable */
117
118 // end of stab declarations
119
120 \f
121
122
123 /************************************************************************
124  * class Object
125 ************************************************************************/
126
127 class Object : public AObject {
128 public:
129              // executable file version of constructor....
130              Object (const string, void (*)(const char *) = log_msg);
131              // shared library version of constructor....
132              Object (const string, u_int baseAddr, 
133                      void (*)(const char *) = log_msg);
134              Object (const Object &);
135     virtual ~Object ();
136
137     const Object& operator= (const Object &);
138
139     // for debuggering ....
140     const ostream &dump_state_info(ostream &s);
141
142     bool     needs_function_binding() const {return (plt_addr_  > 0);} 
143     bool     get_func_binding_table(vector<relocationEntry> &fbt) const;
144     bool     get_func_binding_table_ptr(const vector<relocationEntry> *&fbt) const;
145
146 private:
147     static
148     void    log_elferror (void (*)(const char *), const char *);
149
150     bool    EEL ; //set to true if EEL rewritten
151     //added char *ptr, to deal with EEL rewritten software
152     //
153     bool      loaded_elf (int, char *, bool &, Elf* &, Elf32_Ehdr* &, 
154                           Elf32_Phdr* &, unsigned &, unsigned &, Elf_Scn* &, 
155                           Elf_Scn* &, Elf_Scn* &, Elf_Scn* &,
156                           Elf_Scn*& rel_plt_scnp, Elf_Scn*& plt_scnp, 
157                           Elf_Scn*& got_scnp,  Elf_Scn*& dynsym_scnp,
158                           Elf_Scn*& dynstr_scnp);
159
160     // Code for loading in executable files && shared libraries, 
161     //  respectively....
162     void     load_object ();
163     void     load_shared_object ();
164
165     // initialize relocation_table_ from .rel.plt or .rela.plt section entryies 
166     bool     get_relocation_entries(Elf_Scn*& rel_plt_scnp,
167                         Elf_Scn*& dynsymscnp, Elf_Scn*& dynstrcnp);
168
169     // elf-specific stuff from dynamic executables and shared objects
170     Address     plt_addr_;      // address of _PROCEDURE_LINKAGE_TABLE_ 
171     u_int       plt_size_;
172     u_int       plt_entry_size_;
173     Address     got_addr_;      // address of _GLOBAL_OFFSET_TABLE_
174     Address     rel_plt_addr_;  // address of .rela.plt or .rel.plt section 
175     u_int       rel_plt_size_;
176     u_int       rel_plt_entry_size_;
177     Address     dyn_sym_addr_;  // address of .dynsym section
178     Address     dyn_str_addr_;  // address of .dynstr section
179
180     // for sparc-solaris this is a table of PLT entry addr, function_name
181     // for x86-solaris this is a table of GOT entry addr, function_name
182     // on sparc-solaris the runtime linker modifies the PLT entry when it
183     // binds a function, on X86 the PLT entry is not modified, but it uses
184     // an indirect jump to a GOT entry that is modified when the function 
185     // is bound....is this correct???? or should it be <PLTentry_addr, name> 
186     // for both?
187     vector<relocationEntry> relocation_table_;
188
189
190     // NEW FUNCTIONS - mcheyney, 970910
191     void parse_symbols(vector<Symbol> &allsymbols, Elf32_Sym *syms, \
192         unsigned nsyms, const char *strs, bool shared_library, \
193         string module); 
194
195     void fix_zero_function_sizes(vector<Symbol> &allsymbols, bool EEL);
196     void override_weak_symbols(vector<Symbol> &allsymbols);
197     void insert_symbols_shared(vector<Symbol> allsymbols);
198     void find_code_and_data(Elf32_Ehdr* ehdrp, Elf32_Phdr* phdrp, \
199         char *ptr, unsigned txtaddr, unsigned bssaddr);
200     void insert_symbols_static(vector<Symbol> allsymbols, \
201         dictionary_hash<string, Symbol> &global_symbols);
202     void fix_global_symbol_modules_static(\
203         dictionary_hash<string, Symbol> global_symbols, \
204         Elf_Scn* stabscnp, Elf_Scn* stabstrscnp);
205 };
206  
207
208 #endif /* !defined(_Object_elf32_h_) */
209
210
211
212
213
214