Blame sysdeps/generic/a.out.h

Packit 6c4009
#ifndef __A_OUT_GNU_H__
Packit 6c4009
#define __A_OUT_GNU_H__
Packit 6c4009
Packit 6c4009
#ifdef	__cplusplus
Packit 6c4009
extern "C" {
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#define __GNU_EXEC_MACROS__
Packit 6c4009
Packit 6c4009
#ifndef __STRUCT_EXEC_OVERRIDE__
Packit 6c4009
Packit 6c4009
struct exec
Packit 6c4009
{
Packit 6c4009
  unsigned long a_info;		/* Use macros N_MAGIC, etc for access */
Packit 6c4009
  unsigned a_text;		/* size of text, in bytes */
Packit 6c4009
  unsigned a_data;		/* size of data, in bytes */
Packit 6c4009
  unsigned a_bss;		/* size of uninitialized data area, in bytes */
Packit 6c4009
  unsigned a_syms;		/* length of symbol table data, in bytes */
Packit 6c4009
  unsigned a_entry;		/* start address */
Packit 6c4009
  unsigned a_trsize;		/* size of reloc info for text, in bytes */
Packit 6c4009
  unsigned a_drsize;		/* size of reloc info for data, in bytes */
Packit 6c4009
Packit 6c4009
#if defined (sequent) && defined (i386)
Packit 6c4009
  struct gdtbl
Packit 6c4009
    {				/* Global Descriptor Table */
Packit 6c4009
      unsigned g_code[2];
Packit 6c4009
      unsigned g_data[2];
Packit 6c4009
      unsigned g_desc[2];
Packit 6c4009
    } a_gdtbl;
Packit 6c4009
   unsigned a_shdata;		/* size of initialized shared data */
Packit 6c4009
   unsigned a_shbss;		/* size of uninitialized shared data */
Packit 6c4009
   unsigned a_shdrsize;		/* size of shared data relocation */
Packit 6c4009
   unsigned a_bootstrap[11];	/* bootstrap for standalone */
Packit 6c4009
   unsigned a_reserved[3];	/* reserved for future use */
Packit 6c4009
   unsigned a_version;		/* object version */
Packit 6c4009
#endif /* Sequent Symmetry, Dynix 3.x */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
#endif /* __STRUCT_EXEC_OVERRIDE__ */
Packit 6c4009
Packit 6c4009
/* these go in the N_MACHTYPE field */
Packit 6c4009
enum machine_type {
Packit 6c4009
#if defined (M_OLDSUN2)
Packit 6c4009
  M__OLDSUN2 = M_OLDSUN2,
Packit 6c4009
#else
Packit 6c4009
  M_OLDSUN2 = 0,
Packit 6c4009
#endif
Packit 6c4009
#if defined (M_68010)
Packit 6c4009
  M__68010 = M_68010,
Packit 6c4009
#else
Packit 6c4009
  M_68010 = 1,
Packit 6c4009
#endif
Packit 6c4009
#if defined (M_68020)
Packit 6c4009
  M__68020 = M_68020,
Packit 6c4009
#else
Packit 6c4009
  M_68020 = 2,
Packit 6c4009
#endif
Packit 6c4009
#if defined (M_SPARC)
Packit 6c4009
  M__SPARC = M_SPARC,
Packit 6c4009
#else
Packit 6c4009
  M_SPARC = 3,
Packit 6c4009
#endif
Packit 6c4009
  /* skip a bunch so we don't run into any of sun's numbers */
Packit 6c4009
  M_386 = 100
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
#if defined (sequent) && defined (i386)
Packit 6c4009
Packit 6c4009
/* Dynix 3 wants the magic number to be the whole first longword.  */
Packit 6c4009
Packit 6c4009
#define N_MAGIC(exec)		((exec).a_info)
Packit 6c4009
#define N_MACHTYPE(exec)	0
Packit 6c4009
#define N_FLAGS(exec)		0
Packit 6c4009
#define N_SET_INFO(exec, magic, type, flags) N_SET_MAGIC ((exec), (magic))
Packit 6c4009
#define N_SET_MAGIC(exec, magic)	((exec).a_info = (magic))
Packit 6c4009
#define N_SET_MACHTYPE(exec, machtype)	((void) 0)
Packit 6c4009
#define N_SET_FLAGS(exec, flags)	((void) 0)
Packit 6c4009
#define	OMAGIC		0x12eb	/* impure format - for .o's */
Packit 6c4009
#define	ZMAGIC		0x22eb	/* demand load format - zero at zero */
Packit 6c4009
#define NMAGIC		you lose /* syntax error -- no pure format */
Packit 6c4009
#define N_BADMAG(x)	(N_MAGIC(x) != OMAGIC && N_MAGIC(x) != ZMAGIC)
Packit 6c4009
#define N_ADDRADJ(x)	(N_MAGIC(x) == ZMAGIC ? SEGMENT_SIZE : 0)
Packit 6c4009
#define N_DATOFF(x)	(N_TXTOFF(x) + (x).a_text - N_ADDRADJ(x))
Packit 6c4009
#define N_TRELOFF(x)	(N_DATOFF(x) + (x).a_data + (x).a_shdata)
Packit 6c4009
#define N_SYMOFF(x)	(N_DRELOFF(x) + (x).a_drsize + (x).a_shdrsize)
Packit 6c4009
#define N_TXTADDR(x)	SEGMENT_SIZE
Packit 6c4009
#define N_COMM		0x0a	/** conflicts with N_INDR **/
Packit 6c4009
#define N_FN		0x0c
Packit 6c4009
/* Note that the Dynix binutils believe that N_SET[TDB] are
Packit 6c4009
   N_SH{DATA,BSS,COMM} -- be wary when mixing GNU & Dynix objects.  */
Packit 6c4009
#define PAGE_SIZE	4096
Packit 6c4009
#define SEGMENT_SIZE	PAGE_SIZE
Packit 6c4009
Packit 6c4009
#else /* !(sequent && i386) */
Packit 6c4009
Packit 6c4009
#if !defined (N_MAGIC)
Packit 6c4009
#define N_MAGIC(exec) ((exec).a_info & 0xffff)
Packit 6c4009
#endif
Packit 6c4009
#define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff))
Packit 6c4009
#define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff)
Packit 6c4009
#define N_SET_INFO(exec, magic, type, flags) \
Packit 6c4009
	((exec).a_info = ((magic) & 0xffff) \
Packit 6c4009
	 | (((int)(type) & 0xff) << 16) \
Packit 6c4009
	 | (((flags) & 0xff) << 24))
Packit 6c4009
#define N_SET_MAGIC(exec, magic) \
Packit 6c4009
	((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff)))
Packit 6c4009
Packit 6c4009
#define N_SET_MACHTYPE(exec, machtype) \
Packit 6c4009
	((exec).a_info = \
Packit 6c4009
	 ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16))
Packit 6c4009
Packit 6c4009
#define N_SET_FLAGS(exec, flags) \
Packit 6c4009
	((exec).a_info = \
Packit 6c4009
	 ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24))
