Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4972 → Rev 4973

/programs/develop/libraries/menuetlibc/programs/ld-dll/dll_list.c
0,0 → 1,119
#include"ld-dll.h"
 
#define MAX_DLL 32
 
static dll_t dll_list[MAX_DLL];
 
SYMENT * dl_find_dll_symbol(char * name,dll_t ** xdll)
{
dll_t * dll;
SYMENT * __ret;
int i;
for(dll=dll_list+0,i=0;i<MAX_DLL;i++,dll++)
{
if(dll->obj)
{
__ret=find_coff_symbol(dll->obj,name);
if(__ret)
{
*xdll=dll;
return __ret;
}
}
}
*xdll=(dll_t *)NULL;
return 0;
}
 
unsigned long dl_get_ref(char * symname)
{
dll_t * dll;
SYMENT * sym=dl_find_dll_symbol(symname,&dll);
if(!sym && !dll) return 0;
return sym->e_value+dll->obj->co_sections[sym->e_scnum-1].s_scnptr+dll->obj->co_loadaddr;
}
 
void init_dll(void)
{
int i;
for(i=0;i<MAX_DLL;i++)
dll_list[i].obj=NULL;
}
 
dll_t * load_dll(char * name)
{
dll_t * p;
int i;
dprintf("Load dll '%s'\n",name);
for(i=0,p=dll_list+0;i<MAX_DLL;i++,p++)
{
if(!p->obj)
{
p->obj=mcoff_load_file(name);
p->d_name=strdup(name);
if(!p->obj) return NULL;
return p;
}
}
return NULL;
}
 
dll_t * find_dll(char * name)
{
dll_t * p;
int i,j=strlen(name);
for(i=0,p=dll_list+0;i<MAX_DLL;i++,p++)
{
if(p->obj)
{
if(strlen(p->d_name)==j &&
!strncmp(name,p->d_name,j)) return p;
}
}
return NULL;
}
 
int dll_symlookupfn(coffobj_t * obj,unsigned long * sym_val,
unsigned long * sym_sect,int index)
{
SYMENT * symtab;
unsigned long lookup;
char xname[9];
char * symnamep;
symtab=obj->co_symtab+index;
*sym_sect=(unsigned long)symtab->e_scnum;
if(symtab->e_scnum>0)
{
*sym_val=symtab->e_value;
return 0;
}
if(symtab->e.e.e_zeroes==0)
{
symnamep=(char *)(((long)obj->co_strtab)+symtab->e.e.e_offset);
} else {
symnamep=(char *)symtab->e.e_name;
memset(xname,0,9);
memcpy(xname,symnamep,8);
symnamep=xname;
}
lookup=kexport_lookup(symnamep);
if(lookup)
{
*sym_val=lookup;
return 0;
}
lookup=dl_get_ref(symnamep);
if(!lookup) return -1;
*sym_val=lookup;
return 0;
}
 
int relocate_dlls(void)
{
int i;
dll_t * dll;
for(i=0,dll=dll_list+0;i<MAX_DLL;i++,dll++)
if(dll->obj)
if(relocate_coff_file(dll->obj,dll_symlookupfn)) return -1;
return 0;
}