Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* IBM RS/6000 "XCOFF" file definitions for BFD.
  2.    Copyright (C) 1990, 1991, 2001, 2010 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.