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