retdec
pdb_symbols.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_PDBPARSER_PDB_SYMBOLS_H
8 #define RETDEC_PDBPARSER_PDB_SYMBOLS_H
9 
13 
14 namespace retdec {
15 namespace pdbparser {
16 
17 class PDBSymbols;
18 
19 // =================================================================
20 // LOCAL VARIABLE STRUCTURES
21 // =================================================================
22 
23 // Local variable location
25 {
27 };
28 
29 // PDB local variable
30 typedef struct _PDBLocalVariable
31 {
32  char * name; // Name
34  int block; // Function block
35  int offset; // Offset (ignored for register)
36  int register_num; // Register number (ignored for bprel32)
37  unsigned int type_index; // Type index
38  PDBTypeDef * type_def; // Type definition
40 
41 // =================================================================
42 // CLASS PDBFunction
43 // =================================================================
44 
45 // PDB data inside function's code
46 typedef struct _PDBFunctionData
47 {
48  char * name; // Name
49  uint64_t address; // Virtual address (image base + section address + offset)
50  int offset; // Offset
51  int section; // Segment
52  unsigned int type_index; // Type index
53  PDBTypeDef * type_def; // Type definition
55 
56 // PDB line number information
57 typedef struct _PDBLineInfo
58 {
59  int line;
60  unsigned int offset;
62 
64 {
65  public:
66  char * name = nullptr; // Function name
67  int overload_index = 0; // Function is overloaded (number of function's occurrence)
68  uint64_t address = 0; // Virtual address (image base + section address + offset)
69  int offset = 0; // Function offset
70  int section = 0; // And section
71  int module_index = 0; // In which module the function is
72  int length = 0; // Function length
73  unsigned int type_index = 0; // Type index
74  PDBTypeFunction * type_def = nullptr; // Type definition
75  std::vector<PDBLocalVariable> arguments; // List of function arguments
76  std::vector<PDBLocalVariable> loc_variables; // List of local variables
77  std::vector<int> blocks; // List of code blocks (value is offset)
78  std::vector<PDBFunctionData> data; // List of data objects stored in function's code
79  std::vector<PDBLineInfo> lines; // Line number information
80 
81  PDBFunction(int cur_module) : module_index(cur_module)
82  {
83  }
84  ; // Constructor
85  void dump(void); // Dump function
86  bool parse_symbol(PDBGeneralSymbol *symbol, PDBTypes *types, PDBSymbols *pdbsyms); // Parse given symbol
87  void parse_line_info(LineInfoHeader *hdr); // Parse line information
88  std::string getNameWithOverloadIndex() const;
89  private:
90  int args_remain = 0; // Number of arguments remaining to add
91  int cur_block = 0; // Number of current block
92  int depth = 0; // Depth of blocks
93 };
94 
95 // PDB function map (key is address)
96 typedef std::map<uint64_t, PDBFunction *> PDBFunctionAddressMap;
97 
98 // =================================================================
99 // GLOBAL VARIABLE STRUCTURES
100 // =================================================================
101 
102 // PDB global variable
103 typedef struct _PDBGlobalVariable
104 {
105  char * name; // Name
106  uint64_t address; // Virtual address (image base + section address + offset)
107  int offset; // Offset (ignored for register)
108  int section; // Segment
109  int module_index; // In which module the variable is
110  unsigned int type_index; // Type index
111  PDBTypeDef * type_def; // Type definition
113 
114 // PDB global variable map (key is segment+offset (in int32 : SSOOOOOO))
115 typedef std::map<uint64_t, PDBGlobalVariable> PDBGlobalVarAddressMap;
116 
117 // =================================================================
118 // MAIN CLASS PDBSymbols
119 // =================================================================
120 
122 {
123  public:
124  // Constructor and destructor
126  PDBTypes * tps) :
127 // pdb_gsi_size(gsi->size),
128 // pdb_gsi_data(gsi->data),
129 // pdb_psi_size(psi->size),
130 // pdb_psi_data(psi->data),
131  pdb_sym_size(sym->size), pdb_sym_data(sym->data), modules(m), sections(s), types(tps), parsed(false)
132  {
133  }
134  ;
135  ~PDBSymbols(void);
136 
137  // Action methods
138  void parse_symbols(void);
139 
140  // Getting methods
142  {
143  return functions;
144  }
145  ;
147  {
148  return global_variables;
149  }
150  ;
151 
155  uint64_t get_virtual_address(unsigned int section, unsigned int offset)
156  {
157  if (sections.size() > section)
158  return sections[section].virtual_address + offset;
159  else
160  return -1;
161  }
162  ;
163 
167  uint64_t get_file_address(unsigned int section, unsigned int offset)
168  {
169  if (sections.size() > section)
170  return sections[section].file_address + offset;
171  else
172  return -1;
173  }
174  ;
175 
176  // Printing methods
177  void dump_global_symbols(void);
178  void dump_module_symbols(int index);
179  void dump_all_modules(void);
180  void print_functions(void);
181  void print_global_variables(void);
182 
183  private:
184  // Internal functions
185  static void dump_symbol(PSYM Sym);
186 
187  // Variables
188 // unsigned int pdb_gsi_size; // size of GSI stream
189 // char * pdb_gsi_data; // data from GSI stream
190 // unsigned int pdb_psi_size; // size of PSI stream
191 // char * pdb_psi_data; // data from PSI stream
192  unsigned int pdb_sym_size; // size of SYM stream
193  char * pdb_sym_data; // data from SYM stream
194  PDBModulesVec & modules; // modules
195  PDBSectionsVec & sections; // sections
196  PDBTypes * types; // types
197  bool parsed; // modules are parsed
198 
199  // Data containers
200  PDBFunctionAddressMap functions; // Map of functions (key is address)
201  PDBGlobalVarAddressMap global_variables; // Map of global variables (key is address)
202 };
203 
204 } // namespace pdbparser
205 } // namespace retdec
206 
207 #endif
Definition: pdb_symbols.h:64
std::vector< PDBLineInfo > lines
Definition: pdb_symbols.h:79
int offset
Definition: pdb_symbols.h:69
PDBFunction(int cur_module)
Definition: pdb_symbols.h:81
unsigned int type_index
Definition: pdb_symbols.h:73
PDBTypeFunction * type_def
Definition: pdb_symbols.h:74
int module_index
Definition: pdb_symbols.h:71
std::vector< int > blocks
Definition: pdb_symbols.h:77
void dump(void)
Definition: pdb_symbols.cpp:59
std::vector< PDBLocalVariable > loc_variables
Definition: pdb_symbols.h:76
int cur_block
Definition: pdb_symbols.h:91
int args_remain
Definition: pdb_symbols.h:90
int overload_index
Definition: pdb_symbols.h:67
std::string getNameWithOverloadIndex() const
Definition: pdb_symbols.cpp:242
int depth
Definition: pdb_symbols.h:92
std::vector< PDBFunctionData > data
Definition: pdb_symbols.h:78
uint64_t address
Definition: pdb_symbols.h:68
int length
Definition: pdb_symbols.h:72
char * name
Definition: pdb_symbols.h:66
int section
Definition: pdb_symbols.h:70
std::vector< PDBLocalVariable > arguments
Definition: pdb_symbols.h:75
bool parse_symbol(PDBGeneralSymbol *symbol, PDBTypes *types, PDBSymbols *pdbsyms)
Definition: pdb_symbols.cpp:113
void parse_line_info(LineInfoHeader *hdr)
Definition: pdb_symbols.cpp:228
Definition: pdb_symbols.h:122
PDBModulesVec & modules
Definition: pdb_symbols.h:194
void print_global_variables(void)
Definition: pdb_symbols.cpp:766
char * pdb_sym_data
Definition: pdb_symbols.h:193
PDBGlobalVarAddressMap & get_global_variables(void)
Definition: pdb_symbols.h:146
void print_functions(void)
Definition: pdb_symbols.cpp:756
PDBFunctionAddressMap functions
Definition: pdb_symbols.h:200
~PDBSymbols(void)
Definition: pdb_symbols.cpp:788
PDBSymbols(PDBStream *gsi, PDBStream *psi, PDBStream *sym, PDBModulesVec &m, PDBSectionsVec &s, PDBTypes *tps)
Definition: pdb_symbols.h:125
void dump_global_symbols(void)
Definition: pdb_symbols.cpp:406
uint64_t get_virtual_address(unsigned int section, unsigned int offset)
Definition: pdb_symbols.h:155
PDBTypes * types
Definition: pdb_symbols.h:196
PDBFunctionAddressMap & get_functions(void)
Definition: pdb_symbols.h:141
void dump_module_symbols(int index)
Definition: pdb_symbols.cpp:423
uint64_t get_file_address(unsigned int section, unsigned int offset)
Definition: pdb_symbols.h:167
static void dump_symbol(PSYM Sym)
Definition: pdb_symbols.cpp:801
bool parsed
Definition: pdb_symbols.h:197
void parse_symbols(void)
Definition: pdb_symbols.cpp:263
PDBSectionsVec & sections
Definition: pdb_symbols.h:195
PDBGlobalVarAddressMap global_variables
Definition: pdb_symbols.h:201
unsigned int pdb_sym_size
Definition: pdb_symbols.h:192
void dump_all_modules(void)
Definition: pdb_symbols.cpp:747
Definition: pdb_types.h:84
Definition: pdb_types.h:428
Definition: pdb_types.h:584
PDB info.
std::vector< PDBModule > PDBModulesVec
Definition: pdb_utils.h:114
ePDBLocVarLocation
Definition: pdb_symbols.h:25
@ PDBLVLOC_REGREL32
Definition: pdb_symbols.h:26
@ PDBLVLOC_BPREL32
Definition: pdb_symbols.h:26
@ PDBLVLOC_REGISTER
Definition: pdb_symbols.h:26
std::vector< PDBPESection > PDBSectionsVec
Definition: pdb_utils.h:125
struct retdec::pdbparser::_PDBLineInfo PDBLineInfo
struct retdec::pdbparser::_PDBLocalVariable PDBLocalVariable
struct retdec::pdbparser::_PDBGlobalVariable PDBGlobalVariable
struct retdec::pdbparser::_PDBFunctionData PDBFunctionData
std::map< uint64_t, PDBFunction * > PDBFunctionAddressMap
Definition: pdb_symbols.h:96
std::map< uint64_t, PDBGlobalVariable > PDBGlobalVarAddressMap
Definition: pdb_symbols.h:115
Definition: archive_wrapper.h:19
Definition: pdb_info.h:3780
Definition: pdb_symbols.h:47
PDBTypeDef * type_def
Definition: pdb_symbols.h:53
int section
Definition: pdb_symbols.h:51
char * name
Definition: pdb_symbols.h:48
unsigned int type_index
Definition: pdb_symbols.h:52
int offset
Definition: pdb_symbols.h:50
uint64_t address
Definition: pdb_symbols.h:49
Definition: pdb_utils.h:129
Definition: pdb_symbols.h:104
int module_index
Definition: pdb_symbols.h:109
char * name
Definition: pdb_symbols.h:105
unsigned int type_index
Definition: pdb_symbols.h:110
int offset
Definition: pdb_symbols.h:107
PDBTypeDef * type_def
Definition: pdb_symbols.h:111
uint64_t address
Definition: pdb_symbols.h:106
int section
Definition: pdb_symbols.h:108
Definition: pdb_symbols.h:58
unsigned int offset
Definition: pdb_symbols.h:60
int line
Definition: pdb_symbols.h:59
Definition: pdb_symbols.h:31
PDBTypeDef * type_def
Definition: pdb_symbols.h:38
int block
Definition: pdb_symbols.h:34
int offset
Definition: pdb_symbols.h:35
ePDBLocVarLocation location
Definition: pdb_symbols.h:33
unsigned int type_index
Definition: pdb_symbols.h:37
int register_num
Definition: pdb_symbols.h:36
char * name
Definition: pdb_symbols.h:32
Definition: pdb_utils.h:95
Definition: pdb_info.h:3543