2f0331 object generation: added mdso_objgen_dsometa().

Authored and Committed by midipix 8 years ago
    object generation: added mdso_objgen_dsometa().
    
        
file modified
+1 -0
include/mdso/mdso.h CHANGED
@@ -147,6 +147,7 @@ mdso_api uint64_t mdso_crc64_mbstr (const unsigned char * str, size_t * symlen);
147
147
mdso_api int mdso_asmgen_dsometa (const struct mdso_driver_ctx *, FILE * fout);
148
148
mdso_api int mdso_asmgen_symentry (const struct mdso_driver_ctx *, const char * sym, FILE * fout);
149
149
mdso_api int mdso_asmgen_symfn (const struct mdso_driver_ctx *, const char * sym, FILE * fout);
150
+ mdso_api int mdso_objgen_dsometa (const struct mdso_driver_ctx *, FILE * fout, struct mdso_object *);
150
151
mdso_api int mdso_objgen_symentry (const struct mdso_driver_ctx *, const char * sym, FILE * fout, struct mdso_object *);
151
152
mdso_api int mdso_objgen_symfn (const struct mdso_driver_ctx *, const char * sym, FILE * fout, struct mdso_object *);
152
153
file modified
+31 -0
include/mdso/mdso_specs.h CHANGED
@@ -45,4 +45,35 @@ struct mdso_meta_record {
45
45
void * fnr2;
46
46
};
47
47
48
+
49
+ struct mdso_meta_record_m32 {
50
+ uint32_t base;
51
+ uint32_t name;
52
+ uint32_t flags;
53
+ uint32_t priority;
54
+ uint32_t nsyms;
55
+ uint32_t padding;
56
+ uint32_t hashtbl;
57
+ uint32_t symtbl;
58
+ uint32_t fncarg;
59
+ uint32_t fncargarr;
60
+ uint32_t fnr1;
61
+ uint32_t fnr2;
62
+ };
63
+
64
+ struct mdso_meta_record_m64 {
65
+ uint64_t base;
66
+ uint64_t name;
67
+ uint32_t flags;
68
+ uint32_t priority;
69
+ uint32_t nsyms;
70
+ uint32_t padding;
71
+ uint64_t hashtbl;
72
+ uint64_t symtbl;
73
+ uint64_t fncarg;
74
+ uint64_t fncargarr;
75
+ uint64_t fnr1;
76
+ uint64_t fnr2;
77
+ };
78
+
48
79
#endif
file modified
+1 -0
project/common.mk CHANGED
@@ -10,6 +10,7 @@ API_SRCS = \
10
10
src/logic/mdso_asmgen_symentry.c \
11
11
src/logic/mdso_asmgen_symfn.c \
12
12
src/logic/mdso_map_input.c \
13
+ src/object/mdso_objgen_dsometa.c \
13
14
src/object/mdso_objgen_symentry.c \
14
15
src/object/mdso_objgen_symfn.c \
15
16
src/output/mdso_output_error.c \
src/object/mdso_objgen_dsometa.c ADDED
@@ -0,0 +1,233 @@
1
+ /****************************************************************/
2
+ /* mdso: midipix dso scavenger */
3
+ /* Copyright (C) 2015--2017 Z. Gilboa */
4
+ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
5
+ /****************************************************************/
6
+
7
+ #include <stdio.h>
8
+ #include <stddef.h>
9
+ #include <stdint.h>
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+
13
+ #include <mdso/mdso.h>
14
+ #include <mdso/mdso_specs.h>
15
+ #include "mdso_object_impl.h"
16
+ #include "mdso_errinfo_impl.h"
17
+ #include "perk_consts.h"
18
+ #include "perk_structs.h"
19
+
20
+ struct mdso_unified_record {
21
+ unsigned char data[80];
22
+ };
23
+
24
+ struct mdso_dsometa_object {
25
+ struct pe_raw_coff_object_hdr hdr;
26
+ struct pe_raw_sec_hdr sec[2];
27
+ struct mdso_unified_record rec[1];
28
+ struct pe_raw_coff_reloc rel[1];
29
+ struct pe_raw_coff_symbol sym[8];
30
+ struct pe_raw_coff_strtbl cst;
31
+ };
32
+
33
+ int mdso_objgen_dsometa(
34
+ const struct mdso_driver_ctx * dctx,
35
+ FILE * fout,
36
+ struct mdso_object * vobj)
37
+ {
38
+ struct mdso_dsometa_object * dsometa;
39
+ struct pe_raw_coff_symbol * symrec;
40
+ unsigned char * mark;
41
+ struct pe_aux_rec_section * aux;
42
+ size_t buflen;
43
+ uint32_t liblen;
44
+ uint32_t cstlen;
45
+ uint32_t objlen;
46
+ uint32_t aattr;
47
+ uint32_t sattr;
48
+ uint32_t rattr;
49
+ uint16_t oattr;
50
+ uint16_t machine;
51
+ uint16_t reltype;
52
+ uint32_t relrva;
53
+ uint32_t reclen;
54
+ uint32_t recoff;
55
+ uint32_t reloff;
56
+ uint32_t symoff;
57
+ uint32_t cstoff;
58
+ uint32_t datoff;
59
+ uint32_t stroff;
60
+
61
+ if ((buflen = strlen(dctx->cctx->libname)) > 1024*1024)
62
+ return MDSO_CUSTOM_ERROR(dctx,MDSO_ERR_INVALID_DATA);
63
+
64
+ liblen = (uint32_t)buflen;
65
+ cstlen = (3 * liblen) + 48;
66
+ objlen = sizeof(*dsometa) + cstlen;
67
+
68
+ if (vobj && vobj->addr && (vobj->size < objlen))
69
+ return MDSO_BUFFER_ERROR(dctx);
70
+
71
+ if (vobj && !vobj->addr) {
72
+ vobj->size = objlen;
73
+ return 0;
74
+ }
75
+
76
+ if (vobj)
77
+ dsometa = (struct mdso_dsometa_object *)vobj->addr;
78
+
79
+ else if (!(dsometa = calloc(1,objlen)))
80
+ return MDSO_SYSTEM_ERROR(dctx);
81
+
82
+ if (dctx->cctx->drvflags & MDSO_DRIVER_QUAD_PTR) {
83
+ reclen = sizeof(struct mdso_meta_record_m64);
84
+ aattr = PE_IMAGE_SCN_ALIGN_16BYTES;
85
+ machine = PE_IMAGE_FILE_MACHINE_AMD64;
86
+ reltype = PE_IMAGE_REL_AMD64_ADDR64;
87
+ relrva = 8;
88
+ } else {
89
+ reclen = sizeof(struct mdso_meta_record_m32);
90
+ aattr = PE_IMAGE_SCN_ALIGN_8BYTES;
91
+ machine = PE_IMAGE_FILE_MACHINE_I386;
92
+ reltype = PE_IMAGE_REL_I386_DIR32;
93
+ relrva = 4;
94
+ }
95
+
96
+ sattr = PE_IMAGE_SCN_ALIGN_1BYTES;
97
+ sattr |= PE_IMAGE_SCN_MEM_READ;
98
+ sattr |= PE_IMAGE_SCN_CNT_INITIALIZED_DATA;
99
+
100
+ rattr = aattr;
101
+ rattr |= PE_IMAGE_SCN_MEM_READ;
102
+ rattr |= PE_IMAGE_SCN_CNT_INITIALIZED_DATA;
103
+
104
+ oattr = PE_IMAGE_FILE_LINE_NUMS_STRIPPED;
105
+ recoff = offsetof(struct mdso_dsometa_object,rec);
106
+ reloff = offsetof(struct mdso_dsometa_object,rel);
107
+ symoff = offsetof(struct mdso_dsometa_object,sym);
108
+ cstoff = offsetof(struct pe_raw_coff_strtbl,cst_data);
109
+ datoff = 0;
110
+
111
+ stroff = objlen - liblen - 16;
112
+ stroff += 0xf;
113
+ stroff |= 0xf;
114
+ stroff ^= 0xf;
115
+
116
+ /* coff object header */
117
+ mdso_obj_write_short(dsometa->hdr.cfh_machine,machine);
118
+ mdso_obj_write_short(dsometa->hdr.cfh_num_of_sections,2);
119
+ mdso_obj_write_long(dsometa->hdr.cfh_ptr_to_sym_tbl,symoff);
120
+ mdso_obj_write_long(dsometa->hdr.cfh_num_of_syms,8);
121
+ mdso_obj_write_short(dsometa->hdr.cfh_characteristics,oattr);
122
+
123
+ /* .dsostrs section header */
124
+ memcpy(dsometa->sec[0].sh_name,".dsostrs",8);
125
+ mdso_obj_write_long(dsometa->sec[0].sh_size_of_raw_data,liblen+1);
126
+ mdso_obj_write_long(dsometa->sec[0].sh_ptr_to_raw_data,stroff);
127
+ mdso_obj_write_long(dsometa->sec[0].sh_characteristics,sattr);
128
+
129
+ /* .dsometa section header */
130
+ memcpy(dsometa->sec[1].sh_name,".dsometa",8);
131
+ mdso_obj_write_long(dsometa->sec[1].sh_size_of_raw_data,reclen);
132
+ mdso_obj_write_long(dsometa->sec[1].sh_ptr_to_raw_data,recoff);
133
+ mdso_obj_write_long(dsometa->sec[1].sh_ptr_to_relocs,reloff);
134
+ mdso_obj_write_short(dsometa->sec[1].sh_num_of_relocs,1);
135
+ mdso_obj_write_long(dsometa->sec[1].sh_characteristics,rattr);
136
+
137
+ /* .dsometa section data: flags */
138
+ mark = dsometa->rec[0].data;
139
+ mdso_obj_write_long(&mark[2*relrva],dctx->cctx->dsoflags);
140
+
141
+ /* .dsometa relocation record: .name */
142
+ mdso_obj_write_long(dsometa->rel[0].rel_sym,6);
143
+ mdso_obj_write_long(dsometa->rel[0].rel_rva,relrva);
144
+ mdso_obj_write_short(dsometa->rel[0].rel_type,reltype);
145
+
146
+ /* coff string table */
147
+ mdso_obj_write_long(dsometa->cst.cst_size,cstlen);
148
+
149
+ /* coff symbol table */
150
+ symrec = dsometa->sym;
151
+ mark = dsometa->cst.cst_data;
152
+
153
+ /* coff symbol: .file */
154
+ symrec[0].cs_storage_class[0] = PE_IMAGE_SYM_CLASS_FILE;
155
+ symrec[0].cs_num_of_aux_symbols[0] = 1;
156
+
157
+ mdso_obj_write_short(&symrec[0].cs_section_number[0],PE_IMAGE_SYM_DEBUG);
158
+ mdso_obj_write_long(&symrec[1].cs_name[4],cstoff+datoff);
159
+
160
+ memcpy(symrec[0].cs_name,".file",5);
161
+ memcpy(&mark[0],".dsometa_",9);
162
+ memcpy(&mark[9],dctx->cctx->libname,liblen);
163
+ memcpy(&mark[9+liblen],".s",2);
164
+
165
+ datoff += 12 + liblen;
166
+ mark += 12 + liblen;
167
+ symrec += 2;
168
+
169
+ /* coff symbol: .dsostrs */
170
+ symrec[0].cs_storage_class[0] = PE_IMAGE_SYM_CLASS_STATIC;
171
+ symrec[0].cs_num_of_aux_symbols[0] = 1;
172
+
173
+ mdso_obj_write_short(symrec[0].cs_section_number,1);
174
+ memcpy(symrec[0].cs_name,".dsostrs",8);
175
+
176
+ aux = (struct pe_aux_rec_section *)&symrec[1];
177
+ mdso_obj_write_long(aux->aux_size,liblen+1);
178
+ mdso_obj_write_short(aux->aux_num_of_relocs,0);
179
+
180
+ datoff += 0;
181
+ mark += 0;
182
+ symrec += 2;
183
+
184
+ /* coff symbol: .dsometa */
185
+ symrec[0].cs_storage_class[0] = PE_IMAGE_SYM_CLASS_STATIC;
186
+ symrec[0].cs_num_of_aux_symbols[0] = 1;
187
+
188
+ mdso_obj_write_short(symrec[0].cs_section_number,2);
189
+ memcpy(symrec[0].cs_name,".dsometa",8);
190
+
191
+ aux = (struct pe_aux_rec_section *)&symrec[1];
192
+ mdso_obj_write_long(aux->aux_size,reclen);
193
+ mdso_obj_write_short(aux->aux_num_of_relocs,1);
194
+
195
+ datoff += 0;
196
+ mark += 0;
197
+ symrec += 2;
198
+
199
+ /* coff symbol: .libname */
200
+ symrec[0].cs_storage_class[0] = PE_IMAGE_SYM_CLASS_STATIC;
201
+ symrec[0].cs_num_of_aux_symbols[0] = 0;
202
+
203
+ mdso_obj_write_short(symrec[0].cs_section_number,1);
204
+ memcpy(symrec[0].cs_name,".libname",8);
205
+
206
+ datoff += 0;
207
+ mark += 0;
208
+ symrec += 1;
209
+
210
+ /* coff symbol: .dsometa_libname */
211
+ symrec[0].cs_storage_class[0] = PE_IMAGE_SYM_CLASS_EXTERNAL;
212
+ symrec[0].cs_num_of_aux_symbols[0] = 0;
213
+
214
+ mdso_obj_write_short(symrec[0].cs_section_number,2);
215
+ mdso_obj_write_long(&symrec[0].cs_name[4],cstoff+datoff);
216
+
217
+ memcpy(&mark[0],".dsometa_",9);
218
+ memcpy(&mark[9],dctx->cctx->libname,liblen);
219
+
220
+ /* .libname */
221
+ mark = dsometa->hdr.cfh_machine;
222
+ memcpy(&mark[stroff],dctx->cctx->libname,liblen);
223
+
224
+ /* tada */
225
+ if (fout)
226
+ if (fwrite(dsometa,objlen,1,fout) == 0)
227
+ return MDSO_FILE_ERROR(dctx);
228
+
229
+ if (!vobj)
230
+ free(dsometa);
231
+
232
+ return 0;
233
+ }