merge 37282 from amd64-branch:
[reactos.git] / reactos / tools / rsym / rsym.h
1 /* rsym.h */
2
3 #ifndef RSYM_H
4 #define RSYM_H
5
6 #define IMAGE_DOS_MAGIC 0x5a4d
7 #define IMAGE_PE_MAGIC 0x00004550
8 #define IMAGE_SIZEOF_SHORT_NAME 8
9
10 #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
11 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
12 #define IMAGE_FILE_DEBUG_STRIPPED 0x0200
13
14 #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
15
16 #define IMAGE_SCN_TYPE_NOLOAD 0x00000002
17 #define IMAGE_SCN_LNK_REMOVE 0x00000800
18 #define IMAGE_SCN_MEM_READ 0x40000000
19 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
20
21 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
22
23 typedef unsigned char BYTE;
24 typedef unsigned char UCHAR;
25 typedef unsigned short WORD;
26 typedef unsigned short USHORT;
27 typedef unsigned long long ULONGLONG;
28 #if defined(__x86_64__) && defined(unix)
29 typedef signed int LONG;
30 typedef unsigned int ULONG;
31 typedef unsigned int DWORD;
32 #else
33 typedef signed long LONG;
34 typedef unsigned long ULONG;
35 typedef unsigned long DWORD;
36 #endif
37 #if defined(_WIN64)
38 typedef unsigned __int64 ULONG_PTR;
39 #else
40 #if defined(__x86_64__) && defined(unix)
41 typedef unsigned int ULONG_PTR;
42 #else
43 typedef unsigned long ULONG_PTR;
44 #endif
45 #endif
46
47 #pragma pack(push,2)
48
49 typedef struct _IMAGE_DOS_HEADER {
50 WORD e_magic;
51 WORD e_cblp;
52 WORD e_cp;
53 WORD e_crlc;
54 WORD e_cparhdr;
55 WORD e_minalloc;
56 WORD e_maxalloc;
57 WORD e_ss;
58 WORD e_sp;
59 WORD e_csum;
60 WORD e_ip;
61 WORD e_cs;
62 WORD e_lfarlc;
63 WORD e_ovno;
64 WORD e_res[4];
65 WORD e_oemid;
66 WORD e_oeminfo;
67 WORD e_res2[10];
68 LONG e_lfanew;
69 } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
70 #pragma pack(pop)
71
72 #pragma pack(push,4)
73 typedef struct _IMAGE_FILE_HEADER {
74 WORD Machine;
75 WORD NumberOfSections;
76 DWORD TimeDateStamp;
77 DWORD PointerToSymbolTable;
78 DWORD NumberOfSymbols;
79 WORD SizeOfOptionalHeader;
80 WORD Characteristics;
81 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
82 #pragma pack(pop)
83
84 typedef struct _IMAGE_DATA_DIRECTORY {
85 DWORD VirtualAddress;
86 DWORD Size;
87 } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
88
89 typedef struct _IMAGE_OPTIONAL_HEADER32 {
90 WORD Magic;
91 BYTE MajorLinkerVersion;
92 BYTE MinorLinkerVersion;
93 DWORD SizeOfCode;
94 DWORD SizeOfInitializedData;
95 DWORD SizeOfUninitializedData;
96 DWORD AddressOfEntryPoint;
97 DWORD BaseOfCode;
98 DWORD BaseOfData;
99 DWORD ImageBase;
100 DWORD SectionAlignment;
101 DWORD FileAlignment;
102 WORD MajorOperatingSystemVersion;
103 WORD MinorOperatingSystemVersion;
104 WORD MajorImageVersion;
105 WORD MinorImageVersion;
106 WORD MajorSubsystemVersion;
107 WORD MinorSubsystemVersion;
108 DWORD Win32VersionValue;
109 DWORD SizeOfImage;
110 DWORD SizeOfHeaders;
111 DWORD CheckSum;
112 WORD Subsystem;
113 WORD DllCharacteristics;
114 DWORD SizeOfStackReserve;
115 DWORD SizeOfStackCommit;
116 DWORD SizeOfHeapReserve;
117 DWORD SizeOfHeapCommit;
118 DWORD LoaderFlags;
119 DWORD NumberOfRvaAndSizes;
120 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
121 } IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;
122
123 typedef struct _IMAGE_OPTIONAL_HEADER64 {
124 WORD Magic;
125 BYTE MajorLinkerVersion;
126 BYTE MinorLinkerVersion;
127 DWORD SizeOfCode;
128 DWORD SizeOfInitializedData;
129 DWORD SizeOfUninitializedData;
130 DWORD AddressOfEntryPoint;
131 DWORD BaseOfCode;
132 ULONGLONG ImageBase;
133 DWORD SectionAlignment;
134 DWORD FileAlignment;
135 WORD MajorOperatingSystemVersion;
136 WORD MinorOperatingSystemVersion;
137 WORD MajorImageVersion;
138 WORD MinorImageVersion;
139 WORD MajorSubsystemVersion;
140 WORD MinorSubsystemVersion;
141 DWORD Win32VersionValue;
142 DWORD SizeOfImage;
143 DWORD SizeOfHeaders;
144 DWORD CheckSum;
145 WORD Subsystem;
146 WORD DllCharacteristics;
147 ULONGLONG SizeOfStackReserve;
148 ULONGLONG SizeOfStackCommit;
149 ULONGLONG SizeOfHeapReserve;
150 ULONGLONG SizeOfHeapCommit;
151 DWORD LoaderFlags;
152 DWORD NumberOfRvaAndSizes;
153 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
154 } IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64;
155
156
157 #ifdef _TARGET_PE64
158 typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
159 typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
160 #else
161 typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
162 typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
163 #endif
164
165 typedef struct _IMAGE_SECTION_HEADER {
166 BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
167 union {
168 DWORD PhysicalAddress;
169 DWORD VirtualSize;
170 } Misc;
171 DWORD VirtualAddress;
172 DWORD SizeOfRawData;
173 DWORD PointerToRawData;
174 DWORD PointerToRelocations;
175 DWORD PointerToLinenumbers;
176 WORD NumberOfRelocations;
177 WORD NumberOfLinenumbers;
178 DWORD Characteristics;
179 } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
180
181 #pragma pack(push,4)
182 typedef struct _IMAGE_BASE_RELOCATION {
183 DWORD VirtualAddress;
184 DWORD SizeOfBlock;
185 WORD TypeOffset[1];
186 } IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
187 #pragma pack(pop)
188
189 typedef struct {
190 USHORT f_magic; /* magic number */
191 USHORT f_nscns; /* number of sections */
192 ULONG f_timdat; /* time & date stamp */
193 ULONG f_symptr; /* file pointer to symtab */
194 ULONG f_nsyms; /* number of symtab entries */
195 USHORT f_opthdr; /* sizeof(optional hdr) */
196 USHORT f_flags; /* flags */
197 } FILHDR;
198
199 typedef struct {
200 char s_name[8]; /* section name */
201 ULONG s_paddr; /* physical address, aliased s_nlib */
202 ULONG s_vaddr; /* virtual address */
203 ULONG s_size; /* section size */
204 ULONG s_scnptr; /* file ptr to raw data for section */
205 ULONG s_relptr; /* file ptr to relocation */
206 ULONG s_lnnoptr; /* file ptr to line numbers */
207 USHORT s_nreloc; /* number of relocation entries */
208 USHORT s_nlnno; /* number of line number entries */
209 ULONG s_flags; /* flags */
210 } SCNHDR;
211 #pragma pack(4)
212
213 typedef struct _SYMBOLFILE_HEADER {
214 ULONG SymbolsOffset;
215 ULONG SymbolsLength;
216 ULONG StringsOffset;
217 ULONG StringsLength;
218 } SYMBOLFILE_HEADER, *PSYMBOLFILE_HEADER;
219
220 typedef struct _STAB_ENTRY {
221 ULONG n_strx; /* index into string table of name */
222 UCHAR n_type; /* type of symbol */
223 UCHAR n_other; /* misc info (usually empty) */
224 USHORT n_desc; /* description field */
225 ULONG n_value; /* value of symbol */
226 } STAB_ENTRY, *PSTAB_ENTRY;
227
228 /* http://www.math.utah.edu/docs/info/stabs_12.html */
229 #define N_GYSM 0x20
230 #define N_FNAME 0x22
231 #define N_FUN 0x24
232 #define N_STSYM 0x26
233 #define N_LCSYM 0x28
234 #define N_MAIN 0x2A
235 #define N_PC 0x30
236 #define N_NSYMS 0x32
237 #define N_NOMAP 0x34
238 #define N_RSYM 0x40
239 #define N_M2C 0x42
240 #define N_SLINE 0x44
241 #define N_DSLINE 0x46
242 #define N_BSLINE 0x48
243 #define N_BROWS 0x48
244 #define N_DEFD 0x4A
245 #define N_EHDECL 0x50
246 #define N_MOD2 0x50
247 #define N_CATCH 0x54
248 #define N_SSYM 0x60
249 #define N_SO 0x64
250 #define N_LSYM 0x80
251 #define N_BINCL 0x82
252 #define N_SOL 0x84
253 #define N_PSYM 0xA0
254 #define N_EINCL 0xA2
255 #define N_ENTRY 0xA4
256 #define N_LBRAC 0xC0
257 #define N_EXCL 0xC2
258 #define N_SCOPE 0xC4
259 #define N_RBRAC 0xE0
260 #define N_BCOMM 0xE2
261 #define N_ECOMM 0xE4
262 #define N_ECOML 0xE8
263 #define N_LENG 0xFE
264
265 /* COFF symbol table */
266
267 #define E_SYMNMLEN 8 /* # characters in a symbol name */
268 #define E_FILNMLEN 14 /* # characters in a file name */
269 #define E_DIMNUM 4 /* # array dimensions in auxiliary entry */
270
271 #define N_BTMASK (0xf)
272 #define N_TMASK (0x30)
273 #define N_BTSHFT (4)
274 #define N_TSHIFT (2)
275
276 /* derived types, in e_type */
277 #define DT_NON (0) /* no derived type */
278 #define DT_PTR (1) /* pointer */
279 #define DT_FCN (2) /* function */
280 #define DT_ARY (3) /* array */
281
282 #define BTYPE(x) ((x) & N_BTMASK)
283
284 #define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))
285 #define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))
286 #define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))
287 #define ISTAG(x) ((x)==C_STRTAG||(x)==C_UNTAG||(x)==C_ENTAG)
288 #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
289
290 #define C_EFCN 0xff /* physical end of function */
291 #define C_NULL 0
292 #define C_AUTO 1 /* automatic variable */
293 #define C_EXT 2 /* external symbol */
294 #define C_STAT 3 /* static */
295 #define C_REG 4 /* register variable */
296 #define C_EXTDEF 5 /* external definition */
297 #define C_LABEL 6 /* label */
298 #define C_ULABEL 7 /* undefined label */
299 #define C_MOS 8 /* member of structure */
300 #define C_ARG 9 /* function argument */
301 #define C_STRTAG 10 /* structure tag */
302 #define C_MOU 11 /* member of union */
303 #define C_UNTAG 12 /* union tag */
304 #define C_TPDEF 13 /* type definition */
305 #define C_USTATIC 14 /* undefined static */
306 #define C_ENTAG 15 /* enumeration tag */
307 #define C_MOE 16 /* member of enumeration */
308 #define C_REGPARM 17 /* register parameter */
309 #define C_FIELD 18 /* bit field */
310 #define C_AUTOARG 19 /* auto argument */
311 #define C_LASTENT 20 /* dummy entry (end of block) */
312 #define C_BLOCK 100 /* ".bb" or ".eb" */
313 #define C_FCN 101 /* ".bf" or ".ef" */
314 #define C_EOS 102 /* end of structure */
315 #define C_FILE 103 /* file name */
316 #define C_LINE 104 /* line # reformatted as symbol table entry */
317 #define C_ALIAS 105 /* duplicate tag */
318 #define C_HIDDEN 106 /* ext symbol in dmert public lib */
319
320 #pragma pack(1)
321 typedef struct _COFF_SYMENT
322 {
323 union
324 {
325 char e_name[E_SYMNMLEN];
326 struct
327 {
328 ULONG e_zeroes;
329 ULONG e_offset;
330 }
331 e;
332 }
333 e;
334 ULONG e_value;
335 short e_scnum;
336 USHORT e_type;
337 UCHAR e_sclass;
338 UCHAR e_numaux;
339 } COFF_SYMENT, *PCOFF_SYMENT;
340 #pragma pack(4)
341
342 typedef struct _ROSSYM_ENTRY {
343 ULONG_PTR Address;
344 ULONG FunctionOffset;
345 ULONG FileOffset;
346 ULONG SourceLine;
347 } ROSSYM_ENTRY, *PROSSYM_ENTRY;
348
349 #define ROUND_UP(N, S) (((N) + (S) - 1) & ~((S) - 1))
350
351 extern char*
352 convert_path(const char* origpath);
353
354 extern void*
355 load_file ( const char* file_name, size_t* file_size );
356
357 #endif/*RSYM_H*/