home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 15 / 15.iso / s / s053 / 9.ddi / usr / include / sys / x.out.h < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-08  |  15.1 KB  |  470 lines

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