Back to index

cell-binutils  2.17cvs20070401
rs6000.h
Go to the documentation of this file.
00001 /* IBM RS/6000 "XCOFF" file definitions for BFD.
00002    Copyright (C) 1990, 1991, 2001 Free Software Foundation, Inc.
00003    FIXME: Can someone provide a transliteration of this name into ASCII?
00004    Using the following chars caused a compiler warning on HIUX (so I replaced
00005    them with octal escapes), and isn't useful without an understanding of what
00006    character set it is.
00007    Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM
00008    and John Gilmore of Cygnus Support.  */
00009 
00010 /********************** FILE HEADER **********************/
00011 
00012 struct external_filehdr {
00013        char f_magic[2];     /* magic number                    */
00014        char f_nscns[2];     /* number of sections              */
00015        char f_timdat[4];    /* time & date stamp        */
00016        char f_symptr[4];    /* file pointer to symtab   */
00017        char f_nsyms[4];     /* number of symtab entries */
00018        char f_opthdr[2];    /* sizeof(optional hdr)            */
00019        char f_flags[2];     /* flags                    */
00020 };
00021 
00022         /* IBM RS/6000 */
00023 #define U802WRMAGIC     0730    /* writeable text segments **chh**      */
00024 #define U802ROMAGIC     0735    /* readonly sharable text segments      */
00025 #define U802TOCMAGIC    0737    /* readonly text segments and TOC       */
00026 
00027 #define BADMAG(x)    \
00028        ((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
00029         (x).f_magic != U802TOCMAGIC)
00030 
00031 #define       FILHDR struct external_filehdr
00032 #define       FILHSZ 20
00033 
00034 
00035 /********************** AOUT "OPTIONAL HEADER" **********************/
00036 
00037 
00038 typedef struct 
00039 {
00040   unsigned char      magic[2];     /* type of file                    */
00041   unsigned char      vstamp[2];    /* version stamp            */
00042   unsigned char      tsize[4];     /* text size in bytes, padded to FW bdry */
00043   unsigned char      dsize[4];     /* initialized data "  "    */
00044   unsigned char      bsize[4];     /* uninitialized data "   " */
00045   unsigned char      entry[4];     /* entry pt.                */
00046   unsigned char      text_start[4];       /* base of text used for this file */
00047   unsigned char      data_start[4];       /* base of data used for this file */
00048   unsigned char      o_toc[4];     /* address of TOC */
00049   unsigned char      o_snentry[2]; /* section number of entry point */
00050   unsigned char      o_sntext[2];  /* section number of .text section */
00051   unsigned char      o_sndata[2];  /* section number of .data section */
00052   unsigned char      o_sntoc[2];   /* section number of TOC */
00053   unsigned char      o_snloader[2];       /* section number of .loader section */
00054   unsigned char      o_snbss[2];   /* section number of .bss section */
00055   unsigned char      o_algntext[2];       /* .text alignment */
00056   unsigned char      o_algndata[2];       /* .data alignment */
00057   unsigned char      o_modtype[2]; /* module type (??) */
00058   unsigned char o_cputype[2];      /* cpu type */
00059   unsigned char      o_maxstack[4];       /* max stack size (??) */
00060   unsigned char o_maxdata[4];      /* max data size (??) */
00061   unsigned char      o_resv2[12];  /* reserved */
00062 }
00063 AOUTHDR;
00064 
00065 #define AOUTSZ 72
00066 #define SMALL_AOUTSZ (28)
00067 #define AOUTHDRSZ 72
00068 
00069 /********************** SECTION HEADER **********************/
00070 
00071 
00072 struct external_scnhdr {
00073        char          s_name[8];    /* section name                    */
00074        char          s_paddr[4];   /* physical address, aliased s_nlib */
00075        char          s_vaddr[4];   /* virtual address          */
00076        char          s_size[4];    /* section size                    */
00077        char          s_scnptr[4];  /* file ptr to raw data for section */
00078        char          s_relptr[4];  /* file ptr to relocation   */
00079        char          s_lnnoptr[4]; /* file ptr to line numbers */
00080        char          s_nreloc[2];  /* number of relocation entries    */
00081        char          s_nlnno[2];   /* number of line number entries*/
00082        char          s_flags[4];   /* flags                    */
00083 };
00084 
00085 #define       SCNHDR struct external_scnhdr
00086 #define       SCNHSZ 40
00087 
00088 /********************** LINE NUMBERS **********************/
00089 
00090 /* 1 line number entry for every "breakpointable" source line in a section.
00091  * Line numbers are grouped on a per function basis; first entry in a function
00092  * grouping will have l_lnno = 0 and in place of physical address will be the
00093  * symbol table index of the function name.
00094  */
00095 struct external_lineno {
00096        union {
00097               char l_symndx[4];    /* function name symbol index, iff l_lnno == 0*/
00098               char l_paddr[4];     /* (physical) address of line number      */
00099        } l_addr;
00100        char l_lnno[2];      /* line number              */
00101 };
00102 
00103 
00104 #define       LINENO struct external_lineno
00105 #define       LINESZ 6
00106 
00107 
00108 /********************** SYMBOLS **********************/
00109 
00110 #define E_SYMNMLEN   8      /* # characters in a symbol name   */
00111 #define E_FILNMLEN   14     /* # characters in a file name            */
00112 #define E_DIMNUM     4      /* # array dimensions in auxiliary entry */
00113 
00114 struct external_syment 
00115 {
00116   union {
00117     char e_name[E_SYMNMLEN];
00118     struct {
00119       char e_zeroes[4];
00120       char e_offset[4];
00121     } e;
00122   } e;
00123   char e_value[4];
00124   char e_scnum[2];
00125   char e_type[2];
00126   char e_sclass[1];
00127   char e_numaux[1];
00128 };
00129 
00130 
00131 
00132 #define N_BTMASK     (017)
00133 #define N_TMASK             (060)
00134 #define N_BTSHFT     (4)
00135 #define N_TSHIFT     (2)
00136   
00137 
00138 union external_auxent {
00139        struct {
00140               char x_tagndx[4];    /* str, un, or enum tag indx */
00141               union {
00142                      struct {
00143                          char  x_lnno[2]; /* declaration line number */
00144                          char  x_size[2]; /* str/union/array size */
00145                      } x_lnsz;
00146                      char x_fsize[4];     /* size of function */
00147               } x_misc;
00148               union {
00149                      struct {             /* if ISFCN, tag, or .bb */
00150                          char x_lnnoptr[4];      /* ptr to fcn line # */
00151                          char x_endndx[4];       /* entry ndx past block end */
00152                      } x_fcn;
00153                      struct {             /* if ISARY, up to 4 dimen. */
00154                          char x_dimen[E_DIMNUM][2];
00155                      } x_ary;
00156               } x_fcnary;
00157               char x_tvndx[2];            /* tv index */
00158        } x_sym;
00159 
00160        union {
00161               char x_fname[E_FILNMLEN];
00162               struct {
00163                      char x_zeroes[4];
00164                      char x_offset[4];
00165               } x_n;
00166        } x_file;
00167 
00168        struct {
00169               char x_scnlen[4];                  /* section length */
00170               char x_nreloc[2];    /* # relocation entries */
00171               char x_nlinno[2];    /* # line numbers */
00172        } x_scn;
00173 
00174         struct {
00175               char x_tvfill[4];    /* tv fill value */
00176               char x_tvlen[2];     /* length of .tv */
00177               char x_tvran[2][2];  /* tv range */
00178        } x_tv;              /* info about .tv section (in auxent of symbol .tv)) */
00179 
00180        struct {
00181               unsigned char x_scnlen[4];
00182               unsigned char x_parmhash[4];
00183               unsigned char x_snhash[2];
00184               unsigned char x_smtyp[1];
00185               unsigned char x_smclas[1];
00186               unsigned char x_stab[4];
00187               unsigned char x_snstab[2];
00188        } x_csect;
00189 
00190 };
00191 
00192 #define       SYMENT struct external_syment
00193 #define       SYMESZ 18     
00194 #define       AUXENT union external_auxent
00195 #define       AUXESZ 18
00196 #define DBXMASK 0x80        /* for dbx storage mask */
00197 #define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
00198 
00199 
00200 
00201 /********************** RELOCATION DIRECTIVES **********************/
00202 
00203 
00204 struct external_reloc {
00205   char r_vaddr[4];
00206   char r_symndx[4];
00207   char r_size[1];
00208   char r_type[1];
00209 };
00210 
00211 
00212 #define RELOC struct external_reloc
00213 #define RELSZ 10
00214 
00215 #define DEFAULT_DATA_SECTION_ALIGNMENT 4
00216 #define DEFAULT_BSS_SECTION_ALIGNMENT 4
00217 #define DEFAULT_TEXT_SECTION_ALIGNMENT 4
00218 /* For new sections we havn't heard of before */
00219 #define DEFAULT_SECTION_ALIGNMENT 4
00220 
00221 /* The ldhdr structure.  This appears at the start of the .loader
00222    section.  */
00223 
00224 struct external_ldhdr
00225 {
00226   bfd_byte l_version[4];
00227   bfd_byte l_nsyms[4];
00228   bfd_byte l_nreloc[4];
00229   bfd_byte l_istlen[4];
00230   bfd_byte l_nimpid[4];
00231   bfd_byte l_impoff[4];
00232   bfd_byte l_stlen[4];
00233   bfd_byte l_stoff[4];
00234 };
00235 
00236 #define LDHDRSZ (8 * 4)
00237 
00238 struct external_ldsym
00239 {
00240   union
00241     {
00242       bfd_byte _l_name[SYMNMLEN];
00243       struct
00244        {
00245          bfd_byte _l_zeroes[4];
00246          bfd_byte _l_offset[4];
00247        } _l_l;
00248     } _l;
00249   bfd_byte l_value[4];
00250   bfd_byte l_scnum[2];
00251   bfd_byte l_smtype[1];
00252   bfd_byte l_smclas[1];
00253   bfd_byte l_ifile[4];
00254   bfd_byte l_parm[4];
00255 };
00256 
00257 #define LDSYMSZ (8 + 3 * 4 + 2 + 2)
00258 
00259 struct external_ldrel
00260 {
00261   bfd_byte l_vaddr[4];
00262   bfd_byte l_symndx[4];
00263   bfd_byte l_rtype[2];
00264   bfd_byte l_rsecnm[2];
00265 };
00266 
00267 #define LDRELSZ (2 * 4 + 2 * 2)