Example #1
0
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;
}
Example #2
0
/*
 * 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;
}
Example #3
0
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;
}