218 lines
7.4 KiB
C
218 lines
7.4 KiB
C
// MAPSYM.H
|
|
//
|
|
// MAPSYM.EXE header file
|
|
//
|
|
// History is too long and ancient to recount!
|
|
|
|
#include <pshpack1.h> // All structures byte padded
|
|
|
|
#define MAPSYM_VERSION 6 // Version 6.0 is ported to console
|
|
#define MAPSYM_RELEASE 2
|
|
#define FIELDOFFSET(type, field) offsetof(type,field)
|
|
#define CBOFFSET sizeof(unsigned short) /* sym offset size */
|
|
#define CBOFFSET_BIG 3 /* big sym offset */
|
|
|
|
/*
|
|
* Debug Symbol Table Structures (as written to a .sym file)
|
|
* ---------------------------------------------------------
|
|
*
|
|
* For each symbol table (map): (MAPDEF)
|
|
*/
|
|
|
|
struct mapdef_s {
|
|
unsigned short md_spmap; /* 16 bit SEG ptr to next map (0 if end) */
|
|
unsigned char md_abstype; /* 8 bit map/abs sym flags */
|
|
unsigned char md_pad; /* 8 bit pad */
|
|
unsigned short md_segentry; /* 16 bit entry point segment value */
|
|
unsigned short md_cabs; /* 16 bit count of constants in map */
|
|
unsigned short md_pabsoff; /* 16 bit ptr to constant offsets */
|
|
unsigned short md_cseg; /* 16 bit count of segments in map */
|
|
unsigned short md_spseg; /* 16 bit SEG ptr to segment chain */
|
|
unsigned char md_cbnamemax; /* 8 bit maximum symbol name length */
|
|
unsigned char md_cbname; /* 8 bit symbol table name length */
|
|
unsigned char md_achname[1]; /* <n> name of symbol table (.sym ) */
|
|
};
|
|
|
|
#define CBMAPDEF FIELDOFFSET(struct mapdef_s, md_achname)
|
|
|
|
struct endmap_s {
|
|
unsigned short em_spmap; /* end of map chain (SEG ptr 0) */
|
|
unsigned char em_rel; /* release */
|
|
unsigned char em_ver; /* version */
|
|
};
|
|
#define CBENDMAP sizeof(struct endmap_s)
|
|
|
|
|
|
/*
|
|
* For each segment/group within a symbol table: (SEGDEF)
|
|
*/
|
|
|
|
struct segdef_s {
|
|
unsigned short gd_spsegnext; /* 16 bit SEG ptr to next segdef (0 if end),
|
|
relative to mapdef */
|
|
unsigned short gd_csym; /* 16 bit count of symbols in sym list */
|
|
unsigned short gd_psymoff; /* 16 bit ptr to symbol offsets array,
|
|
16 bit SEG ptr if MSF_BIG_GROUP set,
|
|
either relative to segdef */
|
|
unsigned short gd_lsa; /* 16 bit Load Segment address */
|
|
unsigned short gd_in0; /* 16 bit instance 0 physical address */
|
|
unsigned short gd_in1; /* 16 bit instance 1 physical address */
|
|
unsigned short gd_in2; /* 16 bit instance 2 physical address */
|
|
unsigned char gd_type; /* 16 or 32 bit symbols in group */
|
|
unsigned char gd_pad; /* pad byte to fill space for gd_in3 */
|
|
unsigned short gd_spline; /* 16 bit SEG ptr to linedef,
|
|
relative to mapdef */
|
|
unsigned char gd_fload; /* 8 bit boolean 0 if seg not loaded */
|
|
unsigned char gd_curin; /* 8 bit current instance */
|
|
unsigned char gd_cbname; /* 8 bit Segment name length */
|
|
unsigned char gd_achname[1]; /* <n> name of segment or group */
|
|
};
|
|
|
|
/* values for md_abstype, gd_type */
|
|
|
|
#define MSF_32BITSYMS 0x01 /* 32-bit symbols */
|
|
#define MSF_ALPHASYMS 0x02 /* symbols sorted alphabetically, too */
|
|
|
|
/* values for gd_type only */
|
|
|
|
#define MSF_BIGSYMDEF 0x04 /* bigger than 64K of symdefs */
|
|
|
|
/* values for md_abstype only */
|
|
|
|
#define MSF_ALIGN32 0x10 /* 2MEG max symbol file, 32 byte alignment */
|
|
#define MSF_ALIGN64 0x20 /* 4MEG max symbol file, 64 byte alignment */
|
|
#define MSF_ALIGN128 0x30 /* 8MEG max symbol file, 128 byte alignment */
|
|
#define MSF_ALIGN_MASK 0x30
|
|
|
|
#define CBSEGDEF FIELDOFFSET(struct segdef_s, gd_achname)
|
|
|
|
|
|
/*
|
|
* Followed by a list of SYMDEF's..
|
|
* for each symbol within a segment/group: (SYMDEF)
|
|
*/
|
|
|
|
struct symdef16_s {
|
|
unsigned short sd16_val; /* 16 bit symbol addr or const */
|
|
unsigned char sd16_cbname; /* 8 bit symbol name length */
|
|
unsigned char sd16_achname[1]; /* <n> symbol name */
|
|
};
|
|
#define CBSYMDEF16 FIELDOFFSET(struct symdef16_s, sd16_achname)
|
|
|
|
struct symdef_s {
|
|
unsigned long sd_lval; /* 32 bit symbol addr or const */
|
|
unsigned char sd_cbname; /* 8 bit symbol name length */
|
|
unsigned char sd_achname[1]; /* <n> symbol name */
|
|
};
|
|
#define CBSYMDEF FIELDOFFSET(struct symdef_s, sd_achname)
|
|
|
|
/*
|
|
* Also followed by a list of LINDEF's..
|
|
*/
|
|
|
|
struct linedef_s {
|
|
unsigned short ld_splinenext; /* 16 bit SEG ptr to next (0 if last),
|
|
relative to mapdef */
|
|
unsigned short ld_pseg; /* 16 bit ptr to segdef_s (always 0) */
|
|
unsigned short ld_plinerec; /* 16 bit ptr to linerecs,
|
|
relative to linedef */
|
|
unsigned short ld_itype; /* line rec type 0, 1, or 2 */
|
|
unsigned short ld_cline; /* 16 bit count of line numbers */
|
|
unsigned char ld_cbname; /* 8 bit file name length */
|
|
unsigned char ld_achname[1]; /* <n> file name */
|
|
};
|
|
#define CBLINEDEF FIELDOFFSET(struct linedef_s, ld_achname)
|
|
|
|
/* Normal line record (ld_itype == 0) */
|
|
|
|
struct linerec0_s {
|
|
unsigned short lr0_codeoffset; /* start offset for this linenumber */
|
|
unsigned long lr0_fileoffset; /* file offset for this linenumber */
|
|
};
|
|
|
|
/* Special line record - 16 bit (ld_itype == 1) */
|
|
|
|
struct linerec1_s {
|
|
unsigned short lr1_codeoffset; /* start offset for this linenumber */
|
|
unsigned short lr1_linenumber; /* linenumber */
|
|
};
|
|
|
|
/* Special line record - 32 bit (ld_itype == 2) */
|
|
|
|
struct linerec2_s {
|
|
unsigned long lr2_codeoffset; /* start offset for this linenumber */
|
|
unsigned short lr2_linenumber; /* linenumber */
|
|
};
|
|
|
|
/* NOTE: the codeoffset should be the first item in all the linerecs */
|
|
|
|
/* Union of line record types */
|
|
|
|
union linerec_u {
|
|
struct linerec0_s lr0;
|
|
struct linerec1_s lr1;
|
|
struct linerec2_s lr2;
|
|
};
|
|
|
|
#define FALSE 0
|
|
#define TRUE 1
|
|
|
|
#define MAXSEG 1024
|
|
#define MAXLINENUMBER 100000
|
|
#define MAXNAMELEN 32
|
|
#define MAXSYMNAMELEN 127 /* sd_cbname is a char */
|
|
#define MAXLINERECNAMELEN 255 /* ld_cbname is a char */
|
|
#define MAPBUFLEN 512
|
|
|
|
#define LPAREN '('
|
|
#define RPAREN ')'
|
|
|
|
#define _64K 0x10000L
|
|
#define _1MEG 0x100000L
|
|
#define _16MEG 0x1000000L
|
|
|
|
/*
|
|
* Debug Symbol Table Structures (as stored in memory)
|
|
*/
|
|
|
|
struct sym_s {
|
|
struct sym_s *sy_psynext; /* ptr to next sym_s record */
|
|
struct symdef_s sy_symdef; /* symbol record */
|
|
};
|
|
|
|
struct line_s {
|
|
struct line_s *li_plinext; /* ptr to line number list */
|
|
union linerec_u *li_plru; /* pointer to line number offsets */
|
|
unsigned long li_cblines; /* size of this linedef and it's linerecs */
|
|
unsigned long li_offmin; /* smallest offset */
|
|
unsigned long li_offmax; /* largest offset */
|
|
struct linedef_s li_linedef; /* to line number record */
|
|
};
|
|
|
|
struct seg_s {
|
|
unsigned short se_redefined; /* non0 if we have renamed this segment */
|
|
/* to a group name */
|
|
struct sym_s *se_psy; /* ptr to sym_s record chain */
|
|
struct sym_s *se_psylast; /* ptr to last sym_s record in chain */
|
|
struct line_s *se_pli; /* ptr to line number list */
|
|
unsigned short se_cbsymlong; /* sizeof of long names ( > 8 bytes) COFF */
|
|
unsigned long se_cbsyms; /* size of symdef records */
|
|
unsigned long se_cblines; /* size of all linedefs and linerecs */
|
|
unsigned long se_cbseg; /* size of segment */
|
|
struct segdef_s se_segdef; /* segdef record */
|
|
};
|
|
|
|
struct map_s {
|
|
unsigned short mp_cbsymlong; /* size of long names ( > 8 bytes) COFF */
|
|
unsigned short mp_cbsyms; /* size of abs symdef records */
|
|
struct mapdef_s mp_mapdef; /* mapdef record */
|
|
};
|
|
|
|
#define OURBUFSIZ 1024
|
|
|
|
#define MT_NOEXE 0x0000 /* maptype values */
|
|
#define MT_PE 0x0001
|
|
#define MT_OLDPE 0x0002
|
|
#define MT_SYMS 0x0080 /* coff symbols present */
|
|
#define MT_CVSYMS 0x0040 /* CodeView symbols present */
|