Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
4973 right-hear 1
#include"ld-dll.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
   p->d_name=strdup(name);
54
   if(!p->obj) return NULL;
55
   return p;
56
  }
57
 }
58
 return NULL;
59
}
60
 
61
dll_t * find_dll(char * name)
62
{
63
 dll_t * p;
64
 int i,j=strlen(name);
65
 for(i=0,p=dll_list+0;i
66
 {
67
  if(p->obj)
68
  {
69
   if(strlen(p->d_name)==j &&
70
      !strncmp(name,p->d_name,j)) return p;
71
  }
72
 }
73
 return NULL;
74
}
75
 
76
int dll_symlookupfn(coffobj_t * obj,unsigned long * sym_val,
77
 unsigned long * sym_sect,int index)
78
{
79
 SYMENT * symtab;
80
 unsigned long lookup;
81
 char xname[9];
82
 char * symnamep;
83
 symtab=obj->co_symtab+index;
84
 *sym_sect=(unsigned long)symtab->e_scnum;
85
 if(symtab->e_scnum>0)
86
 {
87
  *sym_val=symtab->e_value;
88
  return 0;
89
 }
90
 if(symtab->e.e.e_zeroes==0)
91
 {
92
  symnamep=(char *)(((long)obj->co_strtab)+symtab->e.e.e_offset);
93
 } else {
94
  symnamep=(char *)symtab->e.e_name;
95
  memset(xname,0,9);
96
  memcpy(xname,symnamep,8);
97
  symnamep=xname;
98
 }
99
 lookup=kexport_lookup(symnamep);
100
 if(lookup)
101
 {
102
  *sym_val=lookup;
103
  return 0;
104
 }
105
 lookup=dl_get_ref(symnamep);
106
 if(!lookup) return -1;
107
 *sym_val=lookup;
108
 return 0;
109
}
110
 
111
int relocate_dlls(void)
112
{
113
 int i;
114
 dll_t * dll;
115
 for(i=0,dll=dll_list+0;i
116
  if(dll->obj)
117
   if(relocate_coff_file(dll->obj,dll_symlookupfn)) return -1;
118
 return 0;
119
}