Packit 6c4009
Packit 6c4009
#endif	/* sequent && i386 */
Packit 6c4009
Packit 6c4009
#ifndef OMAGIC
Packit 6c4009
/* Code indicating object file or impure executable.  */
Packit 6c4009
#define OMAGIC 0407
Packit 6c4009
/* Code indicating pure executable.  */
Packit 6c4009
#define NMAGIC 0410
Packit 6c4009
/* Code indicating demand-paged executable.  */
Packit 6c4009
#define ZMAGIC 0413
Packit 6c4009
#endif /* not OMAGIC */
Packit 6c4009
Packit 6c4009
#if !defined (N_BADMAG)
Packit 6c4009
#define N_BADMAG(x)					\
Packit 6c4009
 (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC		\
Packit 6c4009
  && N_MAGIC(x) != ZMAGIC)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#define _N_BADMAG(x)					\
Packit 6c4009
 (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC		\
Packit 6c4009
  && N_MAGIC(x) != ZMAGIC)
Packit 6c4009
Packit 6c4009
#ifndef	sparc
Packit 6c4009
#define _N_HDROFF(x) (SEGMENT_SIZE - sizeof (struct exec))
Packit 6c4009
#else
Packit 6c4009
#define _N_HDROFF(x) (- sizeof (struct exec))
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if !defined (N_TXTOFF)
Packit 6c4009
#define N_TXTOFF(x) \
Packit 6c4009
 (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : sizeof (struct exec))
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if !defined (N_DATOFF)
Packit 6c4009
#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if !defined (N_TRELOFF)
Packit 6c4009
#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if !defined (N_DRELOFF)
Packit 6c4009
#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if !defined (N_SYMOFF)
Packit 6c4009
#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if !defined (N_STROFF)
Packit 6c4009
#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Address of text segment in memory after it is loaded.  */
Packit 6c4009
#if !defined (N_TXTADDR)
Packit 6c4009
#define N_TXTADDR(x) 0
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Address of data segment in memory after it is loaded.
Packit 6c4009
   Note that it is up to you to define SEGMENT_SIZE
