Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6446 GerdtR 1
#include "tok.h"
2
 
3
4
 
5
 
6
 
7
	int typefind;
8
 
9
};
10
 
11
enum{
12
 
13
	s_code,
14
 
15
	s_bss
16
 
17
18
 
19
 
20
 
21
	int adr;
22
 
23
	int dbg;
24
 
25
}*listnamesymbol;
26
 
27
char *curobjname;
28
 
29
int numobj=0,numname;
30
 
31
unsigned int adr_end;
32
 
33
 
34
 
35
int searchtree2(idrec *fptr,ITOK *itok4,int *tok4,unsigned char *string4);
36
 
37
int GetSegm(int seg)
38
 
39
OBJECT_ENTRY *obj;
40
 
41
		seg--;
42
 
43
		seg=obj->vsize;
44
 
45
	return seg;
46
 
47
48
 
49
{
50
 
51
 
52
 
53
		obj=(OBJECT_ENTRY *)(input+(sizeof(COFF_HEADER)+sizeof(OBJECT_ENTRY)*seg));
54
 
55
 
56
 
57
}
58
 
59
void AddNameObj(char *name,int typefind,int type)
60
 
61
int len;
62
 
63
 
64
 
65
	(listobj+numobj)->name=BackString(name);
66
 
67
	(listobj+numobj)->type=type;
68
 
69
}
70
 
71
 
72
 
73
int hold;
74
 
75
		curobjname=(listobj+i)->name;
76
 
77
		hold=loadfile(curobjname,(listobj+i)->typefind);
78
 
79
			unableopenfile(curobjname);
80
 
81
		}
82
 
83
		free(input);
84
 
85
}
86
 
87
int GetAlighSize(long flag)
88
 
89
int align=0;
90
 
91
	if(i)align=1<<(i-1);
92
 
93
 
94
 
95
96
 
