189857Sobrien/* external.h  -- External COFF structures
289857Sobrien
3218822Sdim   Copyright 2001, 2006 Free Software Foundation, Inc.
489857Sobrien
589857Sobrien   This program is free software; you can redistribute it and/or modify
689857Sobrien   it under the terms of the GNU General Public License as published by
789857Sobrien   the Free Software Foundation; either version 2 of the License, or
889857Sobrien   (at your option) any later version.
989857Sobrien
1089857Sobrien   This program is distributed in the hope that it will be useful,
1189857Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1289857Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1389857Sobrien   GNU General Public License for more details.
1489857Sobrien
1589857Sobrien   You should have received a copy of the GNU General Public License
1689857Sobrien   along with this program; if not, write to the Free Software
17218822Sdim   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
1889857Sobrien
1989857Sobrien#ifndef COFF_EXTERNAL_H
2089857Sobrien#define COFF_EXTERNAL_H
2189857Sobrien
2289857Sobrien#ifndef DO_NOT_DEFINE_FILHDR
2389857Sobrien/********************** FILE HEADER **********************/
2489857Sobrien
2589857Sobrienstruct external_filehdr
2689857Sobrien  {
2789857Sobrien    char f_magic[2];	/* magic number			*/
2889857Sobrien    char f_nscns[2];	/* number of sections		*/
2989857Sobrien    char f_timdat[4];	/* time & date stamp		*/
3089857Sobrien    char f_symptr[4];	/* file pointer to symtab	*/
3189857Sobrien    char f_nsyms[4];	/* number of symtab entries	*/
3289857Sobrien    char f_opthdr[2];	/* sizeof(optional hdr)		*/
3389857Sobrien    char f_flags[2];	/* flags			*/
3489857Sobrien  };
3589857Sobrien
3689857Sobrien#define	FILHDR	struct external_filehdr
3789857Sobrien#define	FILHSZ	20
3889857Sobrien#endif
3989857Sobrien
4089857Sobrien#ifndef DO_NOT_DEFINE_AOUTHDR
4189857Sobrien/********************** AOUT "OPTIONAL HEADER" **********************/
4289857Sobrien
4389857Sobrientypedef struct external_aouthdr
4489857Sobrien  {
4589857Sobrien    char magic[2];	/* type of file				*/
4689857Sobrien    char vstamp[2];	/* version stamp			*/
4789857Sobrien    char tsize[4];	/* text size in bytes, padded to FW bdry*/
4889857Sobrien    char dsize[4];	/* initialized data "  "		*/
4989857Sobrien    char bsize[4];	/* uninitialized data "   "		*/
5089857Sobrien    char entry[4];	/* entry pt.				*/
5189857Sobrien    char text_start[4];	/* base of text used for this file 	*/
5289857Sobrien    char data_start[4];	/* base of data used for this file 	*/
53218822Sdim  } ATTRIBUTE_PACKED
5489857SobrienAOUTHDR;
5589857Sobrien
5689857Sobrien#define AOUTHDRSZ 28
5789857Sobrien#define AOUTSZ 28
5889857Sobrien
59218822Sdimtypedef struct external_aouthdr64
60218822Sdim{
61218822Sdim  char magic[2];	/* Type of file.			*/
62218822Sdim  char vstamp[2];	/* Version stamp.			*/
63218822Sdim  char tsize[4];	/* Text size in bytes, padded to FW bdry*/
64218822Sdim  char dsize[4];	/* Initialized data "  ".		*/
65218822Sdim  char bsize[4];	/* Uninitialized data "   ".		*/
66218822Sdim  char entry[4];	/* Entry pt.				*/
67218822Sdim  char text_start[4];	/* Base of text used for this file. 	*/
68218822Sdim}
69218822SdimAOUTHDR64;
70218822Sdim#define AOUTHDRSZ64	24
71218822Sdim
72218822Sdim#endif /* not DO_NOT_DEFINE_AOUTHDR */
73218822Sdim
7489857Sobrien#ifndef DO_NOT_DEFINE_SCNHDR
7589857Sobrien/********************** SECTION HEADER **********************/
7689857Sobrien
7789857Sobrienstruct external_scnhdr
7889857Sobrien  {
7989857Sobrien    char s_name[8];	/* section name				*/
8089857Sobrien    char s_paddr[4];	/* physical address, aliased s_nlib 	*/
8189857Sobrien    char s_vaddr[4];	/* virtual address			*/
8289857Sobrien    char s_size[4];	/* section size				*/
8389857Sobrien    char s_scnptr[4];	/* file ptr to raw data for section 	*/
8489857Sobrien    char s_relptr[4];	/* file ptr to relocation		*/
8589857Sobrien    char s_lnnoptr[4];	/* file ptr to line numbers		*/
8689857Sobrien    char s_nreloc[2];	/* number of relocation entries		*/
8789857Sobrien    char s_nlnno[2];	/* number of line number entries	*/
8889857Sobrien    char s_flags[4];	/* flags				*/
8989857Sobrien  };
9089857Sobrien
9189857Sobrien#define	SCNHDR	struct external_scnhdr
9289857Sobrien#define	SCNHSZ	40
9389857Sobrien
9489857Sobrien/* Names of "special" sections.  */
9589857Sobrien
9689857Sobrien#define _TEXT	 ".text"
9789857Sobrien#define _DATA	 ".data"
9889857Sobrien#define _BSS	 ".bss"
9989857Sobrien#define _COMMENT ".comment"
10089857Sobrien#define _LIB     ".lib"
10189857Sobrien#endif /* not DO_NOT_DEFINE_SCNHDR */
10289857Sobrien
10389857Sobrien#ifndef DO_NOT_DEFINE_LINENO
10489857Sobrien
10589857Sobrien/********************** LINE NUMBERS **********************/
10689857Sobrien
10789857Sobrien#ifndef L_LNNO_SIZE
10889857Sobrien#error  L_LNNO_SIZE needs to be defined
10989857Sobrien#endif
11089857Sobrien
11189857Sobrien/* 1 line number entry for every "breakpointable" source line in a section.
11289857Sobrien   Line numbers are grouped on a per function basis; first entry in a function
11389857Sobrien   grouping will have l_lnno = 0 and in place of physical address will be the
11489857Sobrien   symbol table index of the function name.  */
11589857Sobrienstruct external_lineno
11689857Sobrien{
11789857Sobrien  union
11889857Sobrien  {
11989857Sobrien    char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
12089857Sobrien    char l_paddr[4];	/* (physical) address of line number	*/
12189857Sobrien  } l_addr;
12289857Sobrien
12389857Sobrien  char l_lnno[L_LNNO_SIZE];	/* line number		*/
12489857Sobrien};
12589857Sobrien
12689857Sobrien#define	LINENO	struct external_lineno
12789857Sobrien#define	LINESZ	(4 + L_LNNO_SIZE)
12889857Sobrien
12989857Sobrien#if L_LNNO_SIZE == 4
13089857Sobrien#define GET_LINENO_LNNO(abfd, ext)      H_GET_32 (abfd,      (ext->l_lnno))
13189857Sobrien#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_32 (abfd, val, (ext->l_lnno))
13289857Sobrien#endif
13389857Sobrien#if L_LNNO_SIZE == 2
13489857Sobrien#define GET_LINENO_LNNO(abfd, ext)      H_GET_16 (abfd,      (ext->l_lnno))
13589857Sobrien#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_16 (abfd, val, (ext->l_lnno))
13689857Sobrien#endif
13789857Sobrien
13889857Sobrien#endif /* not DO_NOT_DEFINE_LINENO */
13989857Sobrien
14089857Sobrien#ifndef DO_NOT_DEFINE_SYMENT
14189857Sobrien/********************** SYMBOLS **********************/
14289857Sobrien
14389857Sobrien#define E_SYMNMLEN	8	/* # characters in a symbol name	*/
14489857Sobrien#ifndef E_FILNMLEN
14589857Sobrien#define E_FILNMLEN	14
14689857Sobrien#endif
14789857Sobrien#define E_DIMNUM	4	/* # array dimensions in auxiliary entry */
14889857Sobrien
14989857Sobrienstruct external_syment
15089857Sobrien{
15189857Sobrien  union
15289857Sobrien  {
15389857Sobrien    char e_name[E_SYMNMLEN];
15489857Sobrien
15589857Sobrien    struct
15689857Sobrien    {
15789857Sobrien      char e_zeroes[4];
15889857Sobrien      char e_offset[4];
15989857Sobrien    } e;
16089857Sobrien  } e;
16189857Sobrien
16289857Sobrien  char e_value[4];
16389857Sobrien  char e_scnum[2];
16489857Sobrien  char e_type[2];
16589857Sobrien  char e_sclass[1];
16689857Sobrien  char e_numaux[1];
167218822Sdim} ATTRIBUTE_PACKED ;
16889857Sobrien
16989857Sobrien#define	SYMENT	struct external_syment
17089857Sobrien#define	SYMESZ	18
17189857Sobrien
17289857Sobrien#ifndef N_BTMASK
17389857Sobrien#define N_BTMASK	0xf
17489857Sobrien#endif
17589857Sobrien
17689857Sobrien#ifndef N_TMASK
17789857Sobrien#define N_TMASK		0x30
17889857Sobrien#endif
17989857Sobrien
18089857Sobrien#ifndef N_BTSHFT
18189857Sobrien#define N_BTSHFT	4
18289857Sobrien#endif
18389857Sobrien
18489857Sobrien#ifndef N_TSHIFT
18589857Sobrien#define N_TSHIFT	2
18689857Sobrien#endif
18789857Sobrien
18889857Sobrien#endif /* not DO_NOT_DEFINE_SYMENT */
18989857Sobrien
19089857Sobrien#ifndef DO_NOT_DEFINE_AUXENT
19189857Sobrien
19289857Sobrienunion external_auxent
19389857Sobrien{
19489857Sobrien  struct
19589857Sobrien  {
19689857Sobrien    char x_tagndx[4];		/* str, un, or enum tag indx */
19789857Sobrien
19889857Sobrien    union
19989857Sobrien    {
20089857Sobrien      struct
20189857Sobrien      {
20289857Sobrien	char  x_lnno[2]; /* declaration line number */
20389857Sobrien	char  x_size[2]; /* str/union/array size */
20489857Sobrien      } x_lnsz;
20589857Sobrien
20689857Sobrien      char x_fsize[4];	/* size of function */
20789857Sobrien
20889857Sobrien    } x_misc;
20989857Sobrien
21089857Sobrien    union
21189857Sobrien    {
21289857Sobrien      struct 		/* if ISFCN, tag, or .bb */
21389857Sobrien      {
21489857Sobrien	char x_lnnoptr[4];	/* ptr to fcn line # */
21589857Sobrien	char x_endndx[4];	/* entry ndx past block end */
21689857Sobrien      } x_fcn;
21789857Sobrien
21889857Sobrien      struct 		/* if ISARY, up to 4 dimen. */
21989857Sobrien      {
22089857Sobrien	char x_dimen[E_DIMNUM][2];
22189857Sobrien      } x_ary;
22289857Sobrien
22389857Sobrien    } x_fcnary;
22489857Sobrien
22589857Sobrien    char x_tvndx[2];	/* tv index */
22689857Sobrien
22789857Sobrien  } x_sym;
22889857Sobrien
22989857Sobrien  union
23089857Sobrien  {
23189857Sobrien    char x_fname[E_FILNMLEN];
23289857Sobrien
23389857Sobrien    struct
23489857Sobrien    {
23589857Sobrien      char x_zeroes[4];
23689857Sobrien      char x_offset[4];
23789857Sobrien    } x_n;
23889857Sobrien
23989857Sobrien  } x_file;
24089857Sobrien
24189857Sobrien  struct
24289857Sobrien  {
24389857Sobrien    char x_scnlen[4];	/* section length */
24489857Sobrien    char x_nreloc[2];	/* # relocation entries */
24589857Sobrien    char x_nlinno[2];	/* # line numbers */
24689857Sobrien#ifdef INCLUDE_COMDAT_FIELDS_IN_AUXENT
24789857Sobrien    char x_checksum[4];		   /* section COMDAT checksum	      */
24889857Sobrien    char x_associated[2];	   /* COMDAT associated section index */
24989857Sobrien    char x_comdat[1];		   /* COMDAT selection number	      */
25089857Sobrien#endif
25189857Sobrien  } x_scn;
25289857Sobrien
25389857Sobrien  struct
25489857Sobrien  {
25589857Sobrien    char x_tvfill[4];	/* tv fill value */
25689857Sobrien    char x_tvlen[2];	/* length of .tv */
25789857Sobrien    char x_tvran[2][2];	/* tv range */
25889857Sobrien  } x_tv;		/* info about .tv section (in auxent of symbol .tv)) */
259218822Sdim} ATTRIBUTE_PACKED ;
26089857Sobrien
26189857Sobrien#define	AUXENT	union external_auxent
26289857Sobrien#define	AUXESZ	18
26389857Sobrien
26489857Sobrien#define _ETEXT	"etext"
26589857Sobrien
26689857Sobrien#endif /* not DO_NOT_DEFINE_AUXENT */
26789857Sobrien
26889857Sobrien#endif /* COFF_EXTERNAL_H */
269