home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 202.img / SCO386N2.TD0 / usr / include / sys / a.out.h next >
Encoding:
C/C++ Source or Header  |  1988-06-08  |  14.9 KB  |  462 lines

  1. /*
  2.  *    @(#) a.out.h 2.3 88/06/08 
  3.  *
  4.  *    Copyright (C) The Santa Cruz Operation, 1984, 1985, 1986, 1987.
  5.  *    Copyright (C) Microsoft Corporation, 1984, 1985, 1986, 1987.
  6.  *    This Module contains Proprietary Information of
  7.  *    The Santa Cruz Operation, Microsoft Corporation
  8.  *    and AT&T, and should be treated as Confidential.
  9.  *
  10.  *    <a.out.h> - Object file structure declarations.
  11.  */
  12.  
  13.  
  14. /*
  15.  *    The main and extended header structures.
  16.  *    For x.out segmented (XE_SEG):
  17.  *        1) fields marked with (s) must contain sums of xs_psize for
  18.  *        non-memory images, or xs_vsize for memory images.
  19.  *        2) the contents of fields marked with (u) are undefined.
  20.  */
  21.  
  22. /*
  23.  *    For the 386 all these fields assume their full 32 bit meaning
  24.  *    
  25.  *    This is still sufficient for 386 large model so long as the
  26.  *    sum of the virtual sizes of the segments does not exceed 4Gb.
  27.  *    
  28.  *    The linker must generate some new data here, specifically:
  29.  *    
  30.  *        x_cpu == XC_386 
  31.  *        x_renv    has new bits interpretations controlled by
  32.  *            the -V option of the linker (see below).
  33.  */    
  34.  
  35. struct xexec {                /* x.out header */
  36.     unsigned short    x_magic;    /* magic number */
  37.     unsigned short    x_ext;        /* size of header extension */
  38.     long        x_text;        /* size of text segment (s) */
  39.     long        x_data;        /* size of initialized data (s) */
  40.     long        x_bss;        /* size of uninitialized data (s) */
  41.     long        x_syms;        /* size of symbol table (s) */
  42.     long        x_reloc;    /* relocation table length (s) */
  43.     long        x_entry;    /* entry point, machine dependent */
  44.     char        x_cpu;        /* cpu type & byte/word order */
  45.     char        x_relsym;    /* relocation & symbol format (u) */
  46.     unsigned short    x_renv;        /* run-time environment */
  47. };
  48.  
  49. /*
  50.  *    For the 386 the following fields are affected:
  51.  *
  52.  *    xe_pagesize    set by the linker option -R this
  53.  *            is currently 0 and should be set to the pagesize
  54.  *            of the 386 XENIX implementation modulo 512.
  55.  */
  56.  
  57. struct xext {                /* x.out header extension */
  58.     /* The following 4 fields are UNUSED currently */
  59.     long        xe_trsize;    /* size of text relocation (s) */
  60.     long        xe_drsize;    /* size of data relocation (s) */
  61.     long        xe_tbase;    /* text relocation base (u) */
  62.     long        xe_dbase;    /* data relocation base (u) */
  63.     /* End of unused fields */
  64.     long        xe_stksize;    /* stack size (if XE_FS set) */
  65.                 /* the following must be present if XE_SEG */
  66.     long        xe_segpos;    /* segment table position */
  67.     long        xe_segsize;    /* segment table size */
  68.     long        xe_mdtpos;    /* machine dependent table position */
  69.     long        xe_mdtsize;    /* machine dependent table size */
  70.     char        xe_mdttype;    /* machine dependent table type */
  71.     char        xe_pagesize;    /* file pagesize, in multiples of 512 */
  72.     char        xe_ostype;    /* operating system type */
  73.     char        xe_osvers;    /* operating system version */
  74.     unsigned short    xe_eseg;    /* entry segment, machine dependent */
  75.     unsigned short    xe_sres;    /* reserved */
  76. };
  77.  
  78.  
  79. /*
  80.  *    for the 386:
  81.  *
  82.  *    xs_filpos    set to a multiple of xe_pagesize*512 to allow
  83.  *            demand loading from the file system.
  84.  *    xs_rbase    modulo xe_pagesize*512 and set using the -D and
  85.  *            -T options of the linker.
  86.  */
  87.  
  88. struct xseg {                /* x.out segment table entry */
  89.     unsigned short    xs_type;    /* segment type */
  90.     unsigned short    xs_attr;    /* segment attributes */
  91.     unsigned short    xs_seg;        /* segment number */
  92.     char        xs_align;    /* log base 2 of alignment */
  93.     char        xs_cres;    /* unused */
  94.     long        xs_filpos;    /* file position */
  95.     long        xs_psize;    /* physical size (in file) */
  96.     long        xs_vsize;    /* virtual size (in core) */
  97.     long        xs_rbase;    /* relocation base address/offset */
  98.     unsigned short    xs_noff;    /* segment name string table offset */
  99.     unsigned short    xs_sres;    /* unused */
  100.     long        xs_lres;    /* unused */
  101. };
  102.  
  103.  
  104. struct xiter {                /* x.out iteration record */
  105.     long        xi_size;    /* source byte count */
  106.     long        xi_rep;        /* replication count */
  107.     long        xi_offset;    /* destination offset in segment */
  108. };
  109.  
  110.  
  111. struct xlist {                 /* xlist structure for xlist(3). */
  112.     unsigned short    xl_type;    /* symbol type */
  113.     unsigned short    xl_seg;        /* file segment table index */
  114.     long        xl_value;    /* symbol value */
  115.     char        *xl_name;    /* pointer to asciz name */
  116. };
  117.  
  118.  
  119. /*
  120.  *      Definitions for xexec.x_magic, HEX (short).
  121.  */
  122.  
  123. #define ARCMAGIC    0xff65    /* 0177545, archive, same as always */
  124. #define X_MAGIC        0x0206    /* indicates x.out header */
  125.  
  126.  
  127. /*
  128.  *      Definitions for xexec.x_cpu, cpu type (char).
  129.  *
  130.  *    b           set if high byte first in short
  131.  *     w              set if low word first in long
  132.  *      cccccc    cpu type
  133.  */
  134.  
  135.     /* bytes/words are "swapped" if not stored in pdp11 ordering */
  136. #define XC_BSWAP    0x80    /* bytes swapped */
  137. #define XC_WSWAP    0x40    /* words swapped */
  138.  
  139. #define XC_NONE        0x00    /* none */
  140. #define XC_PDP11    0x01    /* pdp11 */
  141. #define XC_23        0x02    /* 23fixed from pdp11 */
  142. #define XC_Z8K        0x03    /* Z8000 */
  143. #define XC_8086        0x04    /* I8086 */
  144. #define XC_68K        0x05    /* M68000 */
  145. #define XC_Z80        0x06    /* Z80 */
  146. #define XC_VAX        0x07    /* VAX 780/750 */
  147. #define XC_16032    0x08    /* NS16032 */
  148. #define XC_286        0x09    /* iAPX 80286 */
  149. #define XC_286V        0x29    /* iAPX 80286, use xe_osver for version */
  150. #define XC_386        0x0a    /* iAPX 80386 */
  151. #define XC_186        0x0b    /* iAPX 80186 */
  152. #define XC_CPU        0x3f    /* cpu mask */
  153.  
  154.  
  155. /*
  156.  *    Definitions for xexec.x_relsym (char), valid only if !XE_SEG.
  157.  *
  158.  *    rrrr            relocation table format
  159.  *        ssss        symbol table format
  160.  */
  161.  
  162.     /* relocation table format */
  163. #define XR_RXOUT    0x00    /* x.out long form, linkable */
  164. #define XR_RXEXEC    0x10    /* x.out short form, executable */
  165. #define XR_RBOUT    0x20    /* b.out format */
  166. #define XR_RAOUT    0x30    /* a.out format */
  167. #define XR_R86REL    0x40    /* 8086 relocatable format */
  168. #define XR_R86ABS    0x50    /* 8086 absolute format */
  169. #define XR_R286ABS    0x60    /* 80286 absolute format */
  170. #define XR_R286REL    0x70    /* 80286 relocatable format */
  171. #define XR_REL        0xf0    /* relocation format mask */
  172.  
  173.     /* symbol table format */
  174. #define XR_SXOUT    0x00    /* trailing string, struct sym */
  175. #define XR_SBOUT    0x01    /* trailing string, struct bsym */
  176. #define XR_SAOUT    0x02    /* struct asym (nlist) */
  177. #define XR_S86REL    0x03    /* 8086 relocatable format */
  178. #define XR_S86ABS    0x04    /* 8086 absolute format */
  179. #define XR_SUCBVAX    0x05    /* separate string table */
  180. #define XR_S286ABS    0x06    /* 80286 absolute format */
  181. #define XR_S286REL    0x07    /* 80286 relocatable format */
  182. #define XR_SXSEG    0x08    /* segmented format */
  183. #define XR_SYM        0x0f    /* symbol format mask */
  184.  
  185.  
  186. /*
  187.  *      Definitions for xexec.x_renv (short).
  188.  *
  189.  *    vv                  version compiled for
  190.  *      xx                extra (zero)
  191.  *        s               set if segmented x.out
  192.  *         a              set if absolute (set up for physical address)
  193.  *          i             set if segment table contains iterated text/data
  194.  *           v            set if virtual kernel module or shared library
  195.  *                   was (h) but this was never used.
  196.  *            f           set if floating point hardware required
  197.  *             t          set if large model text
  198.  *              d         set if large model data
  199.  *               o        set if text overlay
  200.  *                f       set if fixed stack
  201.  *                 p      set if text pure
  202.  *                  s     set if separate I & D
  203.  *                   e    set if executable
  204.  */
  205.  
  206. /*
  207.  *     On the 386 the validity of a module and its type
  208.  *    is determined by the settings of the XE_ABS, XE_VMOD and XE_EXEC
  209.  *    bits as follows:
  210.  *
  211.  *    XE_ABS    XE_VMOD    XE_EXEC            Meaning
  212.  *      0       0       0        BAD x.out (error in linking)
  213.  *      0       0       1        Old x.out, no shared libraries used.
  214.  *      0       1       0        Shared Library Module.
  215.  *      0       1       1        x.out executable that uses shared libs.
  216.  *      1       0       0        BAD (not possible)
  217.  *      1       0       1        Standalone Program (e.g. kernel)
  218.  *      1       1       0        Virtual Kernel Module (e.g. IDD)
  219.  *      1       1       1        BAD (not possible)
  220.  *
  221.  *    The setting of the XE_VMOD bit is controlled by the -V option of
  222.  *     the linker.
  223.  */
  224.  
  225. #define XE_V2        0x4000        /* version 2.x */
  226. #define XE_V3        0x8000        /* version 3.x */
  227. #define XE_OSV        0xc000        /* if XE_SEG use xe_osvers ... */
  228. #define XE_V5        XE_OSV        /* else assume v5.x */
  229. #define XE_VERS        0xc000        /* version mask */
  230.  
  231. #define XE_5_3        0x2000        /* binary needs 5.3 functionality */
  232. #define XE_LOCK        0x1000        /* Use Advisory locking */
  233. #define XE_SEG        0x0800        /* segment table present */
  234. #define XE_ABS        0x0400        /* absolute memory image (standalone) */
  235. #define XE_ITER        0x0200        /* iterated text/data present */
  236. #define XE_HDATA    0x0100        /* huge model data (never used) */
  237. #define XE_VMOD        XE_HDATA    /* virtual module */
  238. #define XE_FPH        0x0080        /* floating point hardware required */
  239. #define XE_LTEXT    0x0040        /* large model text */
  240. #define XE_LDATA    0x0020        /* large model data */
  241. #define XE_OVER        0x0010        /* text overlay */
  242. #define XE_FS        0x0008        /* fixed stack */
  243. #define XE_PURE        0x0004        /* pure text */
  244. #define XE_SEP        0x0002        /* separate I & D */
  245. #define XE_EXEC        0x0001        /* executable */
  246.  
  247. /*
  248.  * flag for Coff binaries in upage
  249.  */
  250. #define XCB_COFF        0x01
  251.  
  252. /*
  253.  *    Definitions for xe_mdttype (char).
  254.  */
  255.  
  256. #define    XE_MDTNONE    0    /* no machine dependent table */
  257. #define    XE_MDT286    1    /* iAPX286 LDT */
  258.  
  259.  
  260. /*
  261.  *    Definitions for xe_ostype (char).
  262.  */
  263.  
  264. #define    XE_OSNONE    0
  265. #define    XE_OSXENIX    1    /* Xenix */
  266. #define    XE_OSRMX    2    /* iRMX */
  267. #define    XE_OSCCPM    3    /* Concurrent CP/M */
  268.  
  269.  
  270. /*
  271.  *    Definitions for xe_osvers (char).
  272.  */
  273.  
  274. #define    XE_OSXV2    0    /* Xenix V3.x */
  275. #define    XE_OSXV3    1    /* Xenix V3.x */
  276. #define    XE_OSXV5    2    /* Xenix V5.x */
  277.  
  278.  
  279. /*
  280.  *    Definitions for xs_type (short).
  281.  *      Values from 64 to 127 are reserved.
  282.  */
  283.  
  284. #define    XS_TNULL    0    /* unused segment */
  285. #define    XS_TTEXT    1    /* text segment */
  286. #define    XS_TDATA    2    /* data segment */
  287. #define    XS_TSYMS    3    /* symbol table segment */
  288. #define    XS_TREL        4    /* relocation segment */
  289. #define    XS_TSESTR    5    /* segment table's string table segment */
  290. #define    XS_TGRPS    6    /* group definitions segment */
  291.  
  292. #define    XS_TIDATA    64    /* iterated data */
  293. #define    XS_TTSS        65    /* tss */
  294. #define    XS_TLFIX    66    /* lodfix */
  295. #define    XS_TDNAME    67    /* descriptor names */
  296. #define    XS_TDTEXT    68    /* debug text segment */
  297. #define    XS_TIDBG    XS_TDTEXT
  298. #define    XS_TDFIX    69    /* debug relocation */
  299. #define    XS_TOVTAB    70    /* overlay table */
  300. #define    XS_T71        71
  301. #define    XS_TSYSTR    72    /* symbol string table */
  302.  
  303.  
  304. /*
  305.  *    Definitions for xs_attr (short).
  306.  *    The top bit is set if the file segment represents a memory image.
  307.  *    The low 15 bits' definitions depend on the type of file segment.
  308.  */
  309.  
  310. #define XS_AMEM        0x8000    /* segment represents a memory image */
  311. #define XS_AMASK    0x7fff    /* type specific field mask */
  312.  
  313.     /* For XS_TTEXT and XS_TDATA segments, bit definitions. */
  314. #define XS_AITER    0x0001    /* contains iteration records */
  315. #define XS_AHUGE    0x0002    /* contains huge element */
  316. #define XS_ABSS        0x0004    /* contains implicit bss */
  317. #define XS_APURE    0x0008    /* read-only, may be shared */
  318. #define XS_AEDOWN    0x0010    /* segment expands downward (stack) */
  319. #define XS_APRIV    0x0020    /* segment may not be combined */
  320. #define    XS_A32BIT    0x0040    /* segment is 32 bits */
  321.  
  322.     /* For XS_TSYMS segments, enumerated symbol table types. */
  323. #define XS_S5BELL    0    /* Bell 5.2 format */
  324. #define XS_SXSEG    1    /* x.out segmented format */
  325. #define    XS_SISLAND    2    /* island debugger support */
  326.  
  327.     /* For XS_TREL segments, enumerated relocation table types. */
  328. #define XS_RXSEG    1    /* x.out segmented format */
  329. #define XS_R86SEG    2    /* 8086 x.out segmented relocation */
  330.  
  331.  
  332. /*
  333.  *    File position macros, valid only if !XE_SEG.
  334.  */
  335.  
  336. #define XEXTPOS(xp)    ((long) sizeof(struct xexec))
  337. #define XTEXTPOS(xp)    (XEXTPOS(xp) + (long) (xp)->x_ext)
  338. #define XDATAPOS(xp)    (XTEXTPOS(xp) + (xp)->x_text)
  339. #define XSYMPOS(xp)    (XDATAPOS(xp) + (xp)->x_data)
  340. #define XRELPOS(xp)    (XSYMPOS(xp) + (xp)->x_syms)
  341. #define XENDPOS(xp)    (XRELPOS(xp) + (xp)->x_reloc)
  342.  
  343. #define XRTEXTPOS(xp, ep)    (XRELPOS(xp))
  344. #define XRDATAPOS(xp, ep)    (XRELPOS(xp) + (ep)->xe_trsize)
  345.  
  346.  
  347. /*
  348.  *    byte/word swapping macros:
  349.  */
  350.  
  351. #define SBSWAP(x) ((((x) >> 8) & 0x00ff) | \
  352.             (((x) << 8) & 0xff00))
  353.  
  354. #define LBSWAP(x)  ((((long) (x) >> 8) & 0x00ff00ffL) | \
  355.             (((long) (x) << 8) & 0xff00ff00L))
  356.  
  357. #define LWSWAP(x)   ((((long) (x) >> 16) & 0x0000ffffL) | \
  358.                (((long) (x) << 16) & 0xffff0000L))
  359.  
  360. #define    STRUCTOFF(structure, field)    (int) &(((struct structure *) 0)->field)
  361.  
  362.  
  363. #define H_NONE    0        /* not an object file */
  364. #define H_AOUT    1        /* a.out */
  365. #define H_BOUT    2        /* b.out */
  366. #define H_ROUT    3        /* 8086 rel */
  367. #define H_XROUT    4        /* 8086 rel with x.out header */
  368. #define H_ZAOUT    5        /* z8000 a.out */
  369. #define H_XOUT    6        /* x.out */
  370. #define H_XSEG    7        /* segmented x.out */
  371. #define H_COFF    8        /* COFF header */
  372.  
  373. #define S_NONE    0        /* not an object file */
  374. #define S_ASYM    1        /* a.out */
  375. #define S_BSYM    2        /* b.out */
  376. #define S_RSYM    3        /* 8086 rel */
  377. #define S_XSYM    4        /* x.out symbols */
  378. #define S_XSEG    5        /* x.out segmented symbols */
  379. #define S_86ABS    6        /* 8086 abs symbols */
  380. #define S_IDBG    7        /* debug symbols */
  381. #define S_5BELL    8        /* Bell 5.2 symbols */
  382. #define S_ISLAND 9        /* island debugger support */
  383. #define S_COFF 10        /* COFF symbol table */
  384.  
  385.  
  386.  
  387.  
  388. /*
  389.  *    All of the following are provided for compatibility only.
  390.  */
  391.  
  392. struct aexec {                /* a.out header */
  393.     unsigned short    xa_magic;       /* magic number */
  394.     unsigned short    xa_text;        /* size of text segment */
  395.     unsigned short    xa_data;        /* size of initialized data */
  396.     unsigned short    xa_bss;         /* size of unitialized data */
  397.     unsigned short    xa_syms;        /* size of symbol table */
  398.     unsigned short    xa_entry;       /* entry point */
  399.     unsigned short    xa_unused;      /* not used */
  400.     unsigned short    xa_flag;        /* relocation info stripped */
  401. };
  402.  
  403.  
  404. struct nlist {                /* nlist structure for nlist(3). */
  405.     char        n_name[8];    /* symbol name */
  406.     int        n_type;        /* type flag */
  407.     unsigned    n_value;    /* value */
  408. };
  409.  
  410.  
  411. /*
  412.  *    Definitions for aexec.xa_magic, OCTAL, obsolete (short).
  413.  */
  414.  
  415. #define FMAGIC        0407    /* normal */
  416. #define NMAGIC        0410    /* pure, shared text */
  417. #define IMAGIC        0411    /* separate I & D */
  418. #define OMAGIC        0405    /* text overlays */
  419. #define ZMAGIC        0413    /* demand load format */
  420.  
  421. #define    A_MAGIC1    FMAGIC
  422. #define    A_MAGIC2    NMAGIC
  423. #define    A_MAGIC3    IMAGIC
  424. #define    A_MAGIC4    OMAGIC
  425.  
  426. #define Z_MAGIC1    0164007    /* normal         0xe807 */
  427. #define Z_MAGIC2    0164010    /* pure only text   0xe808 */
  428. #define Z_MAGIC3    0164011    /* separate I & D   0xe809 */
  429. #define Z_MAGIC4    0164005    /* overlay        0xe805 */
  430.  
  431.  
  432. #define ATEXTPOS(ap)    ((long) sizeof(struct aexec))
  433. #define ADATAPOS(ap)    (ATEXTPOS(ap) + (long) (ap)->xa_text)
  434. #define ARTEXTPOS(ap)    (ADATAPOS(ap) + (long) (ap)->xa_data)
  435. #define ARDATAPOS(ap)    (ARTEXTPOS(ap) + ((long) \
  436.                 ((ap)->xa_flag? 0 : (ap)->xa_text)))
  437. #define ASYMPOS(ap)    (ATEXTPOS(ap) + \
  438.                 (((ap)->xa_flag? 1L : 2L) * \
  439.             ((long) (ap)->xa_text + (long) (ap)->xa_data)))
  440. #define AENDPOS(ap)    (ASYMPOS(ap) + (long) (ap)->xa_syms)
  441.  
  442.  
  443. struct bexec {            /* b.out header */
  444.     long    xb_magic;    /* magic number */
  445.     long    xb_text;    /* text segment size */
  446.     long    xb_data;    /* data segment size */
  447.     long    xb_bss;        /* bss size */
  448.     long    xb_syms;    /* symbol table size */
  449.     long    xb_trsize;    /* text relocation table size */
  450.     long    xb_drsize;    /* data relocation table size */
  451.     long    xb_entry;    /* entry point */
  452. };
  453.  
  454.  
  455. #define BTEXTPOS(bp)    ((long) sizeof(struct bexec))
  456. #define BDATAPOS(bp)     (BTEXTPOS(bp) + (bp)->xb_text)
  457. #define BSYMPOS(bp)    (BDATAPOS(bp) + (bp)->xb_data)
  458. #define BRTEXTPOS(bp)    (BSYMPOS(bp) + (bp)->xb_syms)
  459. #define BRDATAPOS(bp)    (BRTEXTPOS(bp) + (bp)->xb_trsize)
  460. #define BENDPOS(bp)    (BRDATAPOS(bp) + (bp)->xb_drsize)
  461.  
  462.