Merge pull request #898 from UCIS/patch-3
[mono.git] / mono / metadata / cil-coff.h
1
2 #ifndef __MONO_CIL_COFF_H__
3 #define __MONO_CIL_COFF_H__
4
5 #include <mono/metadata/metadata.h>
6 #include <glib.h>
7
8 /*
9  * 25.2.1: Method header type values
10  */
11 #define METHOD_HEADER_FORMAT_MASK   3
12 #define METHOD_HEADER_TINY_FORMAT   2
13 #define METHOD_HEADER_FAT_FORMAT    3
14
15 /*
16  * 25.2.3.1: Flags for method headers
17  */
18 #define METHOD_HEADER_INIT_LOCALS   0x10
19 #define METHOD_HEADER_MORE_SECTS    0x08
20
21 /*
22  * For section data (25.3)
23  */
24 #define METHOD_HEADER_SECTION_RESERVED    0
25 #define METHOD_HEADER_SECTION_EHTABLE     1
26 #define METHOD_HEADER_SECTION_OPTIL_TABLE 2
27 #define METHOD_HEADER_SECTION_FAT_FORMAT  0x40
28 #define METHOD_HEADER_SECTION_MORE_SECTS  0x80
29
30 /* 128 bytes */
31 typedef struct {
32         char    msdos_sig [2];
33         guint16 nlast_page;
34         guint16 npages;
35         char    msdos_header [54];
36         guint32 pe_offset;
37         char    msdos_header2 [64];
38 } MonoMSDOSHeader;
39
40 /* Possible values for coff_machine */
41 #define COFF_MACHINE_I386 332
42 #define COFF_MACHINE_IA64 512
43 #define COFF_MACHINE_AMD64 34404
44 #define COFF_MACHINE_ARM 452
45
46 /* 20 bytes */
47 typedef struct {
48         guint16  coff_machine;
49         guint16  coff_sections;
50         guint32  coff_time;
51         guint32  coff_symptr;
52         guint32  coff_symcount;
53         guint16  coff_opt_header_size;
54         guint16  coff_attributes;
55 } MonoCOFFHeader;
56
57 #define COFF_ATTRIBUTE_EXECUTABLE_IMAGE 0x0002
58 #define COFF_ATTRIBUTE_LIBRARY_IMAGE    0x2000
59
60 /* 28 bytes */
61 typedef struct {
62         guint16 pe_magic;
63         guchar  pe_major;
64         guchar  pe_minor;
65         guint32 pe_code_size;
66         guint32 pe_data_size;
67         guint32 pe_uninit_data_size;
68         guint32 pe_rva_entry_point;
69         guint32 pe_rva_code_base;
70         guint32 pe_rva_data_base;
71 } MonoPEHeader;
72
73 /* 24 bytes */
74 typedef struct {
75         guint16 pe_magic;
76         guchar  pe_major;
77         guchar  pe_minor;
78         guint32 pe_code_size;
79         guint32 pe_data_size;
80         guint32 pe_uninit_data_size;
81         guint32 pe_rva_entry_point;
82         guint32 pe_rva_code_base;
83 } MonoPEHeader64;
84
85 /* 68 bytes */
86 typedef struct {
87         guint32 pe_image_base;          /* must be 0x400000 */
88         guint32 pe_section_align;       /* must be 8192 */
89         guint32 pe_file_alignment;      /* must be 512 or 4096 */
90         guint16 pe_os_major;            /* must be 4 */
91         guint16 pe_os_minor;            /* must be 0 */
92         guint16 pe_user_major;
93         guint16 pe_user_minor;
94         guint16 pe_subsys_major;
95         guint16 pe_subsys_minor;
96         guint32 pe_reserved_1;
97         guint32 pe_image_size;
98         guint32 pe_header_size;
99         guint32 pe_checksum;
100         guint16 pe_subsys_required;
101         guint16 pe_dll_flags;
102         guint32 pe_stack_reserve;
103         guint32 pe_stack_commit;
104         guint32 pe_heap_reserve;
105         guint32 pe_heap_commit;
106         guint32 pe_loader_flags;
107         guint32 pe_data_dir_count;
108 } MonoPEHeaderNT;
109
110 /* 88 bytes */
111 typedef struct {
112         guint64 pe_image_base;
113         guint32 pe_section_align;       /* must be 8192 */
114         guint32 pe_file_alignment;      /* must be 512 or 4096 */
115         guint16 pe_os_major;            /* must be 4 */
116         guint16 pe_os_minor;            /* must be 0 */
117         guint16 pe_user_major;
118         guint16 pe_user_minor;
119         guint16 pe_subsys_major;
120         guint16 pe_subsys_minor;
121         guint32 pe_reserved_1;
122         guint32 pe_image_size;
123         guint32 pe_header_size;
124         guint32 pe_checksum;
125         guint16 pe_subsys_required;
126         guint16 pe_dll_flags;
127         guint64 pe_stack_reserve;
128         guint64 pe_stack_commit;
129         guint64 pe_heap_reserve;
130         guint64 pe_heap_commit;
131         guint32 pe_loader_flags;
132         guint32 pe_data_dir_count;
133 } MonoPEHeaderNT64;
134
135 typedef struct {
136         guint32 rde_data_offset;
137         guint32 rde_size;
138         guint32 rde_codepage;
139         guint32 rde_reserved;
140 } MonoPEResourceDataEntry;
141
142 #define MONO_PE_RESOURCE_ID_CURSOR      0x01
143 #define MONO_PE_RESOURCE_ID_BITMAP      0x02
144 #define MONO_PE_RESOURCE_ID_ICON        0x03
145 #define MONO_PE_RESOURCE_ID_MENU        0x04
146 #define MONO_PE_RESOURCE_ID_DIALOG      0x05
147 #define MONO_PE_RESOURCE_ID_STRING      0x06
148 #define MONO_PE_RESOURCE_ID_FONTDIR     0x07
149 #define MONO_PE_RESOURCE_ID_FONT        0x08
150 #define MONO_PE_RESOURCE_ID_ACCEL       0x09
151 #define MONO_PE_RESOURCE_ID_RCDATA      0x0a
152 #define MONO_PE_RESOURCE_ID_MESSAGETABLE        0x0b
153 #define MONO_PE_RESOURCE_ID_GROUP_CURSOR        0x0c
154 #define MONO_PE_RESOURCE_ID_GROUP_ICON  0x0d
155 #define MONO_PE_RESOURCE_ID_VERSION     0x10
156 #define MONO_PE_RESOURCE_ID_DLGINCLUDE  0x11
157 #define MONO_PE_RESOURCE_ID_PLUGPLAY    0x13
158 #define MONO_PE_RESOURCE_ID_VXD         0x14
159 #define MONO_PE_RESOURCE_ID_ANICURSOR   0x15
160 #define MONO_PE_RESOURCE_ID_ANIICON     0x16
161 #define MONO_PE_RESOURCE_ID_HTML        0x17
162 #define MONO_PE_RESOURCE_ID_ASPNET_STRING       0x65
163
164 typedef struct {
165         /* If the MSB is set, then the other 31 bits store the RVA of
166          * the unicode string containing the name.  Otherwise, the
167          * other 31 bits contain the ID of this entry.
168          */
169         guint32 name;
170
171         /* If the MSB is set, then the other 31 bits store the RVA of
172          * another subdirectory.  Otherwise, the other 31 bits store
173          * the RVA of the resource data entry leaf node.
174          */
175         guint32 dir;
176 } MonoPEResourceDirEntry;
177
178 #define MONO_PE_RES_DIR_ENTRY_NAME_IS_STRING(d) (GUINT32_FROM_LE((d).name) >> 31)
179 #define MONO_PE_RES_DIR_ENTRY_NAME_OFFSET(d)    (GUINT32_FROM_LE((d).name) & 0x7fffffff)
180 #define MONO_PE_RES_DIR_ENTRY_SET_NAME(d,i,o)   ((d).name = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff)))
181
182 #define MONO_PE_RES_DIR_ENTRY_IS_DIR(d)         (GUINT32_FROM_LE((d).dir) >> 31)
183 #define MONO_PE_RES_DIR_ENTRY_DIR_OFFSET(d)     (GUINT32_FROM_LE((d).dir) & 0x7fffffff)
184 #define MONO_PE_RES_DIR_ENTRY_SET_DIR(d,i,o)    ((d).dir = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff)))
185
186 typedef struct 
187 {
188         guint32 res_characteristics;
189         guint32 res_date_stamp;
190         guint16 res_major;
191         guint16 res_minor;
192         guint16 res_named_entries;
193         guint16 res_id_entries;
194         /* Directory entries follow on here.  The array is
195          * res_named_entries + res_id_entries long, containing all
196          * named entries first.
197          */
198 } MonoPEResourceDir;
199
200 typedef struct {
201         guint32 rva;
202         guint32 size;
203 } MonoPEDirEntry;
204
205 /* 128 bytes */
206 typedef struct {
207         MonoPEDirEntry pe_export_table;
208         MonoPEDirEntry pe_import_table;
209         MonoPEDirEntry pe_resource_table;
210         MonoPEDirEntry pe_exception_table;
211         MonoPEDirEntry pe_certificate_table;
212         MonoPEDirEntry pe_reloc_table;
213         MonoPEDirEntry pe_debug;
214         MonoPEDirEntry pe_copyright;
215         MonoPEDirEntry pe_global_ptr;
216         MonoPEDirEntry pe_tls_table;
217         MonoPEDirEntry pe_load_config_table;
218         MonoPEDirEntry pe_bound_import;
219         MonoPEDirEntry pe_iat;
220         MonoPEDirEntry pe_delay_import_desc;
221         MonoPEDirEntry pe_cli_header;
222         MonoPEDirEntry pe_reserved;
223 } MonoPEDatadir;
224
225 /* 248 bytes */
226 typedef struct {
227         char            pesig [4];
228         MonoCOFFHeader  coff;
229         MonoPEHeader    pe;
230         MonoPEHeaderNT  nt;
231         MonoPEDatadir   datadir;
232 } MonoDotNetHeader32;
233
234 /* 248 bytes */
235 typedef struct {
236         char            pesig [4];
237         MonoCOFFHeader  coff;
238         MonoPEHeader    pe;
239         MonoPEHeaderNT  nt;
240         MonoPEDatadir   datadir;
241 } MonoDotNetHeader;
242
243 /* XX248 bytes */
244 typedef struct {
245         char              pesig [4];
246         MonoCOFFHeader    coff;
247         MonoPEHeader64    pe;
248         MonoPEHeaderNT64  nt;
249         MonoPEDatadir     datadir;
250 } MonoDotNetHeader64;
251
252 #define VTFIXUP_TYPE_32BIT                            0x01
253 #define VTFIXUP_TYPE_64BIT                            0x02
254 #define VTFIXUP_TYPE_FROM_UNMANAGED                   0x04
255 #define VTFIXUP_TYPE_FROM_UNMANAGED_RETAIN_APPDOMAIN  0x08
256 #define VTFIXUP_TYPE_CALL_MOST_DERIVED                0x10
257
258 typedef struct {
259         guint32 rva;
260         guint16 count;
261         guint16 type;
262 } MonoVTableFixup;
263
264 typedef struct {
265         char    st_name [8];
266         guint32 st_virtual_size;
267         guint32 st_virtual_address;
268         guint32 st_raw_data_size;
269         guint32 st_raw_data_ptr;
270         guint32 st_reloc_ptr;
271         guint32 st_lineno_ptr;
272         guint16 st_reloc_count;
273         guint16 st_line_count;
274
275 #define SECT_FLAGS_HAS_CODE               0x20
276 #define SECT_FLAGS_HAS_INITIALIZED_DATA   0x40
277 #define SECT_FLAGS_HAS_UNINITIALIZED_DATA 0x80
278 #define SECT_FLAGS_MEM_DISCARDABLE        0x02000000
279 #define SECT_FLAGS_MEM_NOT_CACHED         0x04000000
280 #define SECT_FLAGS_MEM_NOT_PAGED          0x08000000
281 #define SECT_FLAGS_MEM_SHARED             0x10000000
282 #define SECT_FLAGS_MEM_EXECUTE            0x20000000
283 #define SECT_FLAGS_MEM_READ               0x40000000
284 #define SECT_FLAGS_MEM_WRITE              0x80000000
285         guint32 st_flags;
286
287 } MonoSectionTable;
288
289 typedef struct {
290         guint32        ch_size;
291         guint16        ch_runtime_major;
292         guint16        ch_runtime_minor;
293         MonoPEDirEntry ch_metadata;
294
295 #define CLI_FLAGS_ILONLY         0x01
296 #define CLI_FLAGS_32BITREQUIRED  0x02
297 #define CLI_FLAGS_STRONGNAMESIGNED 0x8
298 #define CLI_FLAGS_PREFERRED32BIT  0x10
299 #define CLI_FLAGS_TRACKDEBUGDATA 0x00010000
300         guint32        ch_flags;
301
302         guint32        ch_entry_point;
303         MonoPEDirEntry ch_resources;
304         MonoPEDirEntry ch_strong_name;
305         MonoPEDirEntry ch_code_manager_table;
306         MonoPEDirEntry ch_vtable_fixups;
307         MonoPEDirEntry ch_export_address_table_jumps;
308
309         /* The following are zero in the current docs */
310         MonoPEDirEntry ch_eeinfo_table;
311         MonoPEDirEntry ch_helper_table;
312         MonoPEDirEntry ch_dynamic_info;
313         MonoPEDirEntry ch_delay_load_info;
314         MonoPEDirEntry ch_module_image;
315         MonoPEDirEntry ch_external_fixups;
316         MonoPEDirEntry ch_ridmap;
317         MonoPEDirEntry ch_debug_map;
318         MonoPEDirEntry ch_ip_map;
319 } MonoCLIHeader;
320
321 /* This is not an on-disk structure */
322 typedef struct {
323         MonoDotNetHeader  cli_header;
324         int               cli_section_count;
325         MonoSectionTable  *cli_section_tables;
326         void            **cli_sections;
327         MonoCLIHeader     cli_cli_header;
328 } MonoCLIImageInfo;
329
330 MONO_API guint32       mono_cli_rva_image_map (MonoImage *image, guint32 rva);
331
332 #endif /* __MONO_CIL_COFF_H__ */