Ejemplo n.º 1
0
void CreatSymbolTable(idrec *ptr)
{
unsigned int i;
	if(ptr!=NULL){
		CreatSymbolTable(ptr->right);
		if(ptr->rectok==tk_apiproc){
			for(unsigned int j=0;j<posts;j++){	//поиск использования процедуры
				if((postbuf+j)->num==(unsigned long)ptr->recnumber&&((postbuf+j)->type==CALL_32I||(postbuf+j)->type==CALL_32)){
					goto nameext;
				}
			}
		}
		else if((externnum!=0&&ptr->rectok==tk_undefproc&&(ptr->flag&f_extern)!=0)||
				((ptr->rectok==tk_proc||ptr->rectok==tk_interruptproc)&&ptr->recsegm>=NOT_DYNAMIC)||
				((ptr->rectok>=tk_bits&&ptr->rectok<=tk_doublevar)||ptr->rectok==tk_structvar)){
nameext:
			if(numsymbol+1>=maxnumsymbol){
				maxnumsymbol+=MAXNUMSYMBOL;
				isymbol=(IMAGE_SYMBOL *)REALLOC(isymbol,maxnumsymbol*sizeof(IMAGE_SYMBOL));
			 	memset(isymbol+maxnumsymbol*sizeof(IMAGE_SYMBOL)-MAXSIZESYMBOL,0,MAXSIZESYMBOL);	//очистить ее
			}
			if(ptr->rectok==tk_apiproc||ptr->rectok==tk_undefproc||
					ptr->rectok==tk_proc||ptr->rectok==tk_interruptproc)(isymbol+numsymbol)->Type=32;
			i=strlen(ptr->recid);
			if(i>8){
				(isymbol+numsymbol)->N.Name.Short=0;
				(isymbol+numsymbol)->N.Name.Long=sizelistName+4;
				AddName(ptr->recid,i);
			}
			else strncpy((isymbol+numsymbol)->N.sname,ptr->recid,i);
			if(ptr->rectok!=tk_apiproc&&ptr->rectok!=tk_undefproc&&(ptr->flag&f_extern)==0){
				(isymbol+numsymbol)->Value=ptr->recnumber;
				if(ptr->rectok==tk_proc||ptr->rectok==tk_interruptproc)(isymbol+numsymbol)->SectionNumber=(short)(textnum+1);
				else (isymbol+numsymbol)->SectionNumber=(short)((ptr->recpost==0?textnum:bssnum)+1);
			}
			else{
				(NameId+numextern)->num=ptr->recnumber;
				(NameId+numextern)->id=numsymbol;
				numextern++;
				if(numextern>=maxnumnameid){
					maxnumnameid+=MAXNUMSYMBOL;
					NameId=(NAMEID *)REALLOC(NameId,maxnumnameid*sizeof(NAMEID));
				}
			}
			(isymbol+numsymbol)->StorageClass=2;
			numsymbol++;
		}
		CreatSymbolTable(ptr->left);
	}
}
Ejemplo n.º 2
0
int MakeCoff()
{
	COFF_HEADER chead;
	unsigned long sizehead, curobj, resnum, numresrel, segres, lastoffset, headernum;
	OBJECT_ENTRY* objentry;
	int i;
	LISTRELOC* resrel = NULL;
	char* codesecname;
	hout = CreateOutPut("obj", "wb");
	chead.cpu = 0x14c;
	chead.SizeOfOptionalHeader = 0;
	chead.date_time = 0;
	chead.Characteristics = 0x100;
	/*if(header)*/numrs = 2;

	//подсчитать число секций
	if (wbss)
	{
		if (postsize)
		{
			numrs++;
		}
		else
		{
			wbss = FALSE;
		}
	}

	if (numres)
	{
		numrs++;    //ресурсы
	}

	chead.numobj = numrs;
	sizehead = numrs * sizeof(OBJECT_ENTRY);
	objentry = (OBJECT_ENTRY*)MALLOC(sizehead); //тавлица объектов
	memset(objentry, 0, sizehead); //очистить таблицу объектов
	curobj = 0;
	lastoffset = sizehead + sizeof(COFF_HEADER);
	//	if(header){
	strcpy((objentry + curobj)->name, ".version");
	sprintf(&stub[STRVERS], "%s%s", compilerstr, __DATE__);
	(objentry + curobj)->psize = strlen(&stub[STRVERS]) + 1;
	(objentry + curobj)->pOffset = lastoffset;
	(objentry + curobj)->flags = 0x100A00;
	headernum = curobj;
	lastoffset += (objentry + curobj)->psize;
	curobj++;
	//	}
	codesecname = ".text";

	if (splitdata == FALSE)
	{
		codesecname = ".codedat";
	}

	strcpy((objentry + curobj)->name, codesecname);
	(objentry + curobj)->psize = outptr;
	(objentry + curobj)->pOffset = lastoffset;
	(objentry + curobj)->flags = 0xE0300060;
	lastoffset += outptr;
	textnum = curobj;
	curobj++;

	if (wbss)
	{
		strcpy((objentry + curobj)->name, ".bss");
		(objentry + curobj)->psize = postsize;
		(objentry + curobj)->flags = 0xC0300080;
		bssnum = curobj;
		curobj++;
	}

	if (numres)
	{
		strcpy((objentry + curobj)->name, ".rsrc$01");
		numresrel = (objentry + curobj)->NumberOfRelocations = MakeRes(0, &resrel);
		(objentry + curobj)->psize = curposbuf;
		(objentry + curobj)->flags = 0x40000040;
		resnum = curobj;
	}

	sizelistName = 0;
	numsymbol = 0;
	ListName = (char*)MALLOC(MAXLISTNAME);
	isymbol = (IMAGE_SYMBOL*)MALLOC(MAXSIZESYMBOL);
	memset(isymbol, 0, MAXSIZESYMBOL);	//очистить ее
	maxsizelistname = MAXLISTNAME;
	maxnumnameid = maxnumsymbol = MAXNUMSYMBOL;
	NameId = (NAMEID*)MALLOC(MAXSIZENAMEID);
	treloc = (IMAGE_RELOCATION*)MALLOC(sizeof(IMAGE_RELOCATION) * MAXNUMRELOC);
	maxnumreloc = MAXNUMRELOC;
	numreloc = 0;
	strcpy(isymbol->N.sname, "@comp.id");
	isymbol->Value = 0x141F8E;
	isymbol->SectionNumber = -1;
	isymbol->StorageClass = 3;
	strcpy((isymbol + 1)->N.sname, ".file");
	(isymbol + 1)->Value = 1;
	(isymbol + 1)->SectionNumber = -2;
	(isymbol + 1)->StorageClass = 0x67;
	i = (strlen(startfileinfo->filename) - 1) / sizeof(IMAGE_SYMBOL) + 1;
	(isymbol + 1)->NumberOfAuxSymbols = i;
	strcpy((isymbol + 2)->N.sname, startfileinfo->filename);
	numsymbol = i + 2;
	segtext = numsymbol;
	strcpy((isymbol + numsymbol)->N.sname, codesecname);
	(isymbol + numsymbol)->SectionNumber = textnum + 1;
	(isymbol + numsymbol)->StorageClass = 3;
	(isymbol + numsymbol)->NumberOfAuxSymbols = 1;
	numsymbol++;
	(isymbol + numsymbol)->N.Name.Short = outptr;
	numsymbol++;

	if (wbss)
	{
		segbss = numsymbol;
		strcpy((isymbol + numsymbol)->N.sname, ".bss");
		(isymbol + numsymbol)->SectionNumber = bssnum + 1;
		(isymbol + numsymbol)->StorageClass = 3;
		(isymbol + numsymbol)->NumberOfAuxSymbols = 1;
		numsymbol++;
		(isymbol + numsymbol)->N.Name.Short = postsize;
		numsymbol++;
		strcpy((isymbol + numsymbol)->N.sname, "DGROUP");
		(isymbol + numsymbol)->SectionNumber = bssnum + 1;
		(isymbol + numsymbol)->StorageClass = 3;
	}

	strcpy((isymbol + numsymbol)->N.sname, "FLAT");
	(isymbol + numsymbol)->SectionNumber = -1;
	(isymbol + numsymbol)->StorageClass = 3;
	numsymbol++;

	if (numres)
	{
		segres = numsymbol;
		strcpy((isymbol + numsymbol)->N.sname, ".rsrc$01");
		(isymbol + numsymbol)->StorageClass = 3;
		(isymbol + numsymbol)->SectionNumber = resnum + 1;
		numsymbol++;
	}

	//	if(header){
	strcpy((isymbol + numsymbol)->N.sname, ".version");
	(isymbol + numsymbol)->SectionNumber = headernum + 1;
	(isymbol + numsymbol)->StorageClass = 3;
	numsymbol++;
	//	}
	CreatSymbolTable(treestart);
	CreatRelocTable();
	(isymbol + segtext + 1)->N.Name.Long = numreloc;
	(objentry + textnum)->NumberOfRelocations = numreloc;

	if (numreloc)
	{
		(objentry + textnum)->PointerToRelocations = lastoffset;
		lastoffset += sizeof(IMAGE_RELOCATION) * numreloc;
	}

	if (numres)
	{
		(objentry + resnum)->pOffset = lastoffset;
		lastoffset += curposbuf;

		if (numresrel)
		{
			(objentry + resnum)->PointerToRelocations = lastoffset;
			lastoffset += sizeof(IMAGE_RELOCATION) * numresrel;
		}
	}

	chead.COFFsize = numsymbol;

	if (numsymbol)
	{
		chead.pCOFF = lastoffset;
	}

	if (fwrite(&chead, sizeof(COFF_HEADER), 1, hout) != 1)
	{
errwrite:
		ErrWrite();
		free(objentry);

		if (resrel)
		{
			free(resrel);
		}

		FreeCoffBuf();
		return (-1);
	}

	if (fwrite(objentry, sizehead, 1, hout) != 1)
	{
		goto errwrite;
	}

	//	if(header){
	if (fwrite(&stub[STRVERS], (objentry + headernum)->psize, 1, hout) != 1)
	{
		goto errwrite;
	}

	//	}
	if (fwrite(output, outptr, 1, hout) != 1)
	{
		goto errwrite;    //блок кода
	}

	if (numreloc)
	{
		if (fwrite(treloc, numreloc * sizeof(IMAGE_RELOCATION), 1, hout) != 1)
		{
			goto errwrite;
		}
	}

	if (numres)
	{
		if (fwrite(resbuf, curposbuf, 1, hout) != 1)
		{
			goto errwrite;
		}

		free(resbuf);

		if (numresrel)
		{
			IMAGE_RELOCATION* rrel;
			rrel = (IMAGE_RELOCATION*)MALLOC(sizeof(IMAGE_RELOCATION) * numresrel);

			for (i = 0; i < numresrel; i++)
			{
				(rrel + i)->VirtualAddress = (resrel + i)->val;
				(rrel + i)->Type = IMAGE_REL_I386_DIR32NB;
				(rrel + i)->SymbolTableIndex = segres;
			}

			if (fwrite(rrel, sizeof(IMAGE_RELOCATION)*numresrel, 1, hout) != 1)
			{
				goto errwrite;
			}

			free(rrel);
		}
	}

	if (numsymbol)
	{
		if (fwrite(isymbol, numsymbol * sizeof(IMAGE_SYMBOL), 1, hout) != 1)
		{
			goto errwrite;
		}

		if (sizelistName)
		{
			sizelistName += 4;

			if (fwrite(&sizelistName, 4, 1, hout) != 1)
			{
				goto errwrite;
			}

			if (fwrite(ListName, sizelistName - 4, 1, hout) != 1)
			{
				goto errwrite;
			}
		}
		else
		{
			if (fwrite(&sizelistName, 4, 1, hout) != 1)
			{
				goto errwrite;
			}

			sizelistName += 4;
		}
	}

	runfilesize = lastoffset + sizelistName;
	free(objentry);

	if (resrel)
	{
		free(resrel);
	}

	FreeCoffBuf();
	return 0;
}