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); } }
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; }