Packit 6c4009
   on machines not listed here.  */
Packit 6c4009
#if	defined (hp300) || defined (mips)
Packit 6c4009
#define	PAGE_SIZE	4096
Packit 6c4009
#endif
Packit 6c4009
#if	defined (sparc) || defined (NeXT)
Packit 6c4009
#define	PAGE_SIZE	0x2000
Packit 6c4009
#endif
Packit 6c4009
#if	defined (sony) || (defined (sun) && defined (mc68000))
Packit 6c4009
#define	SEGMENT_SIZE	0x2000
Packit 6c4009
#endif	/* Sony or 68k Sun.  */
Packit 6c4009
#ifdef is68k
Packit 6c4009
#define SEGMENT_SIZE 0x20000
Packit 6c4009
#endif
Packit 6c4009
#if defined(m68k) && defined(PORTAR)
Packit 6c4009
#define PAGE_SIZE 0x400
Packit 6c4009
#endif
Packit 6c4009
#if defined(i386) && !defined(sequent)
Packit 6c4009
/* For COFF encapsulation.  */
Packit 6c4009
#define SEGMENT_SIZE 0x400000
Packit 6c4009
#endif
Packit 6c4009
#ifndef	SEGMENT_SIZE
Packit 6c4009
/* This used to be first in this paragraph and under:
Packit 6c4009
   if (defined(vax) || defined(hp300) || defined(pyr) || defined(sparc) \
Packit 6c4009
     || (defined(m68k) && defined(PORTAR)) \
Packit 6c4009
     || defined (NeXT) || defined (mips)) */
Packit 6c4009
#define SEGMENT_SIZE PAGE_SIZE
Packit 6c4009
#endif
Packit 6c4009
#ifndef	PAGE_SIZE
Packit 6c4009
/* This value is for i386-minix, but that has no predefine.
Packit 6c4009
   Making it default will only cause confusion on machines
Packit 6c4009
   which have no proper value defined.  */
Packit 6c4009
#define	PAGE_SIZE 16
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#define	PAGSIZ	PAGE_SIZE
Packit 6c4009
#define	SEGSIZ	SEGMENT_SIZE
Packit 6c4009
Packit 6c4009
#define _N_SEGMENT_ROUND(x) (((x) + SEGMENT_SIZE - 1) & ~(SEGMENT_SIZE - 1))
Packit 6c4009
Packit 6c4009
#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text)
Packit 6c4009
Packit 6c4009
#ifndef N_DATADDR
Packit 6c4009
#define N_DATADDR(x) \
Packit 6c4009
    (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \
Packit 6c4009
     : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x))))
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Address of bss segment in memory after it is loaded.  */
Packit 6c4009
#if !defined (N_BSSADDR)
Packit 6c4009
#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data)
Packit 6c4009
#endif
Packit 6c4009

Packit 6c4009
#if !defined (N_NLIST_DECLARED)
Packit 6c4009
struct nlist {
Packit 6c4009
  union {
Packit 6c4009
    char *n_name;
Packit 6c4009
    struct nlist *n_next;
Packit 6c4009
    long n_strx;
Packit 6c4009
  } n_un;
Packit 6c4009
  unsigned char n_type;
Packit 6c4009
  char n_other;
Packit 6c4009
  short n_desc;
Packit 6c4009
  unsigned long n_value;
Packit 6c4009
};
Packit 6c4009
#endif /* no N_NLIST_DECLARED.  */
Packit 6c4009
Packit 6c4009
#if !defined (N_UNDF)
Packit 6c4009
#define N_UNDF 0
Packit 6c4009
#endif
Packit 6c4009
#if !defined (N_ABS)
Packit 6c4009
#define N_ABS 2
Packit 6c4009
#endif
Packit 6c4009
#if !defined (N_TEXT)
Packit 6c4009
#define N_TEXT 4
Packit 6c4009
#endif
Packit 6c4009
#if !defined (N_DATA)
Packit 6c4009
#define N_DATA 6
Packit 6c4009
#endif
Packit 6c4009
#if !defined (N_BSS)
Packit 6c4009
#define N_BSS 8
Packit 6c4009
#endif
Packit 6c4009
#if !defined (N_COMM)
Packit 6c4009
#define N_COMM 18
Packit 6c4009
#endif
Packit 6c4009
#if !defined (N_FN)
Packit 6c4009
#define N_FN 15
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if !defined (N_EXT)
Packit 6c4009
#define N_EXT 1
Packit 6c4009
#endif
Packit 6c4009
#if !defined (N_TYPE)
Packit 6c4009
#define N_TYPE 036
Packit 6c4009
#endif
Packit 6c4009
#if !defined (N_STAB)
Packit 6c4009
#define N_STAB 0340
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* The following type indicates the definition of a symbol as being
Packit 6c4009
   an indirect reference to another symbol.  The other symbol
