rdfheaderrec *rdfgetheaderrec(rdffile *f) { static rdfheaderrec r; int i; if (!f->header_loc) { rdf_errno = 5; return NULL; } if (f->header_fp >= f->header_len) return 0; RI8(r.type); switch(r.type) { case 1: /* Relocation record */ RI8(r.r.segment); RI32(r.r.offset); RI8(r.r.length); RI16(r.r.refseg); break; case 2: /* Imported symbol record */ RI16(r.i.segment); RS(r.i.label,32); break; case 3: /* Exported symbol record */ RI8(r.e.segment); RI32(r.e.offset); RS(r.e.label,32); break; case 4: /* DLL record */ RS(r.d.libname,127); break; case 5: /* BSS reservation record */ RI32(r.b.amount); break; default: rdf_errno = 2; /* invalid file */ return NULL; } return &r; }
/* * Read a header record. * Returns the address of record, or NULL in case of error. */ rdfheaderrec *rdfgetheaderrec(rdffile * f) { static rdfheaderrec r; int i; if (!f->header_loc) { rdf_errno = RDF_ERR_HEADER; return NULL; } if (f->header_fp >= f->header_len) return 0; RI8(r.type); RI8(r.g.reclen); switch (r.type) { case RDFREC_RELOC: /* Relocation record */ case RDFREC_SEGRELOC: if (r.r.reclen != 8) { rdf_errno = RDF_ERR_RECLEN; return NULL; } RI8(r.r.segment); RI32(r.r.offset); RI8(r.r.length); RI16(r.r.refseg); break; case RDFREC_IMPORT: /* Imported symbol record */ case RDFREC_FARIMPORT: RI8(r.i.flags); RI16(r.i.segment); RS(r.i.label, EXIM_LABEL_MAX); break; case RDFREC_GLOBAL: /* Exported symbol record */ RI8(r.e.flags); RI8(r.e.segment); RI32(r.e.offset); RS(r.e.label, EXIM_LABEL_MAX); break; case RDFREC_DLL: /* DLL record */ RS(r.d.libname, MODLIB_NAME_MAX); break; case RDFREC_BSS: /* BSS reservation record */ if (r.r.reclen != 4) { rdf_errno = RDF_ERR_RECLEN; return NULL; } RI32(r.b.amount); break; case RDFREC_MODNAME: /* Module name record */ RS(r.m.modname, MODLIB_NAME_MAX); break; case RDFREC_COMMON: /* Common variable */ RI16(r.c.segment); RI32(r.c.size); RI16(r.c.align); RS(r.c.label, EXIM_LABEL_MAX); break; default: #ifdef STRICT_ERRORS rdf_errno = RDF_ERR_RECTYPE; /* unknown header record */ return NULL; #else for (i = 0; i < r.g.reclen; i++) RI8(r.g.data[i]); #endif } return &r; }
rdfheaderrec *rdfgetheaderrec(rdffile *f) { static rdfheaderrec r; int i; if (!f->header_loc) { rdf_errno = 5; return NULL; } if (f->header_fp >= f->header_len) return 0; RI8(r.type); RI8(r.g.reclen); switch(r.type) { case 1: /* Relocation record */ case 6: if (r.r.reclen != 8) { rdf_errno = 9; return NULL; } RI8(r.r.segment); RI32(r.r.offset); RI8(r.r.length); RI16(r.r.refseg); break; case 2: /* Imported symbol record */ case 7: RI16(r.i.segment); RS(r.i.label,32); break; case 3: /* Exported symbol record */ RI8(r.e.segment); RI32(r.e.offset); RS(r.e.label,32); break; case 4: /* DLL record */ RS(r.d.libname,127); break; case 5: /* BSS reservation record */ if (r.r.reclen != 4) { rdf_errno = 9; return NULL; } RI32(r.b.amount); break; default: #ifdef STRICT_ERRORS rdf_errno = 8; /* unknown header record */ return NULL; #else for (i = 0; i < r.g.reclen; i++) RI8(r.g.data[i]); #endif } return &r; }