Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / MapSymbols.h
1 /*
2  * Copyright (c) 1996-2009 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  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32
33 /* 
34  * $Id: MapSymbols.h,v 1.7 2007/09/19 21:54:34 giri Exp $
35  */
36
37 //MapSymbols.h
38 //This file contains the definition of MapSymbols and
39 //necessary aux classes.  MapSymbols is used to read the
40 //.MAP file produced with the /MAP option on the Microsoft
41 //Compiler.  The user is provided with a list of debug
42 //symbols (name, address, function/variable?).
43 //7 july 2000 -- ccw 
44
45
46 #include <stdio.h>
47 #include <string.h>
48 #define _WINSOCKAPI_
49 #include <windows.h>
50 #include <iostream>
51 #include <stdlib.h>
52 #include "common/h/Vector.h"
53 #include "symtabAPI/h/Symbol.h"
54
55 #define text_seg 1
56 #define idata_seg 2
57 #define data_seg 3
58 #define bss_seg 4
59 #define rdata_seg 5
60 #define other_seg 100
61
62 class _symbols {
63 public:
64         char *name;
65         unsigned long address;
66         bool function;
67         unsigned long length;
68         bool staticObj;
69
70         _symbols() :name(NULL) {        };
71
72         _symbols(char *aName, unsigned long aAddress, bool aFunction, unsigned long aLength=0, bool staticN=false) : address(aAddress), 
73                 function(aFunction), length(aLength), staticObj(staticN){
74                 name = new char[strlen(aName)+1];
75                 strcpy(name, aName);
76         }
77
78         _symbols(_symbols &obj): address(obj.address), 
79                 function(obj.function), length(obj.length), staticObj(obj.staticObj){
80                 name = new char[strlen(obj.name)+1];
81                 strcpy(name, obj.name);
82         }
83
84         ~_symbols(){ delete [] name; }
85
86 };
87
88 class _dllName {
89 public:
90                 char *name;
91         
92                 _dllName() :name(NULL) {}
93                 _dllName(char *aName){
94                         name = new char[strlen(aName)+1];
95                         strcpy(name, aName);
96                 }
97
98                 _dllName(_dllName &obj){
99                         name = new char[strlen(obj.name)+1];
100                         strcpy(name, obj.name);
101                 }
102
103                 ~_dllName() { delete [] name; }
104
105                 bool operator== (const _dllName &obj) const {
106                         return !strcmp(obj.name, name);
107                 }
108                 
109 };
110
111 struct _list {
112         void *data;
113         struct _list *next;
114 };
115
116 class _section {
117 public:
118         char name[50];
119         int startSeg;
120         unsigned long startOffset;
121         unsigned long length;
122         char type[10];
123
124         _section(){};
125
126         _section(char *aName, int aStartSeg, unsigned long aStartOffset, unsigned long aLength, char *aType) 
127                 : startSeg(aStartSeg), startOffset(aStartOffset), length(aLength){
128                 strcpy(name, aName);
129                 strcpy(type, aType);
130         }
131
132         _section(_section&obj):startSeg(obj.startSeg), startOffset(obj.startOffset), length(obj.length){
133                 strcpy(name, obj.name);
134                 strcpy(type, obj.type);
135         }
136
137         ~_section(){ }
138 };
139
140 class MapSymbols  
141 {
142 private:
143         FILE *fp;
144         char *filename;
145         struct _list *headSymbols;
146         struct _list *currSymbols;
147
148         struct _list *headSection;
149         struct _list *currSection;
150
151         struct _list *headDLL;
152         struct _list *currDLL;
153
154
155         int numberOfDLL;
156
157         unsigned long preferredLoadAddr;
158
159         bool addSymbol(char* name, unsigned int address, bool function, unsigned long aLength=0, bool staticN= false);
160         bool addSection(char *aName, int aStartSeg, unsigned long aStartOffset, unsigned long aLength, char *aType);
161         bool addDLL(char *aName);
162
163         int findSegment(int seg, unsigned long offset);
164         bool getFirstSection(char *name, int *segment, unsigned long *offset, unsigned long *len);
165         bool getNextSection(char *name, int *segment, unsigned long *offset, unsigned long *len);
166         void printSymbols(); //debug only!
167
168 public:
169         MapSymbols();
170         MapSymbols(char *fname);
171         virtual ~MapSymbols();
172
173         bool setFilename(char *fname);
174         bool parseSymbols();
175         unsigned long getPreferredLoadAddress();
176         bool getFirstSymbol(char *name, unsigned long *address, bool *function, unsigned long *len, bool *staticN);
177         bool getNextSymbol(char*name, unsigned long *address, bool *function, unsigned long *len, bool *staticN);
178
179         bool getFirstDLL(char *name);
180         bool getNextDLL(char*name);
181
182         int getNumberOfDLL();
183
184
185 };
186