97
{
98
 
99
char c;
100
 
101
	i1=i2=0;
102
 
103
	if(c=='?'){
104
 
105
		c=name[i1];
106
 
107
			i1=2;
108
 
109
		}
110
 
111
	else if(c=='_'){
112
 
113
			i1=7;
114
 
115
 
116
 
117
			i1=2;
118
 
119
		}
120
 
121
	while(c!=0){
122
 
123
		name[i2]=c;
124
 
125
		i2++;
126
 
127
		if(c=='@'||c=='$')break;
128
 
129
	name[i2]=0;
130
 
131
132
 
133
{
134
 
135
	(postbuf+posts)->num=num;
136
 
137
	(postbuf+posts)->loc=loc;
138
 
139
 
140
 
141
void ScanSection(int numobj)
142
 
143
int poutptr,poutptrdata,ppostsize,align;
144
 
145
long flag;
146
 
147
	poutptrdata=outptrdata;
148
 
149
	for(int i=0;i
150
 
151
		flag=obj->flags;
152
 
153
		obj->vsize=-1;
154
 
155
			obj->vsize=s_code;
156
 
157
			poutptr+=obj->psize;
158
 
159
		}
160
 
161
			if((flag&IMAGE_SCN_MEM_READ)&&(flag&IMAGE_SCN_MEM_WRITE)){
162
 
163
					obj->vsize=s_data;
164
 
165
					poutptrdata+=obj->psize;
166
 
167
				}
168
 
169
					obj->vsize=s_bss;
170
 
171
 
172
 
173
			}
174
 
175
	}
176
 
177
178
 
179
{
180
 
181
int i,j,minname;
182
 
183
unsigned int ooutptr,ooutptrdata;
184
 
185
	ooutptrdata=outptrdata;
186
 
187
		if((listnamesymbol+i)->dbg==0){
188
 
189
 
190
 
191
			for(j=i+1;j
192
 
193
				else if((listnamesymbol+j)->seg==oseg){
194
 
195
					if(minofs>=(listnamesymbol+j)->adr&&(listnamesymbol+j)->dbg==0){
196
 
197
							(listnamesymbol+minname)->dbg=1;
198
 
199
						minofs=(listnamesymbol+j)->adr;
200
 
201
						oseg=(listnamesymbol+j)->seg;
202
 
203
				}
204
 
205
			if(minname!=i)i--;
206
 
207
			if(oseg==s_code){
208
 
209
					idrec *ptr;
210
 
211
					if(ptr->rectok==tk_undefproc||ptr->rectok==tk_proc||ptr->rectok==tk_interruptproc)goto dproc;
212
 
213
					if(splitdata==FALSE)outptr=outptrdata;
214
 
215
				}
216
 
217
dproc:
218
 
219
					AddCodeNullLine((listnamesymbol+minname)->name);
220
 
221
			}
222
 
223
				outptrdata=(listnamesymbol+minname)->adr;//12.08.04 01:19 +ooutptrdata;
224
 
225
				AddDataNullLine(3,(listnamesymbol+minname)->name);
226
 
227
			(listnamesymbol+minname)->dbg=1;
228
 
229
	}
230
 
231
	outptrdata=ooutptrdata;
232
 
233
234
 
235
{
236
 
237
IMAGE_SYMBOL *tsym;
238
 
239
idrec *rec;
240
 
241
	ooutptrdata=outptrdata;
242
 
243
	numname=head->COFFsize;
244
 
245
	listnamesymbol=(LISTNAMESYMBOL *)MALLOC(sizeof(LISTNAMESYMBOL)*numname);
246
 
247
		tsym=(IMAGE_SYMBOL *)(input+head->pCOFF+i*sizeof(IMAGE_SYMBOL));
248
 
249
		if(tsym->SectionNumber>=0){
250
 
251
			if(tsym->N.Name.Short==0){
252
 
253
			}
254
 
255
				strncpy((char *)string,(char *)tsym->N.sname,8);
256
 
257
			}
258
 
259
			ConvertName((char *)string);
260
 
261
 
262
 
263
			(listnamesymbol+j)->dbg=0;
264
 
265
			if(seg==s_data){
266
 
267
				count=FindOff(string,DS);
268
 
269
			else if(seg==s_bss){
270
 
271
				count=FindOff(string,VARPOST);
272
 
273
			else if(seg==s_code){
274
 
275
				count=FindOff(string,CS);
276
 
277
			}
278
 
279
 
280
 
281
				rec->count+=count;
282
 
283
					tok=tk_proc;
284
 
285
//					printf("%08X %08X %s\n",(listnamesymbol+j)->adr,ooutptr,itok.name);
286
 
287
				}
288
 
289
//				if(tok==tk_proc||(tok>=tk_charvar&&tok<=tk_floatvar))
290
 
291
			}
292
 
293
				if(seg==s_extern/*&&tsym->Type==32*/){	//внешний объект любого типа
294
 
295
//					printf("undef proc \"%s\"\n",itok.name);
296
 
297
					itok.flag=(unsigned char)(tok==tk_ID?tp_fastcall:(comfile==file_w32?tp_stdcall:tp_pascal));
298
 
299
					itok.number=secondcallnum;
300
 
301
					itok.rm=tk_void;
302
 
303
					rec=(listnamesymbol+j)->rec=addtotree(itok.name);
304
 
305
					secondcallnum++;
306
 
307
				else{
308
 
309
					if(/*tsym->Type==32*/tsym->StorageClass!=3&&seg==s_code){
310
 
311
						itok.number=outptr;
312
 
313
						itok.rm=tk_void;
314
 
315
						strcpy(itok.name,(char *)string);
316
 
317
						itok.flag=(unsigned char)(tok==tk_ID?tp_fastcall:(comfile==file_w32?tp_stdcall:tp_pascal));
318
 
319
						rec->count=count;
320
 
321
					else{
322
 
323
//						printf("undef \"%s\"\n",string);
324
 
325
//							puts("323");
326
 
327
//			printf("Type=%d Class=%d seg=%d %s\n",tsym->Type,tsym->StorageClass,seg,string);
328
 
329
						}
330
 
331
				}
332
 
333
//			printf("Type=%d Class=%d %s\n",tsym->Type,tsym->StorageClass,string);
334
 
335
		}
336
 
337
	}
338
 
339
		listnamesymbol=(LISTNAMESYMBOL *)REALLOC(listnamesymbol,sizeof(LISTNAMESYMBOL)*j);
340
 
341
	outptr=ooutptr;
342
 
343
	postsize=opostsize;
344
 
345
	return j;
346
 
347
348
 
349
{
350
 
351
int numobj,align,size,i,j,numrel;
352
 
353
 
354
 
355
	head=(COFF_HEADER *)input;
356
 
357
		sprintf((char *)string,"file %s is not supported format",curobjname);
358
 
359
		return;
360
 
361
	if(comfile!=file_w32){
362
 
363
		return;
364
 
365
	linenumber=0;
366
 
367
	ScanSection(numobj);
368
 
369
	for(i=0;i
370
 
371
		align=GetAlighSize(obj->flags);
372
 
373
		adr_end=outptr+size;
374
 
375
		trel=(IMAGE_RELOCATION *)(input+obj->PointerToRelocations);
376
 
377
//		printf("type=%d section=%d\n",(trel+j)->Type,obj->vsize);
378
 
379
			case s_code:
380
 
381
				adr_end=Align(outptr+size,4);
382
 
383
					int adr;
384
 
385
					int ii;
386
 
387
						if((listnamesymbol+ii)->idx==(trel+j)->SymbolTableIndex)break;
388
 
389
					lns=(LISTNAMESYMBOL *)(listnamesymbol+ii);
390
 
391
//					printf("type=%d seg=%d tok=%d num=%d %s\n",(trel+j)->Type,lns->seg,rec->rectok,rec->recnumber,lns->name);
392
 
393
						case IMAGE_REL_I386_DIR32:
394
 
395
							switch(lns->seg){
396
 
397
									adr=(trel+j)->VirtualAddress+outptr;
398
 
399
									break;
400
 
401
									adr=(trel+j)->VirtualAddress+outptrdata;
402
 
403
									break;
404
 
405
									adr=(trel+j)->VirtualAddress+outptr;
406
 
407
									*(long *)&buf[(trel+j)->VirtualAddress]+=postsize;
408
 
409
								default:
410
 
411
										adr=(trel+j)->VirtualAddress+outptr;
412
 
413
											AddPost(adr,CALL_32I,rec->recnumber);
414
 
415
										else if(rec->rectok==tk_undefproc){
416
 
417
										}
418
 
419
											AddPost(adr,FIX_CODE_ADD,adr_end);
420
 
421
											if(dbg&2){
422
 
423
												outptr=adr_end;
424
 
425
												outptr=ooutptr;
426
 
427
											*(long *)&output[adr_end]=rec->recnumber;
428
 
429
										}
430
 
431
									}
432
 
433
							}
434
 
435
						case IMAGE_REL_I386_REL32:
436
 
437
							if(rec!=NULL){
438
 
439
									AddPost(adr,CALL_32,rec->recnumber);
440
 
441
								else{
442
 
443
								}
444
 
445
							else{
446
 
447
							}
448
 
449
							break;
450
 
451
//							puts("432");
452
 
453
							break;
454
 
455
				}
456
 
457
					sprintf((char *)string,"code from %s",curobjname);
458
 
459
				}*/
460
 
461
				outptr=adr_end;
462
 
463
			case s_data:
464
 
465
 
466
 
467
					LISTNAMESYMBOL *lns;
468
 
469
					for(ii=0;ii
470
 
471
					}
472
 
473
					idrec *rec=lns->rec;
474
 
475
						case IMAGE_REL_I386_DIR32:
476
 
477
							switch(lns->seg){
478
 
479
									adr=(trel+j)->VirtualAddress+outptr;
480
 
481
									break;
482
 
483
									adr=(trel+j)->VirtualAddress+outptrdata;
484
 
485
									break;
486
 
487
									adr=(trel+j)->VirtualAddress+outptr;
488
 
489
									*(long *)&buf[(trel+j)->VirtualAddress]+=postsize;
490
 
491
								default:
492
 
493
									preerror(meserr);
494
 
495
										adr=(trel+j)->VirtualAddress+outptr;
496
 
497
											AddPost(adr,CALL_32I,rec->recnumber);
498
 
499
										else if(rec->rectok==tk_undefproc){
500
 
501
										}
502
 
503
									}*/
504
 
505
							}
506
 
507
						case IMAGE_REL_I386_REL32:
508
 
509
							preerror(meserr);
510
 
511
							if(rec!=NULL){
512
 
513
									AddPost(adr,CALL_32,rec->recnumber);
514
 
515
								else{
516
 
517
								}
518
 
519
							else{
520
 
521
							}
522
 
523
							break;
524
 
525
				}
526
 
527
				break;
528
 
529
				if(align)postsize=Align(postsize,align);
530
 
531
				break;
532
 
533
	}
534
 
535
>
536
 
537
>
538
 
539
>
540
 
541
>
542
 
543
>
544
 
545
>
546
 
547
>
548
 
549
>
550
 
551