forked from KolibriOS/kolibrios
6bd5a354f5
git-svn-id: svn://kolibrios.org@6446 a494cfbc-eb01-0410-851d-a64ba20cac60
1411 lines
22 KiB
C++
1411 lines
22 KiB
C++
#include "tok.h"
|
|
|
|
|
|
|
|
#define _DEBUG_
|
|
|
|
|
|
|
|
#define MAXDBGS 1000
|
|
|
|
#define MAXNUMSYM 500
|
|
|
|
#define MAXLSTSTR 128 //ìàêñèìàëüíûé ðàçìåð ñòðîêè ëèñòèíãà
|
|
|
|
|
|
|
|
void AddNameToTable(char *name);
|
|
|
|
void AddSymbolList(struct idrec *ptr);
|
|
|
|
int CreateDosDebug();
|
|
|
|
int CreateW32Debug();
|
|
|
|
void GeneratLst();
|
|
|
|
|
|
|
|
unsigned int *dbgloc=NULL; //àäðåññ òî÷êè
|
|
|
|
unsigned int *dbgnum; //íîìåð ñòðîêè
|
|
|
|
unsigned short *dbgmod; //íîìåð ôàéëà
|
|
|
|
char **lststring; //ñòðîêè èñõîäíîãî òåêñòà
|
|
|
|
unsigned char *lstflag=NULL; //ôëàãè óïðàâëåíèÿ ëèñòèíãîì
|
|
|
|
unsigned int *lstend;
|
|
|
|
|
|
|
|
unsigned int pdbg=0; /* number of post entrys */
|
|
|
|
unsigned int pdbgmax=MAXDBGS; /* max number of post entrys */
|
|
|
|
static unsigned int oline=0,omodule=0xFFFFFFFF;
|
|
|
|
unsigned int ooutptr=0xffffffff;
|
|
|
|
char lsttypedata=0; //òèï äàííûõ äëÿ ëèñòèíãà, ïî óìîë÷àíèþ êîä
|
|
|
|
unsigned int outputcodestart=0;
|
|
|
|
|
|
|
|
struct D16START{
|
|
|
|
unsigned long sign; //0 Signify & Version
|
|
|
|
unsigned long pol_size; //4 Name Pool Size (in bytes)
|
|
|
|
unsigned long numname; //8 Number of Names
|
|
|
|
unsigned long numtentr; //12 Number of Type Entries
|
|
|
|
unsigned long nummentr; //16 Number of Member Entries
|
|
|
|
unsigned long numsymbl; //20 Number of Symbols
|
|
|
|
unsigned long numgsymb; //24 Number of Global Symbols
|
|
|
|
unsigned long numsours; //28 Number of Source Modules
|
|
|
|
unsigned long numlsumb; //32 Number of Local Symbols
|
|
|
|
unsigned long numscop; //36 Number of Scopes
|
|
|
|
unsigned long numline; //40 Number of Line Number Entries
|
|
|
|
unsigned long numincl; //44 Number of Include Files
|
|
|
|
unsigned long numseg; //48 Number of Segments
|
|
|
|
unsigned long numcorrel; //52 Number of Correlation Entries
|
|
|
|
unsigned long imagesize; //56 Image Size
|
|
|
|
unsigned short data[2]; //60 Basic RTL String Segment Offset & Data Count
|
|
|
|
unsigned long casesensiv;//64 Case Sensivitive Link
|
|
|
|
unsigned long ucnovn;
|
|
|
|
//òîëüêî äëÿ 128-áàéòîâîãî çàãîëîâêà
|
|
|
|
unsigned long ucnovn1[6];
|
|
|
|
unsigned long sizeblock; //ðàçìåð ìåæäó íà÷àëîì èìåí è êîíöîì çàãîëîâêà
|
|
|
|
unsigned long ucnovn2[2];
|
|
|
|
unsigned short fdebug; //Debug Flags
|
|
|
|
unsigned long reftsize; //Reference Information Table Size (in bytes)
|
|
|
|
unsigned long numnamesp; //Number of Namespace Entries
|
|
|
|
unsigned long numunamesp; //Number of Namespace Using Entries
|
|
|
|
unsigned long ucnovn3;
|
|
|
|
unsigned short ucnovn4;
|
|
|
|
////////////////////////////////
|
|
|
|
};
|
|
|
|
|
|
|
|
struct MODULE{
|
|
|
|
unsigned long name;
|
|
|
|
unsigned char language;
|
|
|
|
unsigned char memmodel;
|
|
|
|
unsigned long symindex;
|
|
|
|
unsigned short symcount;
|
|
|
|
unsigned short sourindex;
|
|
|
|
unsigned short sourcount;
|
|
|
|
unsigned short corindex;
|
|
|
|
unsigned short corcount;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct _SFT_
|
|
|
|
{
|
|
|
|
unsigned long idx;
|
|
|
|
struct ftime time;
|
|
|
|
}SFT;
|
|
|
|
|
|
|
|
typedef struct _LT_
|
|
|
|
{
|
|
|
|
unsigned short line;
|
|
|
|
unsigned short ofs;
|
|
|
|
}LT;
|
|
|
|
|
|
|
|
typedef struct _CT_
|
|
|
|
{
|
|
|
|
unsigned short segidx;
|
|
|
|
unsigned short filidx;
|
|
|
|
unsigned long beg;
|
|
|
|
unsigned short count;
|
|
|
|
}CT;
|
|
|
|
|
|
|
|
static struct _SMB_
|
|
|
|
{
|
|
|
|
unsigned long idxname;
|
|
|
|
unsigned long type;
|
|
|
|
unsigned short ofs;
|
|
|
|
unsigned short seg;
|
|
|
|
unsigned short clas;
|
|
|
|
}*symbols;
|
|
|
|
|
|
|
|
static struct SEGMENT{
|
|
|
|
unsigned short idx;
|
|
|
|
unsigned short segm;
|
|
|
|
unsigned short ofs;
|
|
|
|
unsigned short size;
|
|
|
|
unsigned short scopei;
|
|
|
|
unsigned short scopec;
|
|
|
|
unsigned short correli;
|
|
|
|
unsigned short correlc;
|
|
|
|
}*segment;
|
|
|
|
|
|
|
|
unsigned char dbg=FALSE,dbgact;
|
|
|
|
static short numsymbols=0;
|
|
|
|
static int sizetabsym=MAXNUMSYM;
|
|
|
|
static unsigned short numcorrel;
|
|
|
|
static unsigned char *bufname;
|
|
|
|
static int lastofspul=0;
|
|
|
|
static int segcode;
|
|
|
|
|
|
|
|
static struct _COR_INFO_
|
|
|
|
{
|
|
|
|
unsigned int ofs; //íà÷àëî áëîêà
|
|
|
|
unsigned int end; //êîíåö áëîêà
|
|
|
|
unsigned int startline; //íîìåð ïåðâîé ñòðîêè èíôîðìàöèè
|
|
|
|
unsigned short count; //÷èñëî ñòðîê
|
|
|
|
unsigned short file; //ôàéë
|
|
|
|
}*corinfo=NULL;
|
|
|
|
|
|
|
|
void InitDbg()
|
|
|
|
{
|
|
|
|
if(fobj)dbg&=0xFE;
|
|
|
|
if(dbg&&(dbgloc==NULL)){
|
|
|
|
dbgloc=(unsigned int *)MALLOC(MAXDBGS*sizeof(unsigned int));
|
|
|
|
dbgnum=(unsigned int *)MALLOC(MAXDBGS*sizeof(unsigned int));
|
|
|
|
dbgmod=(unsigned short *)MALLOC(MAXDBGS*sizeof(unsigned short));
|
|
|
|
dbgact=1; //çàïðåòèòü ñáîð èíôîðìàöèè
|
|
|
|
}
|
|
|
|
if((dbg&2)&&lstflag==NULL){
|
|
|
|
lststring=(char **)MALLOC(MAXDBGS*sizeof(char *));
|
|
|
|
lstflag=(unsigned char *)MALLOC(MAXDBGS*sizeof(char));
|
|
|
|
lstend=(unsigned int *)MALLOC(MAXDBGS*sizeof(unsigned int));
|
|
|
|
memset((char *)lstflag,-1,MAXDBGS*sizeof(char));
|
|
|
|
memset((unsigned int *)lstend,0,MAXDBGS*sizeof(unsigned int));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddDataLine(char ssize/*,char typev*/)
|
|
|
|
{
|
|
|
|
/* if(typev==pointer||typev==farpointer)ssize=(typev==pointer?(char)2:(char)4);
|
|
|
|
else*/ //if(tok==tk_string)ssize=(char)3;
|
|
|
|
lsttypedata=(unsigned char)(ssize<<1);
|
|
|
|
AddLine();
|
|
|
|
lsttypedata=0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddDataNullLine(char ssize,char *name)
|
|
|
|
{
|
|
|
|
oline--;
|
|
|
|
|
|
|
|
lsttypedata=(unsigned char)(ssize<<1);
|
|
|
|
AddLine(TRUE);
|
|
|
|
lsttypedata=0;
|
|
|
|
dbgnum[pdbg-1]=0; //î÷èñòèòü íîìåð ñòðîêè
|
|
|
|
//new !!!
|
|
|
|
if(name!=NULL)lststring[pdbg-1]=BackString(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddCodeNullLine(char *name)
|
|
|
|
{
|
|
|
|
oline--;
|
|
|
|
AddLine(TRUE);
|
|
|
|
dbgnum[pdbg-1]=0; //î÷èñòèòü íîìåð ñòðîêè
|
|
|
|
if(name!=NULL)lststring[pdbg-1]=BackString(name);
|
|
|
|
oline--;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddEndLine()
|
|
|
|
{
|
|
|
|
if(pdbg/*&&lstend[pdbg-1]==0*/)lstend[pdbg-1]=outptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddLine(int SkipLineInfo)
|
|
|
|
{
|
|
|
|
if(/*ooutptr!=outptr&&*/dbgact==0&&(oline!=linenumber||omodule!=currentfileinfo)){
|
|
|
|
while(ooutptr>outptr&&pdbg!=0&&ooutptr!=0xffffffff)KillLastLine();
|
|
|
|
if(pdbg==pdbgmax){
|
|
|
|
pdbgmax+=MAXDBGS;
|
|
|
|
dbgloc=(unsigned int *) REALLOC(dbgloc,pdbgmax*sizeof(unsigned int));
|
|
|
|
dbgnum=(unsigned int *) REALLOC(dbgnum,pdbgmax*sizeof(unsigned int));
|
|
|
|
dbgmod=(unsigned short *)REALLOC(dbgmod,pdbgmax*sizeof(unsigned short));
|
|
|
|
if(lstflag){
|
|
|
|
lststring=(char **)REALLOC(lststring,pdbgmax*sizeof(char *));
|
|
|
|
lstflag=(unsigned char *)REALLOC(lstflag,pdbgmax*sizeof(char));
|
|
|
|
lstend=(unsigned int *)REALLOC(lstend,pdbgmax*sizeof(unsigned int));
|
|
|
|
memset((char *)lstflag+(pdbgmax-MAXDBGS),-1,MAXDBGS*sizeof(char));
|
|
|
|
memset((unsigned int *)lstend+(pdbgmax-MAXDBGS),0,MAXDBGS*sizeof(unsigned int));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dbgloc[pdbg]=ooutptr=outptr;
|
|
|
|
dbgnum[pdbg]=oline=linenumber;
|
|
|
|
dbgmod[pdbg]=(unsigned short)currentfileinfo;
|
|
|
|
omodule=currentfileinfo;
|
|
|
|
if(dbg&2){
|
|
|
|
if(SkipLineInfo)lststring[pdbg]=NULL;
|
|
|
|
else{
|
|
|
|
char *ofs=startline;
|
|
|
|
char c;
|
|
|
|
int sizestring=0;
|
|
|
|
char buf[MAXLSTSTR];
|
|
|
|
for(;sizestring<(MAXLSTSTR-1);sizestring++){
|
|
|
|
c=*ofs;
|
|
|
|
ofs=ofs+1;
|
|
|
|
if(c==13||ofs==endinput)break;
|
|
|
|
buf[sizestring]=c;
|
|
|
|
}
|
|
|
|
buf[sizestring]=0;
|
|
|
|
strbtrim(buf);
|
|
|
|
if((sizestring=strlen(buf))==0)lststring[pdbg]=NULL;
|
|
|
|
else{
|
|
|
|
lststring[pdbg]=(char *)MALLOC(sizestring+1);
|
|
|
|
strcpy(lststring[pdbg],buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
lstflag[pdbg]=(unsigned char)(am32|lsttypedata);
|
|
|
|
AddEndLine();
|
|
|
|
// printf("%s(%d) outptr=%d\n",(startfileinfo+currentfileinfo)->filename,linenumber,outptr);
|
|
|
|
}
|
|
|
|
pdbg++;
|
|
|
|
(startfileinfo+currentfileinfo)->numdline++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KillLastLine()
|
|
|
|
{
|
|
|
|
// printf("dbgact=%d pdbg=%d outptr=%08X ooutptr=%08X\n",dbgact,pdbg,outptr,ooutptr);
|
|
|
|
if(outptr==0&&ooutptr==0x100){
|
|
|
|
ooutptr=0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if(dbgact==0&&pdbg!=0){
|
|
|
|
// printf("pdbg=%d dbgmod=%d currentfileinfo=%d\n",pdbg,dbgmod[0],currentfileinfo);
|
|
|
|
if(pdbg==1&&dbgmod[0]!=(unsigned short)currentfileinfo)return;
|
|
|
|
pdbg--;
|
|
|
|
if(pdbg==0){
|
|
|
|
oline=0;
|
|
|
|
omodule=ooutptr=0xFFFFFFFF;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
oline=dbgnum[pdbg];
|
|
|
|
omodule=dbgmod[pdbg];
|
|
|
|
ooutptr=dbgloc[pdbg];
|
|
|
|
}
|
|
|
|
// printf("%s(%d) pdbg=%d oline=%d ooutptr=%d\n",(startfileinfo+currentfileinfo)->filename,linenumber,pdbg,oline,ooutptr);
|
|
|
|
(startfileinfo+dbgmod[pdbg])->numdline--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//ñîçäàíèå îòëàäî÷íîãî ôàéëà
|
|
|
|
void DoTDS()
|
|
|
|
{
|
|
|
|
int retcode;
|
|
|
|
unsigned int i,j;
|
|
|
|
//ñîçäàòü ôàéë
|
|
|
|
if(lstflag)GeneratLst();
|
|
|
|
if(dbg&1){
|
|
|
|
//óáðàòü èç ñïèñêà ôàéëîâ íå èñïîëüçóåìûå
|
|
|
|
for(i=0;i<totalmodule;i++){
|
|
|
|
if((startfileinfo+i)->numdline==0){
|
|
|
|
totalmodule--;
|
|
|
|
if(totalmodule!=i){
|
|
|
|
memcpy(&(startfileinfo+i)->filename,
|
|
|
|
&(startfileinfo+totalmodule)->filename,sizeof(FILEINFO));
|
|
|
|
//êîððåêòèðîâêà òàáëèö ñòðîê
|
|
|
|
for(j=0;j<pdbg;j++){
|
|
|
|
if(dbgmod[j]==(unsigned short)totalmodule)dbgmod[j]=(unsigned short)i;
|
|
|
|
}
|
|
|
|
i--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//ñîçäàòü òàáëèöó êîððåëÿöèé
|
|
|
|
corinfo=(struct _COR_INFO_ *)MALLOC(sizeof(_COR_INFO_));
|
|
|
|
corinfo->ofs=dbgloc[0];
|
|
|
|
corinfo->startline=0;
|
|
|
|
omodule=corinfo->file=dbgmod[0];
|
|
|
|
numcorrel=0;
|
|
|
|
for(j=1;j<pdbg;j++){
|
|
|
|
if((unsigned short)omodule!=dbgmod[j]){
|
|
|
|
(corinfo+numcorrel)->count=(unsigned short)(j-(corinfo+numcorrel)->startline);
|
|
|
|
(corinfo+numcorrel)->end=dbgloc[j]-1;
|
|
|
|
numcorrel++;
|
|
|
|
corinfo=(struct _COR_INFO_ *)REALLOC(corinfo,sizeof(_COR_INFO_)*(numcorrel+1));
|
|
|
|
(corinfo+numcorrel)->ofs=dbgloc[j];
|
|
|
|
(corinfo+numcorrel)->startline=j;
|
|
|
|
omodule=(corinfo+numcorrel)->file=dbgmod[j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
(corinfo+numcorrel)->count=(unsigned short)(pdbg-(corinfo+numcorrel)->startline);
|
|
|
|
(corinfo+numcorrel)->end=dbgloc[j-1]+1;
|
|
|
|
numcorrel++;
|
|
|
|
hout=CreateOutPut("tds","wb");
|
|
|
|
if(am32)retcode=CreateW32Debug();
|
|
|
|
else retcode=CreateDosDebug();
|
|
|
|
if(retcode==0&&fwrite(output,outptr,1,hout)!=1)retcode=-1;
|
|
|
|
if(retcode!=0)ErrWrite();
|
|
|
|
fclose(hout);
|
|
|
|
hout=NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddNameToTable(char *name)
|
|
|
|
{
|
|
|
|
int i=0;
|
|
|
|
char c;
|
|
|
|
do{
|
|
|
|
c=name[i++];
|
|
|
|
op(c);
|
|
|
|
}while(c!=0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddSymbolList(struct idrec *ptr)
|
|
|
|
{
|
|
|
|
if(ptr!=NULL){
|
|
|
|
AddSymbolList(ptr->right);
|
|
|
|
if((ptr->rectok==tk_proc&&ptr->recsegm>=NOT_DYNAMIC)||
|
|
|
|
(ptr->rectok==tk_interruptproc&&ptr->recsegm>=NOT_DYNAMIC)||
|
|
|
|
(ptr->rectok>=tk_bits&&ptr->rectok<=tk_doublevar&&modelmem!=SMALL)||
|
|
|
|
(ptr->rectok==tk_structvar&&modelmem!=SMALL)){
|
|
|
|
AddNameToTable(ptr->recid);
|
|
|
|
(symbols+numsymbols)->idxname=numsymbols+1;
|
|
|
|
(symbols+numsymbols)->ofs=(unsigned short)(ptr->recpost==0?
|
|
|
|
(unsigned short)ptr->recnumber:
|
|
|
|
(unsigned short)ptr->recnumber+ooutptr);
|
|
|
|
if(modelmem==TINY&&comfile==file_exe)(symbols+numsymbols)->ofs-=(unsigned short)0x100;
|
|
|
|
// if(ptr->rectok==tk_proc)(symbols+numsymbols)->clas=0x18;
|
|
|
|
numsymbols++;
|
|
|
|
if(numsymbols==sizetabsym){
|
|
|
|
symbols=(_SMB_ *)REALLOC(symbols,(sizetabsym+MAXNUMSYM)*sizeof(_SMB_));
|
|
|
|
memset(&(symbols+sizetabsym)->idxname,0,sizeof(_SMB_)*MAXNUMSYM);
|
|
|
|
sizetabsym+=MAXNUMSYM;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
AddSymbolList(ptr->left);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddNameToPul(char *name)
|
|
|
|
{
|
|
|
|
static int sizebuf=0;
|
|
|
|
int i;
|
|
|
|
i=strlen(name);
|
|
|
|
if((lastofspul+i+2)>=sizebuf){
|
|
|
|
sizebuf+=STRLEN;
|
|
|
|
if(sizebuf==STRLEN)bufname=(unsigned char *)MALLOC(sizebuf);
|
|
|
|
else bufname=(unsigned char *)REALLOC(bufname,sizebuf);
|
|
|
|
}
|
|
|
|
bufname[lastofspul++]=(unsigned char)i;
|
|
|
|
strcpy((char *)(bufname+lastofspul),name);
|
|
|
|
lastofspul+=++i;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddGlobalName(struct idrec *ptr)
|
|
|
|
{
|
|
|
|
if(ptr!=NULL){
|
|
|
|
AddGlobalName(ptr->right);
|
|
|
|
if((ptr->rectok==tk_proc&&ptr->recsegm>=NOT_DYNAMIC)||
|
|
|
|
(ptr->rectok>=tk_bits&&ptr->rectok<=tk_doublevar)||
|
|
|
|
(ptr->rectok==tk_structvar)){
|
|
|
|
AddNameToPul(ptr->recid);
|
|
|
|
numsymbols++;
|
|
|
|
if(ptr->rectok==tk_proc){
|
|
|
|
outword(0x1c); //size
|
|
|
|
outdword(0x20); //type
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
outword(0x18);
|
|
|
|
outdword(0x21);
|
|
|
|
}
|
|
|
|
outword(0);
|
|
|
|
outdword(0);
|
|
|
|
outdword(numsymbols); //name
|
|
|
|
outdword(0);
|
|
|
|
if(ptr->recpost==0){
|
|
|
|
outdword(ptr->recnumber); //offset
|
|
|
|
outword(segcode); //segm
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
outdword(ptr->recnumber+(wbss!=FALSE?0:ooutptr));
|
|
|
|
outword(1);
|
|
|
|
}
|
|
|
|
if(ptr->rectok==tk_proc)outdword(0);
|
|
|
|
}
|
|
|
|
AddGlobalName(ptr->left);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int CreateW32Debug()
|
|
|
|
{
|
|
|
|
int sstNames,sstDirectory;
|
|
|
|
int startcode=outptr;
|
|
|
|
int sstGlobalSym;
|
|
|
|
int sstsrc;
|
|
|
|
unsigned int i,j,jj,ofs;
|
|
|
|
for(;numsymbols<(short)totalmodule;numsymbols++)AddNameToPul((startfileinfo+numsymbols)->filename);
|
|
|
|
segcode=(wbss==FALSE?1:2);
|
|
|
|
outptr=0;
|
|
|
|
outdword(0x41304246); // TDS - signature
|
|
|
|
outdword(0); // offset of Subsection Directory (fill later)
|
|
|
|
//sstModule subsection
|
|
|
|
outdword(0); // OvlNum=0 & LibIndex=0
|
|
|
|
outword(segcode); // SegCount
|
|
|
|
outword(0x5643); // CV-style
|
|
|
|
outdword(1); // Name
|
|
|
|
for(i=0;i<4;i++)outdword(0);
|
|
|
|
// outdword(0); //Time
|
|
|
|
// outdword(0);
|
|
|
|
// outdword(0);
|
|
|
|
// outdword(0);
|
|
|
|
if(wbss){
|
|
|
|
outword(0x0001); // SegNumber
|
|
|
|
outword(0); // flag
|
|
|
|
outdword(0); // start
|
|
|
|
outdword(postsize); // len
|
|
|
|
}
|
|
|
|
outword(segcode); // SegNumber
|
|
|
|
outword(0x0001); // flag
|
|
|
|
outdword(startptr); // start
|
|
|
|
outdword(startcode); // len
|
|
|
|
sstsrc=outptr;
|
|
|
|
//sstSrcModule subsection
|
|
|
|
outword((short)numcorrel); //cFile - êîëè÷åñòâî SRC-ôàéëîâ(ñåãìåíòîâ)
|
|
|
|
outword((short)numcorrel); // SegCount (see SegCount in sstModule
|
|
|
|
ofs=14*numcorrel+4;
|
|
|
|
for(i=0,jj=0;i<(unsigned int)numcorrel;i++){
|
|
|
|
if(i!=0)jj=jj+((corinfo+i-1)->count+1)*6+22;
|
|
|
|
outdword(ofs+jj);
|
|
|
|
}
|
|
|
|
for(i=0;i<(unsigned int)numcorrel;i++){
|
|
|
|
outdword((corinfo+i)->ofs);
|
|
|
|
outdword((corinfo+i)->end);
|
|
|
|
}
|
|
|
|
for(i=0;i<(unsigned int)numcorrel;i++)outword(segcode); // ìàññèâ èíäåêñîâ ñåãìåíòîâ
|
|
|
|
for(i=0;i<(unsigned int)numcorrel;i++){
|
|
|
|
outword(1); // Segm#
|
|
|
|
outdword((corinfo+i)->file+1);// File#
|
|
|
|
outdword(outptr-sstsrc+12);
|
|
|
|
outdword((corinfo+i)->ofs);
|
|
|
|
outdword((corinfo+i)->end);
|
|
|
|
outword(segcode); //Segm#
|
|
|
|
jj=(corinfo+i)->count;
|
|
|
|
outword(jj+1); // Lines count
|
|
|
|
ofs=(corinfo+i)->startline;
|
|
|
|
for(j=0;j<jj;j++)outdword(dbgloc[j+ofs]);
|
|
|
|
outdword((corinfo+i)->end);
|
|
|
|
for(j=0;j<jj;j++)outword(dbgnum[j+ofs]);
|
|
|
|
outword(0);
|
|
|
|
}
|
|
|
|
//òàáëèöà ãëîáàëüíûõ ñèìâîëîâ
|
|
|
|
sstGlobalSym=outptr;
|
|
|
|
for(i=0;i<8;i++)outdword(0);
|
|
|
|
// outdword(0); //modindex
|
|
|
|
// outdword(0); //size correct later
|
|
|
|
// outdword(0);
|
|
|
|
// outdword(0);
|
|
|
|
// outdword(0);
|
|
|
|
// outdword(0); //num others correct later
|
|
|
|
// outdword(0); //total correct later
|
|
|
|
// outdword(0); //SymHash, AddrHash
|
|
|
|
outdword(0x02100008); //S_ENTRY32
|
|
|
|
outdword(EntryPoint());
|
|
|
|
outword(segcode);
|
|
|
|
AddGlobalName(treestart);
|
|
|
|
sstNames=outptr;
|
|
|
|
outdword(numsymbols);
|
|
|
|
outptr=sstGlobalSym+4;
|
|
|
|
outdword(sstNames-sstGlobalSym-32);
|
|
|
|
outptr+=12;
|
|
|
|
outdword(numsymbols-totalmodule);
|
|
|
|
outdword(numsymbols-totalmodule);
|
|
|
|
outptr=4;
|
|
|
|
sstDirectory=sstNames+4+lastofspul;
|
|
|
|
outdword(sstDirectory);
|
|
|
|
if(fwrite(output,sstNames+4,1,hout)!=1)return -1;
|
|
|
|
if(fwrite(bufname,lastofspul,1,hout)!=1)return -1;
|
|
|
|
free(bufname);
|
|
|
|
// Subsection Directory
|
|
|
|
outptr=0;
|
|
|
|
outdword(0x0C0010);
|
|
|
|
outdword(4); // cDir - number of subsections
|
|
|
|
outdword(0);
|
|
|
|
outdword(0);
|
|
|
|
//sstModule
|
|
|
|
outdword(0x10120);
|
|
|
|
outdword(8); //start
|
|
|
|
outdword(sstsrc-8); // size
|
|
|
|
// sstSrcModule
|
|
|
|
outdword(0x10127);
|
|
|
|
outdword(sstsrc); //start
|
|
|
|
outdword(sstNames-sstsrc);//size
|
|
|
|
//sstGlobalSym
|
|
|
|
outdword(0x129);
|
|
|
|
outdword(sstGlobalSym); //start
|
|
|
|
outdword(sstNames-sstGlobalSym); //size
|
|
|
|
// sstNames
|
|
|
|
outdword(0x130);
|
|
|
|
outdword(sstNames);
|
|
|
|
outdword(sstDirectory-sstGlobalSym);
|
|
|
|
outdword(0x41304246); // TDS - signature
|
|
|
|
outdword(sstDirectory+outptr+4); // TDS-len
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int CreateDosDebug()
|
|
|
|
{
|
|
|
|
unsigned int i,j,count;
|
|
|
|
D16START d16header;
|
|
|
|
MODULE *module;
|
|
|
|
SFT *sft;
|
|
|
|
LT *lt;
|
|
|
|
CT *ct;
|
|
|
|
int corrnum=0,ii;
|
|
|
|
unsigned short beg,end;
|
|
|
|
outptr=0;
|
|
|
|
//16-áèò çàãîëîâîê
|
|
|
|
memset(&d16header,0,sizeof(D16START));
|
|
|
|
//òàáëèöà ãëîáàëüíûõ èìåí
|
|
|
|
symbols=(_SMB_ *)MALLOC(sizeof(_SMB_)*MAXNUMSYM);
|
|
|
|
memset(symbols,0,sizeof(_SMB_)*MAXNUMSYM);
|
|
|
|
AddSymbolList(treestart);
|
|
|
|
d16header.numname=totalmodule*2+numsymbols;
|
|
|
|
d16header.numsymbl=d16header.numgsymb=numsymbols;
|
|
|
|
|
|
|
|
d16header.sign=0x040352FB; //sign & version
|
|
|
|
d16header.imagesize=runfilesize; //image size
|
|
|
|
d16header.numsours=totalmodule; //1
|
|
|
|
d16header.numline=pdbg; //lines
|
|
|
|
d16header.numincl=totalmodule; //include files
|
|
|
|
d16header.numseg=totalmodule;//totalmodule; //1
|
|
|
|
d16header.numcorrel=numcorrel;//totalmodule; //Correlation
|
|
|
|
d16header.casesensiv=1;
|
|
|
|
// d16header.numtentr=NUMTYPES;
|
|
|
|
//òîëüêî äëÿ 128-áàéòîâîãî çàãîëîâêà
|
|
|
|
// d16header.fdebug=1;
|
|
|
|
|
|
|
|
d16header.ucnovn=0x380000;
|
|
|
|
d16header.sizeblock=sizeof(MODULE)*totalmodule+sizeof(SFT)*totalmodule+
|
|
|
|
sizeof(LT)*pdbg+sizeof(SEGMENT)*totalmodule+sizeof(CT)*numcorrel+
|
|
|
|
6*totalmodule+/*NUMTYPES*12+*/sizeof(_SMB_)*numsymbols/*+numsymbols*4*/;
|
|
|
|
d16header.reftsize=numsymbols*4;
|
|
|
|
|
|
|
|
//module table
|
|
|
|
module=(struct MODULE *)MALLOC(sizeof(MODULE)*totalmodule);
|
|
|
|
memset(module,0,sizeof(MODULE)*totalmodule);
|
|
|
|
//sourse file table
|
|
|
|
sft=(SFT *)MALLOC(sizeof(SFT)*totalmodule);
|
|
|
|
//segment table
|
|
|
|
segment=(struct SEGMENT *)MALLOC(sizeof(SEGMENT)*totalmodule);
|
|
|
|
memset(segment,0,sizeof(SEGMENT)*totalmodule);
|
|
|
|
//correlation table
|
|
|
|
ct=(CT *)MALLOC(sizeof(CT)*numcorrel);
|
|
|
|
for(i=0;i<totalmodule;i++){
|
|
|
|
//èìåíà ìîäóëåé
|
|
|
|
AddNameToTable((startfileinfo+i)->filename);
|
|
|
|
strcpy((char *)string3,(startfileinfo+i)->filename);
|
|
|
|
char *str=strrchr((char *)string3,'.');
|
|
|
|
if(str!=0){
|
|
|
|
str[0]=0;
|
|
|
|
str=strrchr((char *)string3,'\\');
|
|
|
|
if(str==NULL)str=(char *)string3;
|
|
|
|
else str++;
|
|
|
|
}
|
|
|
|
else str=(char *)string3;
|
|
|
|
AddNameToTable(str);
|
|
|
|
//òàáëèöà ìîäóëåé
|
|
|
|
(module+i)->name=i*2+2+numsymbols;
|
|
|
|
(module+i)->language=1;
|
|
|
|
(module+i)->memmodel=8;//modelmem==SMALL&&comfile==file_exe?9:8;
|
|
|
|
(module+i)->sourcount=1;//(unsigned short)totalmodule;
|
|
|
|
(module+i)->sourindex=(unsigned short)(i+1);
|
|
|
|
//èíôîðìàöèÿ îá èñõîäíûõ ôàéëàõ
|
|
|
|
(sft+i)->idx=i*2+1+numsymbols;
|
|
|
|
(sft+i)->time=(startfileinfo+i)->time;
|
|
|
|
count=0; //÷èñëî êîðåëÿöèé äëÿ äàííîãî ìîäóëÿ
|
|
|
|
for(ii=0;ii<numcorrel;ii++){//îáõîä òàáëèöû êîððåëÿöèè
|
|
|
|
if((corinfo+ii)->file==(unsigned short)i){ //êîðð äëÿ ýòîãî ìîäóëÿ
|
|
|
|
if(count==0){ //ïåðâûé áëîê
|
|
|
|
(segment+i)->ofs=beg=(unsigned short)(corinfo+ii)->ofs;
|
|
|
|
(segment+i)->correli=(unsigned short)(corrnum+1); //correlation index
|
|
|
|
(module+i)->corindex=(unsigned short)(corrnum+1);
|
|
|
|
}
|
|
|
|
(ct+corrnum)->beg=(corinfo+ii)->startline+1;
|
|
|
|
(ct+corrnum)->segidx=(unsigned short)(1+i); //segment idx
|
|
|
|
(ct+corrnum)->filidx=(unsigned short)(i+1); //file idx
|
|
|
|
(ct+corrnum)->count=(corinfo+ii)->count; //÷èñëî ëèíèé
|
|
|
|
end=(unsigned short)(corinfo+ii)->end;
|
|
|
|
corrnum++;
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//òàáëèöà ñåãìåíòîâ
|
|
|
|
(segment+i)->idx=(unsigned short)(i+1); //segment index
|
|
|
|
(segment+i)->size=(unsigned short)(end-beg);//length
|
|
|
|
(segment+i)->correlc=(unsigned short)count;//(unsigned short)totalmodule; //correlation count
|
|
|
|
(module+i)->corcount=(unsigned short)count;
|
|
|
|
if(modelmem==TINY&&comfile==file_exe)(segment+i)->segm=0xfff0;
|
|
|
|
}
|
|
|
|
d16header.pol_size=outptr;
|
|
|
|
if(fwrite(&d16header,sizeof(D16START),1,hout)!=1)return -1;
|
|
|
|
if(fwrite(symbols,sizeof(_SMB_)*numsymbols,1,hout)!=1)return -1;
|
|
|
|
if(fwrite(module,sizeof(MODULE)*totalmodule,1,hout)!=1)return -1;
|
|
|
|
free(module);
|
|
|
|
if(fwrite(sft,sizeof(SFT)*totalmodule,1,hout)!=1)return -1;
|
|
|
|
free(sft);
|
|
|
|
//line table
|
|
|
|
lt=(LT *)MALLOC(sizeof(LT)*pdbg);
|
|
|
|
for(j=0;(unsigned int)j<pdbg;j++){
|
|
|
|
// printf("line %d loc %X\n",dbgnum[j],dbgloc[j]);
|
|
|
|
(lt+j)->line=(unsigned short)dbgnum[j];
|
|
|
|
(lt+j)->ofs=(unsigned short)dbgloc[j];
|
|
|
|
}
|
|
|
|
if(fwrite(lt,sizeof(LT)*pdbg,1,hout)!=1)return -1;
|
|
|
|
free(lt);
|
|
|
|
if(fwrite(segment,sizeof(SEGMENT)*totalmodule,1,hout)!=1)return -1;
|
|
|
|
free(segment);
|
|
|
|
if(fwrite(ct,sizeof(CT)*numcorrel,1,hout)!=1)return -1;
|
|
|
|
free(ct);
|
|
|
|
// if(fwrite(types,NUMTYPES*12,1,hout)!=1)return -1;
|
|
|
|
memset(&string3,0,6*totalmodule);
|
|
|
|
if(fwrite(&string3,6*totalmodule,1,hout)!=1)return -1;
|
|
|
|
/* if(numsymbols){
|
|
|
|
memset(symbols,0,4*numsymbols);
|
|
|
|
if(fwrite(symbols,4*numsymbols,1,hout)!=1)return -1;
|
|
|
|
}*/
|
|
|
|
free(symbols);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KillDataLine(int line)
|
|
|
|
{
|
|
|
|
(startfileinfo+dbgmod[line])->numdline--;
|
|
|
|
for(unsigned int j=line;(j+1)<pdbg;j++){
|
|
|
|
dbgloc[j]=dbgloc[j+1];
|
|
|
|
dbgnum[j]=dbgnum[j+1];
|
|
|
|
dbgmod[j]=dbgmod[j+1];
|
|
|
|
}
|
|
|
|
lstflag++;
|
|
|
|
lststring++;
|
|
|
|
lstend++;
|
|
|
|
pdbg--;
|
|
|
|
}
|
|
|
|
|
|
|
|
void GeneratLst()
|
|
|
|
{
|
|
|
|
unsigned int j;
|
|
|
|
unsigned long startip;
|
|
|
|
unsigned int offs2,line;
|
|
|
|
unsigned char flag;
|
|
|
|
hout=CreateOutPut("lst","wt");
|
|
|
|
if(lstend[pdbg-1]==0)lstend[pdbg-1]=endinptr;
|
|
|
|
startip=(comfile!=file_w32&&comfile!=file_bin?0:ImageBase);
|
|
|
|
fprintf(hout,"SPHINX/SHEKER C-- One Pass Disassembler. Version %d.%02d%s %s\n",ver1,ver2,betta,__DATE__);
|
|
|
|
for(j=0;j<pdbg;j++){
|
|
|
|
//printf("line %d loc %X\n",dbgnum[j],dbgloc[j]);
|
|
|
|
if((int)lstflag[j]!=0xFF){
|
|
|
|
flag=lstflag[j];
|
|
|
|
offs2=lstend[j];
|
|
|
|
outptr=dbgloc[j];
|
|
|
|
instruction_offset=outptr+startip;
|
|
|
|
seg_size=(unsigned char)(16+16*(flag&1));
|
|
|
|
line=dbgnum[j];
|
|
|
|
if(offs2!=outptr){
|
|
|
|
/*
|
|
|
|
if(line!=0)printf("%s %u:",(startfileinfo+dbgmod[j])->filename,line);
|
|
|
|
if(lststring[j]!=NULL)printf(" %s\n",lststring[j]);
|
|
|
|
else if(line!=0)printf("\n");
|
|
|
|
*/
|
|
|
|
fprintf(hout,"\n");
|
|
|
|
if(line!=0)fprintf(hout,"%s %u:",(startfileinfo+dbgmod[j])->filename,line);
|
|
|
|
if(lststring[j]!=NULL)fprintf(hout," %s\n",lststring[j]);
|
|
|
|
else if(line!=0)fprintf(hout,"\n");
|
|
|
|
while(outptr<offs2){
|
|
|
|
if(flag&0x1e)undata(instruction_offset,offs2-dbgloc[j],(flag>>1)&15);
|
|
|
|
else unassemble(instruction_offset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if((dbg&1)!=0&&((flag&0xe)!=0||line==0)){
|
|
|
|
KillDataLine(j);
|
|
|
|
j--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose(hout);
|
|
|
|
hout=NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef DEBUGMODE
|
|
|
|
void printdebuginfo()
|
|
|
|
{
|
|
|
|
static FILE *df=NULL;
|
|
|
|
if((df=fopen("debug.tmp","w+t"))==NULL)df=stdout;
|
|
|
|
fprintf(df,"%s(%d)> %08X %08X tok=%d num=%08X flag=%08X scanmode=%d %s\n",startfileinfo==NULL?"":(startfileinfo+currentfileinfo)->filename,linenumber,input,inptr2,tok,itok.number,itok.flag,scanlexmode,itok.name);
|
|
|
|
fflush(df);
|
|
|
|
}
|
|
|
|
#endif
|
|
|