Subversion Repositories Kolibri OS

Rev

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

  1. #ifndef __MENUETOS_MCOFF_H
  2. #define __MENUETOS_MCOFF_H
  3.  
  4. #include"_coff.h"
  5.  
  6. typedef struct {
  7.  char                   * co_loadptr;
  8.  unsigned long            co_loadaddr;
  9.  unsigned long            co_filesize;
  10.  FILHDR                 * co_filehdr;
  11.  SCNHDR                 * co_sections;
  12.  SYMENT                 * co_symtab;
  13.  char                   * co_strtab;
  14.  char                   * co_bssptr;
  15.  unsigned long            co_bssaddr;
  16.  unsigned long            co_bsssize;
  17.  unsigned long            co_bsssectnum;
  18. } coffobj_t;
  19.  
  20. coffobj_t * mcoff_load_file(char * fname);
  21. void unload_coff_file(coffobj_t * obj);
  22. SCNHDR * find_section(char * name,coffobj_t * obj);
  23. int read_section_data(coffobj_t * obj,SCNHDR * hdr,void ** readp);
  24. SYMENT * find_coff_symbol(coffobj_t * obj,char * objname);
  25.  
  26. typedef int (* symlookupfn_t)(coffobj_t *,unsigned long *,unsigned long *,int);
  27. int relocate_coff_file(coffobj_t * obj,symlookupfn_t lookupfn);
  28. int mcoff_std_symlookupfn(coffobj_t * obj,unsigned long * sym_val,
  29.  unsigned long * sym_sect,int index);
  30. unsigned long mcoff_get_ref(coffobj_t * obj,char * symname);
  31.  
  32. /*
  33. Your lookup function can be similar to this:
  34.  
  35. int mcoff_std_symlookupfn(coffobj_t * obj,unsigned long * sym_val,
  36.  unsigned long * sym_sect,int index)
  37. {
  38.  SYMENT * symtab,* lookup;
  39.  char xname[9];
  40.  char * symnamep;
  41.  symtab=obj->co_symtab+index;
  42.  *sym_sect=(unsigned long)symtab->e_scnum;
  43.  if(symtab->e_scnum>0)
  44.  {
  45.   *sym_val=symtab->e_value;
  46.   return 0;
  47.  }
  48.  if(symtab->e.e.e_zeroes==0)
  49.  {
  50.   symnamep=(char *)(((long)obj->co_strtab)+symtab->e.e.e_offset);
  51.  } else {
  52.   symnamep=(char *)symtab->e.e_name;
  53.   memset(xname,0,9);
  54.   memcpy(xname,symnamep,8);
  55.   symnamep=xname;
  56.  }
  57.  lookup=find_coff_symbol(obj,symnamep);
  58.  if(!lookup) return -1;
  59.  *sym_val=lookup->e_value+obj->co_sections[lookup->e_scnum-1].s_scnptr+obj->co_loadaddr;
  60.  return 0;
  61. }
  62. */
  63.  
  64. #endif
  65.