Home | History | Annotate | Download | only in coff
      1 /* IBM RS/6000 "XCOFF" file definitions for BFD.
      2    Copyright (C) 1990-2016 Free Software Foundation, Inc.
      3    Written by Mimi Phuong-Thao Vo of IBM
      4    and John Gilmore of Cygnus Support.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 /********************** FILE HEADER **********************/
     22 
     23 struct external_filehdr {
     24 	char f_magic[2];	/* magic number			*/
     25 	char f_nscns[2];	/* number of sections		*/
     26 	char f_timdat[4];	/* time & date stamp		*/
     27 	char f_symptr[4];	/* file pointer to symtab	*/
     28 	char f_nsyms[4];	/* number of symtab entries	*/
     29 	char f_opthdr[2];	/* sizeof(optional hdr)		*/
     30 	char f_flags[2];	/* flags			*/
     31 };
     32 
     33         /* IBM RS/6000 */
     34 #define U802WRMAGIC     0730    /* writeable text segments **chh**      */
     35 #define U802ROMAGIC     0735    /* readonly sharable text segments      */
     36 #define U802TOCMAGIC    0737    /* readonly text segments and TOC       */
     37 
     38 #define BADMAG(x)	\
     39 	((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
     40 	 (x).f_magic != U802TOCMAGIC)
     41 
     42 #define	FILHDR	struct external_filehdr
     43 #define	FILHSZ	20
     44 
     45 
     46 /********************** AOUT "OPTIONAL HEADER" **********************/
     47 
     48 
     49 typedef struct
     50 {
     51   unsigned char	magic[2];	/* type of file			*/
     52   unsigned char	vstamp[2];	/* version stamp		*/
     53   unsigned char	tsize[4];	/* text size in bytes, padded to FW bdry */
     54   unsigned char	dsize[4];	/* initialized data "  "	*/
     55   unsigned char	bsize[4];	/* uninitialized data "   "	*/
     56   unsigned char	entry[4];	/* entry pt.			*/
     57   unsigned char	text_start[4];	/* base of text used for this file */
     58   unsigned char	data_start[4];	/* base of data used for this file */
     59   unsigned char	o_toc[4];	/* address of TOC */
     60   unsigned char	o_snentry[2];	/* section number of entry point */
     61   unsigned char	o_sntext[2];	/* section number of .text section */
     62   unsigned char	o_sndata[2];	/* section number of .data section */
     63   unsigned char	o_sntoc[2];	/* section number of TOC */
     64   unsigned char	o_snloader[2];	/* section number of .loader section */
     65   unsigned char	o_snbss[2];	/* section number of .bss section */
     66   unsigned char	o_algntext[2];	/* .text alignment */
     67   unsigned char	o_algndata[2];	/* .data alignment */
     68   unsigned char	o_modtype[2];	/* module type (??) */
     69   unsigned char o_cputype[2];	/* cpu type */
     70   unsigned char	o_maxstack[4];	/* max stack size (??) */
     71   unsigned char o_maxdata[4];	/* max data size (??) */
     72   unsigned char	o_resv2[12];	/* reserved */
     73 }
     74 AOUTHDR;
     75 
     76 #define AOUTSZ 72
     77 #define SMALL_AOUTSZ (28)
     78 #define AOUTHDRSZ 72
     79 
     80 /********************** SECTION HEADER **********************/
     81 
     82 
     83 struct external_scnhdr {
     84 	char		s_name[8];	/* section name			*/
     85 	char		s_paddr[4];	/* physical address, aliased s_nlib */
     86 	char		s_vaddr[4];	/* virtual address		*/
     87 	char		s_size[4];	/* section size			*/
     88 	char		s_scnptr[4];	/* file ptr to raw data for section */
     89 	char		s_relptr[4];	/* file ptr to relocation	*/
     90 	char		s_lnnoptr[4];	/* file ptr to line numbers	*/
     91 	char		s_nreloc[2];	/* number of relocation entries	*/
     92 	char		s_nlnno[2];	/* number of line number entries*/
     93 	char		s_flags[4];	/* flags			*/
     94 };
     95 
     96 #define	SCNHDR	struct external_scnhdr
     97 #define	SCNHSZ	40
     98 
     99 /********************** LINE NUMBERS **********************/
    100 
    101 /* 1 line number entry for every "breakpointable" source line in a section.
    102  * Line numbers are grouped on a per function basis; first entry in a function
    103  * grouping will have l_lnno = 0 and in place of physical address will be the
    104  * symbol table index of the function name.
    105  */
    106 struct external_lineno {
    107 	union {
    108 		char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
    109 		char l_paddr[4];	/* (physical) address of line number	*/
    110 	} l_addr;
    111 	char l_lnno[2];	/* line number		*/
    112 };
    113 
    114 
    115 #define	LINENO	struct external_lineno
    116 #define	LINESZ	6
    117 
    118 
    119 /********************** SYMBOLS **********************/
    120 
    121 #define E_SYMNMLEN	8	/* # characters in a symbol name	*/
    122 #define E_FILNMLEN	14	/* # characters in a file name		*/
    123 #define E_DIMNUM	4	/* # array dimensions in auxiliary entry */
    124 
    125 struct external_syment
    126 {
    127   union {
    128     char e_name[E_SYMNMLEN];
    129     struct {
    130       char e_zeroes[4];
    131       char e_offset[4];
    132     } e;
    133   } e;
    134   char e_value[4];
    135   char e_scnum[2];
    136   char e_type[2];
    137   char e_sclass[1];
    138   char e_numaux[1];
    139 };
    140 
    141 
    142 
    143 #define N_BTMASK	(017)
    144 #define N_TMASK		(060)
    145 #define N_BTSHFT	(4)
    146 #define N_TSHIFT	(2)
    147 
    148 
    149 union external_auxent {
    150 	struct {
    151 		char x_tagndx[4];	/* str, un, or enum tag indx */
    152 		union {
    153 			struct {
    154 			    char  x_lnno[2]; /* declaration line number */
    155 			    char  x_size[2]; /* str/union/array size */
    156 			} x_lnsz;
    157 			char x_fsize[4];	/* size of function */
    158 		} x_misc;
    159 		union {
    160 			struct {		/* if ISFCN, tag, or .bb */
    161 			    char x_lnnoptr[4];	/* ptr to fcn line # */
    162 			    char x_endndx[4];	/* entry ndx past block end */
    163 			} x_fcn;
    164 			struct {		/* if ISARY, up to 4 dimen. */
    165 			    char x_dimen[E_DIMNUM][2];
    166 			} x_ary;
    167 		} x_fcnary;
    168 		char x_tvndx[2];		/* tv index */
    169 	} x_sym;
    170 
    171         struct {
    172                 union {
    173                         char x_fname[E_FILNMLEN];
    174                         struct {
    175                                 char x_zeroes[4];
    176                                 char x_offset[4];
    177                         } x_n;
    178                 } x_n;
    179                 char x_ftype[1];
    180         } x_file;
    181 
    182 	struct {
    183 		char x_scnlen[4];			/* section length */
    184 		char x_nreloc[2];	/* # relocation entries */
    185 		char x_nlinno[2];	/* # line numbers */
    186 	} x_scn;
    187 
    188         struct {
    189 		char x_tvfill[4];	/* tv fill value */
    190 		char x_tvlen[2];	/* length of .tv */
    191 		char x_tvran[2][2];	/* tv range */
    192 	} x_tv;		/* info about .tv section (in auxent of symbol .tv)) */
    193 
    194 	struct {
    195 		unsigned char x_scnlen[4];
    196 		unsigned char x_parmhash[4];
    197 		unsigned char x_snhash[2];
    198 		unsigned char x_smtyp[1];
    199 		unsigned char x_smclas[1];
    200 		unsigned char x_stab[4];
    201 		unsigned char x_snstab[2];
    202 	} x_csect;
    203 
    204 };
    205 
    206 #define	SYMENT	struct external_syment
    207 #define	SYMESZ	18
    208 #define	AUXENT	union external_auxent
    209 #define	AUXESZ	18
    210 #define DBXMASK 0x80		/* for dbx storage mask */
    211 #define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
    212 
    213 
    214 
    215 /********************** RELOCATION DIRECTIVES **********************/
    216 
    217 
    218 struct external_reloc {
    219   char r_vaddr[4];
    220   char r_symndx[4];
    221   char r_size[1];
    222   char r_type[1];
    223 };
    224 
    225 
    226 #define RELOC struct external_reloc
    227 #define RELSZ 10
    228 
    229 #define DEFAULT_DATA_SECTION_ALIGNMENT 4
    230 #define DEFAULT_BSS_SECTION_ALIGNMENT 4
    231 #define DEFAULT_TEXT_SECTION_ALIGNMENT 4
    232 /* For new sections we havn't heard of before */
    233 #define DEFAULT_SECTION_ALIGNMENT 4
    234 
    235 /* The ldhdr structure.  This appears at the start of the .loader
    236    section.  */
    237 
    238 struct external_ldhdr
    239 {
    240   bfd_byte l_version[4];
    241   bfd_byte l_nsyms[4];
    242   bfd_byte l_nreloc[4];
    243   bfd_byte l_istlen[4];
    244   bfd_byte l_nimpid[4];
    245   bfd_byte l_impoff[4];
    246   bfd_byte l_stlen[4];
    247   bfd_byte l_stoff[4];
    248 };
    249 
    250 #define LDHDRSZ (8 * 4)
    251 
    252 struct external_ldsym
    253 {
    254   union
    255     {
    256       bfd_byte _l_name[E_SYMNMLEN];
    257       struct
    258 	{
    259 	  bfd_byte _l_zeroes[4];
    260 	  bfd_byte _l_offset[4];
    261 	} _l_l;
    262     } _l;
    263   bfd_byte l_value[4];
    264   bfd_byte l_scnum[2];
    265   bfd_byte l_smtype[1];
    266   bfd_byte l_smclas[1];
    267   bfd_byte l_ifile[4];
    268   bfd_byte l_parm[4];
    269 };
    270 
    271 #define LDSYMSZ (8 + 3 * 4 + 2 + 2)
    272 
    273 struct external_ldrel
    274 {
    275   bfd_byte l_vaddr[4];
    276   bfd_byte l_symndx[4];
    277   bfd_byte l_rtype[2];
    278   bfd_byte l_rsecnm[2];
    279 };
    280 
    281 #define LDRELSZ (2 * 4 + 2 * 2)
    282 
    283 struct external_exceptab
    284 {
    285   union {
    286     bfd_byte e_symndx[4];
    287     bfd_byte e_paddr[4];
    288   } e_addr;
    289   bfd_byte e_lang[1];
    290   bfd_byte e_reason[1];
    291 };
    292 
    293 #define EXCEPTSZ (4 + 2)
    294 
    295 /******************** Core files *************************/
    296 
    297 struct external_core_dumpx
    298 {
    299   unsigned char c_signo[1];
    300   unsigned char c_flag[1];
    301   unsigned char c_entries[2];
    302 
    303   unsigned char c_version[4];
    304 
    305   unsigned char c_fdsinfox[8];
    306   unsigned char c_loader[8];
    307   unsigned char c_lsize[8];
    308 
    309   unsigned char c_n_thr[4];
    310   unsigned char c_reserved0[4];
    311   unsigned char c_thr[8];
    312 
    313   unsigned char c_segs[8];
    314   unsigned char c_segregion[8];
    315 
    316   unsigned char c_stack[8];
    317   unsigned char c_stackorg[8];
    318   unsigned char c_size[8];
    319 
    320   unsigned char c_data[8];
    321   unsigned char c_dataorg[8];
    322   unsigned char c_datasize[8];
    323   unsigned char c_sdorg[8];
    324   unsigned char c_sdsize[8];
    325 
    326   unsigned char c_vmmregions[8];
    327   unsigned char c_vmm[8];
    328 
    329   unsigned char c_impl[4];
    330   unsigned char c_pad[4];
    331   unsigned char c_cprs[8];
    332   unsigned char c_reserved[7 * 8];
    333 
    334   /* Followed by:
    335      - context of the faulting thread.
    336      - user structure.  */
    337 };
    338 
    339 
    340 /* Core file verion.  */
    341 #define CORE_DUMPX_VERSION 0x0feeddb1
    342 #define CORE_DUMPXX_VERSION 0x0feeddb2
    343 
    344 struct external_ld_info32
    345 {
    346   unsigned char ldinfo_next[4];
    347   unsigned char core_offset[4];
    348   unsigned char ldinfo_textorg[4];
    349   unsigned char ldinfo_textsize[4];
    350   unsigned char ldinfo_dataorg[4];
    351   unsigned char ldinfo_datasize[4];
    352   unsigned char ldinfo_filename[2];
    353 };
    354