Packit 6c4009
   appears as an undefined reference, immediately following this symbol.
Packit 6c4009
Packit 6c4009
   Indirection is asymmetrical.  The other symbol's value will be used
Packit 6c4009
   to satisfy requests for the indirect symbol, but not vice versa.
Packit 6c4009
   If the other symbol does not have a definition, libraries will
Packit 6c4009
   be searched to find a definition.  */
Packit 6c4009
#define N_INDR 0xa
Packit 6c4009
Packit 6c4009
/* The following symbols refer to set elements.
Packit 6c4009
   All the N_SET[ATDB] symbols with the same name form one set.
Packit 6c4009
   Space is allocated for the set in the text section, and each set
Packit 6c4009
   element's value is stored into one word of the space.
Packit 6c4009
   The first word of the space is the length of the set (number of elements).
Packit 6c4009
Packit 6c4009
   The address of the set is made into an N_SETV symbol
Packit 6c4009
   whose name is the same as the name of the set.
Packit 6c4009
   This symbol acts like a N_DATA global symbol
Packit 6c4009
   in that it can satisfy undefined external references.  */
Packit 6c4009
Packit 6c4009
/* These appear as input to LD, in a .o file.  */
Packit 6c4009
#define	N_SETA	0x14		/* Absolute set element symbol */
Packit 6c4009
#define	N_SETT	0x16		/* Text set element symbol */
Packit 6c4009
#define	N_SETD	0x18		/* Data set element symbol */
Packit 6c4009
#define	N_SETB	0x1A		/* Bss set element symbol */
Packit 6c4009
Packit 6c4009
/* This is output from LD.  */
Packit 6c4009
#define N_SETV	0x1C		/* Pointer to set vector in data area.  */
Packit 6c4009

Packit 6c4009
#if !defined (N_RELOCATION_INFO_DECLARED)
Packit 6c4009
/* This structure describes a single relocation to be performed.
Packit 6c4009
   The text-relocation section of the file is a vector of these structures,
Packit 6c4009
   all of which apply to the text section.
Packit 6c4009
   Likewise, the data-relocation section applies to the data section.  */
Packit 6c4009
Packit 6c4009
struct relocation_info
Packit 6c4009
{
Packit 6c4009
  /* Address (within segment) to be relocated.  */
Packit 6c4009
  int r_address;
Packit 6c4009
  /* The meaning of r_symbolnum depends on r_extern.  */
Packit 6c4009
  unsigned int r_symbolnum:24;
Packit 6c4009
  /* Nonzero means value is a pc-relative offset
Packit 6c4009
     and it should be relocated for changes in its own address
Packit 6c4009
     as well as for changes in the symbol or section specified.  */
Packit 6c4009
  unsigned int r_pcrel:1;
Packit 6c4009
  /* Length (as exponent of 2) of the field to be relocated.
Packit 6c4009
     Thus, a value of 2 indicates 1<<2 bytes.  */
Packit 6c4009
  unsigned int r_length:2;
Packit 6c4009
  /* 1 => relocate with value of symbol.
Packit 6c4009
          r_symbolnum is the index of the symbol
Packit 6c4009
	  in file's the symbol table.
Packit 6c4009
     0 => relocate with the address of a segment.
Packit 6c4009
          r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS
Packit 6c4009
	  (the N_EXT bit may be set also, but signifies nothing).  */
Packit 6c4009
  unsigned int r_extern:1;
Packit 6c4009
  /* Four bits that aren't used, but when writing an object file
Packit 6c4009
     it is desirable to clear them.  */
Packit 6c4009
  unsigned int r_pad:4;
Packit 6c4009
};
Packit 6c4009
#endif /* no N_RELOCATION_INFO_DECLARED.  */
Packit 6c4009
Packit 6c4009
#ifdef	__cplusplus
Packit 6c4009
}
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#endif /* __A_OUT_GNU_H__ */