forked from KolibriOS/kolibrios
Added source files C--.
git-svn-id: svn://kolibrios.org@6446 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
534
programs/develop/cmm/libobj.cpp
Normal file
534
programs/develop/cmm/libobj.cpp
Normal file
@@ -0,0 +1,534 @@
|
||||
#include "tok.h"
|
||||
|
||||
#include "coff.h"
|
||||
|
||||
|
||||
|
||||
char *meserr="Plese, send this obj and sources files to me (sheker@mail.ru)";
|
||||
|
||||
struct LISTINCLFILE{
|
||||
|
||||
char *name;
|
||||
|
||||
int typefind;
|
||||
|
||||
int type;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
enum{
|
||||
|
||||
s_extern,
|
||||
|
||||
s_code,
|
||||
|
||||
s_data,
|
||||
|
||||
s_bss
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct LISTNAMESYMBOL{
|
||||
|
||||
int idx; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
int seg;
|
||||
|
||||
int adr;
|
||||
|
||||
idrec *rec;
|
||||
|
||||
int dbg;
|
||||
|
||||
char name[IDLENGTH];
|
||||
|
||||
}*listnamesymbol;
|
||||
|
||||
|
||||
|
||||
char *curobjname;
|
||||
|
||||
|
||||
|
||||
int numobj=0,numname;
|
||||
|
||||
LISTINCLFILE *listobj;
|
||||
|
||||
unsigned int adr_end;
|
||||
|
||||
|
||||
|
||||
void LoadObj();
|
||||
|
||||
void AddPost(unsigned long loc,int type,unsigned int num);
|
||||
|
||||
int searchtree2(idrec *fptr,ITOK *itok4,int *tok4,unsigned char *string4);
|
||||
|
||||
|
||||
|
||||
int GetSegm(int seg)
|
||||
|
||||
{
|
||||
|
||||
OBJECT_ENTRY *obj;
|
||||
|
||||
if(seg){
|
||||
|
||||
seg--;
|
||||
|
||||
obj=(OBJECT_ENTRY *)(input+(sizeof(COFF_HEADER)+sizeof(OBJECT_ENTRY)*seg));
|
||||
|
||||
seg=obj->vsize;
|
||||
|
||||
}
|
||||
|
||||
return seg;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
int GetOffSec(int seg)
|
||||
|
||||
{
|
||||
|
||||
OBJECT_ENTRY *obj;
|
||||
|
||||
if(seg){
|
||||
|
||||
seg--;
|
||||
|
||||
obj=(OBJECT_ENTRY *)(input+(sizeof(COFF_HEADER)+sizeof(OBJECT_ENTRY)*seg));
|
||||
|
||||
seg=obj->sectionRVA;
|
||||
|
||||
}
|
||||
|
||||
return seg;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AddNameObj(char *name,int typefind,int type)
|
||||
|
||||
{
|
||||
|
||||
int len;
|
||||
|
||||
len=strlen(name);
|
||||
|
||||
if(!numobj)listobj=(LISTINCLFILE *)MALLOC(sizeof(LISTINCLFILE));
|
||||
|
||||
else listobj=(LISTINCLFILE *)REALLOC(listobj,sizeof(LISTINCLFILE)*(numobj+1));
|
||||
|
||||
(listobj+numobj)->name=BackString(name);
|
||||
|
||||
(listobj+numobj)->typefind=typefind;
|
||||
|
||||
(listobj+numobj)->type=type;
|
||||
|
||||
numobj++;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AddObj()
|
||||
|
||||
{
|
||||
|
||||
int hold;
|
||||
|
||||
for(int i=0;i<numobj;i++){
|
||||
|
||||
curobjname=(listobj+i)->name;
|
||||
|
||||
// puts(curobjname);
|
||||
|
||||
hold=loadfile(curobjname,(listobj+i)->typefind);
|
||||
|
||||
if(hold==1||hold==-1){
|
||||
|
||||
unableopenfile(curobjname);
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
if((listobj+i)->type==0)LoadObj();
|
||||
|
||||
free(input);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
int GetAlighSize(long flag)
|
||||
|
||||
{
|
||||
|
||||
int align=0;
|
||||
|
||||
int i=(flag&IMAGE_SCN_ALIGN_MASK)>>20;
|
||||
|
||||
if(i)align=1<<(i-1);
|
||||
|
||||
if(align==1)align=0;
|
||||
|
||||
return align;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ConvertName(char *name)
|
||||
|
||||
{
|
||||
|
||||
int i1,i2;
|
||||
|
||||
char c;
|
||||
|
||||
tok=tk_ID;
|
||||
|
||||
i1=i2=0;
|
||||
|
||||
c=name[i1];
|
||||
|
||||
if(c=='?'){
|
||||
|
||||
i1++;
|
||||
|
||||
c=name[i1];
|
||||
|
||||
if(c=='?'){
|
||||
|
||||
i1=2;
|
||||
|
||||
c=name[i1];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else if(c=='_'){
|
||||
|
||||
if(strncmp(name,"__imp__",7)==0){
|
||||
|
||||
i1=7;
|
||||
|
||||
c=name[i1];
|
||||
|
||||
}
|
||||
|
||||
else if(name[1]=='$'){
|
||||
|
||||
i1=2;
|
||||
|
||||
c=name[i1];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
while(c!=0){
|
||||
|
||||
if(c>='a'&&c<='z')tok=tk_id;
|
||||
|
||||
name[i2]=c;
|
||||
|
||||
i1++;
|
||||
|
||||
i2++;
|
||||
|
||||
c=name[i1];
|
||||
|
||||
if(c=='@'||c=='$')break;
|
||||
|
||||
}
|
||||
|
||||
name[i2]=0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AddPost(unsigned long loc,int type,unsigned int num)
|
||||
|
||||
{
|
||||
|
||||
CheckPosts();
|
||||
|
||||
(postbuf+posts)->num=num;
|
||||
|
||||
(postbuf+posts)->type=type;
|
||||
|
||||
(postbuf+posts)->loc=loc;
|
||||
|
||||
posts++;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ScanSection(int numobj)
|
||||
|
||||
{
|
||||
|
||||
int poutptr,poutptrdata,ppostsize,align;
|
||||
|
||||
OBJECT_ENTRY *obj;
|
||||
|
||||
long flag;
|
||||
|
||||
poutptr=outptr;
|
||||
|
||||
poutptrdata=outptrdata;
|
||||
|
||||
ppostsize=postsize;
|
||||
|
||||
for(int i=0;i<numobj;i++){
|
||||
|
||||
obj=(OBJECT_ENTRY *)(input+(sizeof(COFF_HEADER)+sizeof(OBJECT_ENTRY)*i));
|
||||
|
||||
flag=obj->flags;
|
||||
|
||||
align=GetAlighSize(flag);
|
||||
|
||||
obj->vsize=-1;
|
||||
|
||||
if((flag&IMAGE_SCN_CNT_CODE)&&(flag&IMAGE_SCN_MEM_EXECUTE)){//ᥪ<><E1A5AA><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
obj->vsize=s_code;
|
||||
|
||||
obj->sectionRVA=poutptr=Align(poutptr,align);
|
||||
|
||||
poutptr+=obj->psize;
|
||||
|
||||
if(splitdata==FALSE)poutptrdata=poutptr;
|
||||
|
||||
}
|
||||
|
||||
else{
|
||||
|
||||
if((flag&IMAGE_SCN_MEM_READ)&&(flag&IMAGE_SCN_MEM_WRITE)){
|
||||
|
||||
if(flag&IMAGE_SCN_CNT_INITIALIZED_DATA){ //ᥪ<><E1A5AA><EFBFBD> <20><><EFBFBD>樠<EFBFBD><E6A8A0><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
obj->vsize=s_data;
|
||||
|
||||
obj->sectionRVA=poutptrdata=Align(poutptrdata,align);
|
||||
|
||||
poutptrdata+=obj->psize;
|
||||
|
||||
if(splitdata==FALSE)poutptr=poutptrdata;
|
||||
|
||||
}
|
||||
|
||||
else if(flag&IMAGE_SCN_CNT_UNINITIALIZED_DATA){ //ᥪ<><E1A5AA><EFBFBD> bss
|
||||
|
||||
obj->vsize=s_bss;
|
||||
|
||||
obj->sectionRVA=ppostsize=Align(postsize,align);
|
||||
|
||||
postsize+=obj->psize;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AddLstName(int numname)
|
||||
|
||||
{
|
||||
|
||||
unsigned int minofs;
|
||||
|
||||
int i,j,minname;
|
||||
|
||||
int oseg;
|
||||
|
||||
unsigned int ooutptr,ooutptrdata;
|
||||
|
||||
ooutptr=outptr;
|
||||
|
||||
ooutptrdata=outptrdata;
|
||||
|
||||
for(i=0;i<numname;i++){
|
||||
|
||||
if((listnamesymbol+i)->dbg==0){
|
||||
|
||||
oseg=(listnamesymbol+i)->seg;
|
||||
|
||||
minofs=(listnamesymbol+i)->adr;
|
||||
|
||||
minname=i;
|
||||
|
||||
for(j=i+1;j<numname;j++){
|
||||
|
||||
if(splitdata==FALSE)goto checkadr;
|
||||
|
||||
else if((listnamesymbol+j)->seg==oseg){
|
||||
|
||||
checkadr:
|
||||
|
||||
if(minofs>=(listnamesymbol+j)->adr&&(listnamesymbol+j)->dbg==0){
|
||||
|
||||
if(minofs==(listnamesymbol+j)->adr){
|
||||
|
||||
(listnamesymbol+minname)->dbg=1;
|
||||
|
||||
}
|
||||
|
||||
minofs=(listnamesymbol+j)->adr;
|
||||
|
||||
minname=j;
|
||||
|
||||
oseg=(listnamesymbol+j)->seg;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(minname!=i)i--;
|
||||
|
||||
// printf("seg=%d adr=%d %s\n",oseg,(listnamesymbol+minname)->adr,(listnamesymbol+minname)->name);
|
||||
|
||||
if(oseg==s_code){
|
||||
|
||||
if((listnamesymbol+minname)->rec){
|
||||
|
||||
idrec *ptr;
|
||||
|
||||
ptr=(listnamesymbol+minname)->rec;
|
||||
|
||||
if(ptr->rectok==tk_undefproc||ptr->rectok==tk_proc||ptr->rectok==tk_interruptproc)goto dproc;
|
||||
|
||||
outptrdata=(listnamesymbol+minname)->adr;
|
||||
|
||||
if(splitdata==FALSE)outptr=outptrdata;
|
||||
|
||||
AddDataNullLine(3,(listnamesymbol+minname)->name);
|
||||
|
||||
}
|
||||
|
||||
else{
|
||||
|
||||
dproc:
|
||||
|
||||
outptr=(listnamesymbol+minname)->adr;//12.08.04 00:05 +ooutptr;
|
||||
|
||||
AddCodeNullLine((listnamesymbol+minname)->name);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else if(oseg==s_data){
|
||||
|
||||
outptrdata=(listnamesymbol+minname)->adr;//12.08.04 01:19 +ooutptrdata;
|
||||
|
||||
if(splitdata==FALSE)outptr=outptrdata;
|
||||
|
||||
AddDataNullLine(3,(listnamesymbol+minname)->name);
|
||||
|
||||
}
|
||||
|
||||
(listnamesymbol+minname)->dbg=1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
outptr=ooutptr;
|
||||
|
||||
outptrdata=ooutptrdata;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
int ScanName(COFF_HEADER *head)
|
||||
|
||||
{
|
||||
|
||||
int size,i,j,numname,seg,count;
|
||||
|
||||
IMAGE_SYMBOL *tsym;
|
||||
|
||||
unsigned int ooutptr,ooutptrdata,opostsize;
|
||||
|
||||
idrec *rec;
|
||||
|
||||
ooutptr=outptr;
|
||||
|
||||
ooutptrdata=outptrdata;
|
||||
|
||||
opostsize=postsize;
|
||||
|
||||
numname=head->COFFsize;
|
||||
|
||||
size=numname*sizeof(IMAGE_SYMBOL)+head->pCOFF;
|
||||
|
||||
listnamesymbol=(LISTNAMESYMBOL *)MALLOC(sizeof(LISTNAMESYMBOL)*numname);
|
||||
|
||||
for(i=0,j=0;i<numname;i++){
|
||||
|
||||
tsym=(IMAGE_SYMBOL *)(input+head->pCOFF+i*sizeof(IMAGE_SYMBOL));
|
||||
|
||||
(listnamesymbol+j)->rec=0;
|
||||
|
||||
if(tsym->SectionNumber>=0){
|
||||
|
||||
(listnamesymbol+j)->idx=i;
|
||||
|
||||
if(tsym->N.Name.Short==0){
|
||||
|
||||
strcpy((char *)string,(char *)(input+size+tsym->N.Name.Long));
|
||||
|
||||
}
|
||||
|
||||
else{
|
||||
|
||||
strncpy((char *)string,(char *)tsym->N.sname,8);
|
||||
|
||||
string[8]=0;
|
||||
|
||||
}
|
||||
|
||||
//<2F>८<EFBFBD>ࠧ<EFBFBD><E0A0A7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
|
||||
ConvertName((char *)string);
|
||||
|
||||
seg=(listnamesymbol+j)->seg=GetSegm(tsym->SectionNumber);
|
||||
|
||||
// printf("find name \"%s\" seg=%d type=%d class=%d\n",(char *)string,seg,tsym->Type,tsym->StorageClass);
|
||||
|
||||
(listnamesymbol+j)->adr=tsym->Value+GetOffSec(tsym->SectionNumber);
|
||||
|
||||
(listnamesymbol+j)->dbg=0;
|
||||
|
||||
strcpy((listnamesymbol+j)->name,(char *)string);
|
||||
|
||||
if(seg==s_data){
|
||||
|
||||
outptrdata=(listnamesymbol+j)->adr;//12.08.04 01:20 +ooutptrdata;
|
||||
|
||||
count=FindOff(string,DS);
|
||||
|
Reference in New Issue
Block a user