Subversion Repositories Kolibri OS

Rev

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

  1. #include"mcoff.h"
  2. #include<stdlib.h>
  3. #include"string.h"
  4.  
  5. /* static inline void nprintf(char * s,int n)
  6. {
  7.  printf("nprintf(%u, '",n);
  8.  for(;n;n--)
  9.   putch(*s++);
  10.  printf("')");
  11. } */
  12.  
  13. SYMENT * find_coff_symbol(coffobj_t * obj,char * objname)
  14. {
  15.  int namelen;
  16.  int symno;
  17.  int xlen;
  18.  SYMENT * symtab;
  19.  char * symnamep,symnamelen;
  20.  symtab=obj->co_symtab;
  21.  namelen=strlen(objname);
  22.  for(symno=0;symno<obj->co_filehdr->f_nsyms;symno++,symtab++)
  23.  {
  24.   if(symtab->e.e.e_zeroes==0)
  25.   {
  26.    symnamep=(char *)(((long)obj->co_strtab)+symtab->e.e.e_offset);
  27.    symnamelen=strlen(symnamep);
  28. /*   printf("strtab=%u %x %u ",symtab->e.e.e_offset,symnamep,symnamelen); */
  29.   } else {
  30.    symnamep=(char *)symtab->e.e_name;
  31.    symnamelen=strlen(symnamep);
  32.    if(symnamelen>E_SYMNMLEN)
  33.     symnamelen=E_SYMNMLEN;
  34.   }
  35. /*  nprintf(symnamep,symnamelen);
  36.   printf("\n"); */
  37.   if(symtab->e_scnum!=0 && namelen==symnamelen && !strncmp(objname,symnamep,namelen))
  38.    return symtab;
  39.  }
  40.  return NULL;
  41. }
  42.  
  43. unsigned long mcoff_get_ref(coffobj_t * obj,char * symname)
  44. {
  45.  SYMENT * sym=find_coff_symbol(obj,symname);
  46.  if(!sym) return 0;
  47.  return sym->e_value+obj->co_sections[sym->e_scnum-1].s_scnptr+obj->co_loadaddr;
  48. }
  49.