Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1882 | clevermous | 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 |