Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4973 right-hear 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