Subversion Repositories Kolibri OS

Rev

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

  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<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.    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<MAX_DLL;i++,p++)
  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<MAX_DLL;i++,dll++)
  116.   if(dll->obj)
  117.    if(relocate_coff_file(dll->obj,dll_symlookupfn)) return -1;
  118.  return 0;
  119. }
  120.