Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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<MAX_DLL;i++,dll++)
  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<MAX_DLL;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<MAX_DLL;i++,p++)
  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<MAX_DLL;i++,dll++)
  100.   if(dll->obj)
  101.    if(relocate_coff_file(dll->obj,dll_symlookupfn)) return -1;
  102.  return 0;
  103. }
  104.