Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1882 clevermous 1
#include"loader.h"
2
 
3
#define MAX_DLL		32
4
 
5
static dll_t dll_list[MAX_DLL];
6
 
7
SYMENT * dl_find_dll_symbol(char * name,dll_t ** xdll)
8
{
9
 dll_t * dll;
10
 SYMENT * __ret;
11
 int i;
12
 for(dll=dll_list+0,i=0;i
13
 {
14
  if(dll->obj)
15
  {
16
   __ret=find_coff_symbol(dll->obj,name);
17
   if(__ret)
18
   {
19
    *xdll=dll;
20
    return __ret;
21
   }
22
  }
23
 }
24
 *xdll=(dll_t *)NULL;
25
 return 0;
26
}
27
 
28
unsigned long dl_get_ref(char * symname)
29
{
30
 dll_t * dll;
31
 SYMENT * sym=dl_find_dll_symbol(symname,&dll);
32
 if(!sym && !dll) return 0;
33
 return sym->e_value+dll->obj->co_sections[sym->e_scnum-1].s_scnptr+dll->obj->co_loadaddr;
34
}
35
 
36
void init_dll(void)
37
{
38
 int i;
39
 for(i=0;i
40
  dll_list[i].obj=NULL;
41
}
42
 
43
dll_t * load_dll(char * name)
44
{
45
 dll_t * p;
46
 int i;
47
 dprintf("Load dll '%s'\n",name);
48
 for(i=0,p=dll_list+0;i
49
 {
50
  if(!p->obj)
51
  {
52
   p->obj=mcoff_load_file(name);
53
   if(!p->obj) return NULL;
54
   return p;
55
  }
56
 }
57
 return NULL;
58
}
59
 
60
int dll_symlookupfn(coffobj_t * obj,unsigned long * sym_val,
61
 unsigned long * sym_sect,int index)
62
{
63
 SYMENT * symtab;
64
 unsigned long lookup;
65
 char xname[9];
66
 char * symnamep;
67
 symtab=obj->co_symtab+index;
68
 *sym_sect=(unsigned long)symtab->e_scnum;
69
 if(symtab->e_scnum>0)
70
 {
71
  *sym_val=symtab->e_value;
72
  return 0;
73
 }
74
 if(symtab->e.e.e_zeroes==0)
75
 {
76
  symnamep=(char *)(((long)obj->co_strtab)+symtab->e.e.e_offset);
77
 } else {
78
  symnamep=(char *)symtab->e.e_name;
79
  memset(xname,0,9);
80
  memcpy(xname,symnamep,8);
81
  symnamep=xname;
82
 }
83
 lookup=kexport_lookup(symnamep);
84
 if(lookup)
85
 {
86
  *sym_val=lookup;
87
  return 0;
88
 }
89
 lookup=dl_get_ref(symnamep);
90
 if(!lookup) return -1;
91
 *sym_val=lookup;
92
 return 0;
93
}
94
 
95
int relocate_dlls(void)
96
{
97
 int i;
98
 dll_t * dll;
99
 for(i=0,dll=dll_list+0;i
100
  if(dll->obj)
101
   if(relocate_coff_file(dll->obj,dll_symlookupfn)) return -1;
102
 return 0;
103
}