0,0 → 1,64 |
#ifndef __MENUETOS_MCOFF_H |
#define __MENUETOS_MCOFF_H |
|
#include"_coff.h" |
|
typedef struct { |
char * co_loadptr; |
unsigned long co_loadaddr; |
unsigned long co_filesize; |
FILHDR * co_filehdr; |
SCNHDR * co_sections; |
SYMENT * co_symtab; |
char * co_strtab; |
char * co_bssptr; |
unsigned long co_bssaddr; |
unsigned long co_bsssize; |
unsigned long co_bsssectnum; |
} coffobj_t; |
|
coffobj_t * mcoff_load_file(char * fname); |
void unload_coff_file(coffobj_t * obj); |
SCNHDR * find_section(char * name,coffobj_t * obj); |
int read_section_data(coffobj_t * obj,SCNHDR * hdr,void ** readp); |
SYMENT * find_coff_symbol(coffobj_t * obj,char * objname); |
|
typedef int (* symlookupfn_t)(coffobj_t *,unsigned long *,unsigned long *,int); |
int relocate_coff_file(coffobj_t * obj,symlookupfn_t lookupfn); |
int mcoff_std_symlookupfn(coffobj_t * obj,unsigned long * sym_val, |
unsigned long * sym_sect,int index); |
unsigned long mcoff_get_ref(coffobj_t * obj,char * symname); |
|
/* |
Your lookup function can be similar to this: |
|
int mcoff_std_symlookupfn(coffobj_t * obj,unsigned long * sym_val, |
unsigned long * sym_sect,int index) |
{ |
SYMENT * symtab,* lookup; |
char xname[9]; |
char * symnamep; |
symtab=obj->co_symtab+index; |
*sym_sect=(unsigned long)symtab->e_scnum; |
if(symtab->e_scnum>0) |
{ |
*sym_val=symtab->e_value; |
return 0; |
} |
if(symtab->e.e.e_zeroes==0) |
{ |
symnamep=(char *)(((long)obj->co_strtab)+symtab->e.e.e_offset); |
} else { |
symnamep=(char *)symtab->e.e_name; |
memset(xname,0,9); |
memcpy(xname,symnamep,8); |
symnamep=xname; |
} |
lookup=find_coff_symbol(obj,symnamep); |
if(!lookup) return -1; |
*sym_val=lookup->e_value+obj->co_sections[lookup->e_scnum-1].s_scnptr+obj->co_loadaddr; |
return 0; |
} |
*/ |
|
#endif |