rs6k64.h revision 89857
1/* IBM RS/6000 "XCOFF64" file definitions for BFD. 2 Copyright (C) 2000 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software 16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17*/ 18 19/********************** FILE HEADER **********************/ 20 21struct external_filehdr { 22 char f_magic[2]; /* magic number */ 23 char f_nscns[2]; /* number of sections */ 24 char f_timdat[4]; /* time & date stamp */ 25 char f_symptr[8];/* file pointer to symtab */ 26 char f_opthdr[2]; /* sizeof(optional hdr) */ 27 char f_flags[2]; /* flags */ 28 char f_nsyms[4]; /* number of symtab entries */ 29}; 30 31 /* IBM RS/6000 */ 32#define U803XTOCMAGIC 0757 /* readonly text segments and TOC, XCOFF64 */ 33 34#define BADMAG(x) ((x).f_magic != U803XTOCMAGIC) 35 36#define FILHDR struct external_filehdr 37#define FILHSZ 24 38 39/********************** AOUT "OPTIONAL HEADER" **********************/ 40 41 42typedef struct 43{ 44 unsigned char magic[2]; /* type of file */ 45 unsigned char vstamp[2]; /* version stamp */ 46 unsigned char o_debugger[4]; /* reserved */ 47 unsigned char text_start[8]; /* base of text used for this file */ 48 unsigned char data_start[8]; /* base of data used for this file */ 49 unsigned char o_toc[8]; /* address of TOC */ 50 unsigned char o_snentry[2]; /* section number of entry point */ 51 unsigned char o_sntext[2]; /* section number of .text section */ 52 unsigned char o_sndata[2]; /* section number of .data section */ 53 unsigned char o_sntoc[2]; /* section number of TOC */ 54 unsigned char o_snloader[2]; /* section number of .loader section */ 55 unsigned char o_snbss[2]; /* section number of .bss section */ 56 unsigned char o_algntext[2]; /* .text alignment */ 57 unsigned char o_algndata[2]; /* .data alignment */ 58 unsigned char o_modtype[2]; /* module type (??) */ 59 unsigned char o_cputype[2]; /* cpu type */ 60 unsigned char o_resv2[4]; /* reserved */ 61 unsigned char tsize[8]; /* text size bytes, padded to FW bdry */ 62 unsigned char dsize[8]; /* initialized data " " */ 63 unsigned char bsize[8]; /* uninitialized data " " */ 64 unsigned char entry[8]; /* entry pt. */ 65 unsigned char o_maxstack[8]; /* max stack size (??) */ 66 unsigned char o_maxdata[8]; /* max data size (??) */ 67 unsigned char o_resv3[16]; /* reserved */ 68} 69AOUTHDR; 70 71#define AOUTSZ 120 72#define SMALL_AOUTSZ (0) 73#define AOUTHDRSZ 72 74 75/********************** SECTION HEADER **********************/ 76 77 78struct external_scnhdr { 79 char s_name[8]; /* section name */ 80 char s_paddr[8]; /* physical address, aliased s_nlib */ 81 char s_vaddr[8]; /* virtual address */ 82 char s_size[8]; /* section size */ 83 char s_scnptr[8]; /* file ptr to raw data for section */ 84 char s_relptr[8]; /* file ptr to relocation */ 85 char s_lnnoptr[8]; /* file ptr to line numbers */ 86 char s_nreloc[4]; /* number of relocation entries */ 87 char s_nlnno[4]; /* number of line number entries*/ 88 char s_flags[4]; /* flags */ 89 char s_pad[4]; /* padding */ 90}; 91 92 93#define SCNHDR struct external_scnhdr 94 95#define SCNHSZ 72 96 97/********************** LINE NUMBERS **********************/ 98 99/* 1 line number entry for every "breakpointable" source line in a section. 100 * Line numbers are grouped on a per function basis; first entry in a function 101 * grouping will have l_lnno = 0 and in place of physical address will be the 102 * symbol table index of the function name. 103 */ 104struct external_lineno { 105 union { 106 char l_symndx[4];/* function name symbol index, iff l_lnno == 0*/ 107 char l_paddr[8]; /* (physical) address of line number */ 108 } l_addr; 109 char l_lnno[4]; /* line number */ 110}; 111 112 113#define LINENO struct external_lineno 114 115#define LINESZ 12 116 117 118/********************** SYMBOLS **********************/ 119 120#define E_SYMNMLEN 8 /* # characters in a symbol name */ 121#define E_FILNMLEN 14 /* # characters in a file name */ 122#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ 123 124struct external_syment 125{ 126 char e_value[8]; 127 char e_offset[4]; 128 char e_scnum[2]; 129 char e_type[2]; 130 char e_sclass[1]; 131 char e_numaux[1]; 132}; 133 134 135 136#define N_BTMASK (017) 137#define N_TMASK (060) 138#define N_BTSHFT (4) 139#define N_TSHIFT (2) 140 141 142union external_auxent { 143 144 struct { 145 union { 146 struct { 147 char x_lnno[4]; /* declaration line number */ 148 char x_size[2]; /* str/union/array size */ 149 } x_lnsz; 150 struct { 151 char x_lnnoptr[8];/* ptr to fcn line */ 152 char x_fsize[4]; /* size of function */ 153 char x_endndx[4]; /* entry ndx past block end */ 154 } x_fcn; 155 } x_fcnary; 156 } x_sym; 157 158 union { 159 char x_fname[E_FILNMLEN]; 160 struct { 161 char x_zeroes[4]; 162 char x_offset[4]; 163 char x_pad[6]; 164 unsigned char x_ftype[1]; 165 unsigned char x_resv[2]; 166 } x_n; 167 } x_file; 168 169 struct { 170 char x_exptr[8]; 171 char x_fsize[4]; 172 char x_endndx[4]; 173 char x_pad[1]; 174 } x_except; 175 176 struct { 177 unsigned char x_scnlen_lo[4]; 178 unsigned char x_parmhash[4]; 179 unsigned char x_snhash[2]; 180 unsigned char x_smtyp[1]; 181 unsigned char x_smclas[1]; 182 unsigned char x_scnlen_hi[4]; 183 unsigned char x_pad[1]; 184 } x_csect; 185 186 struct { 187 char x_pad[17]; 188 char x_auxtype[1]; 189 } x_auxtype; 190}; 191 192#define SYMENT struct external_syment 193#define SYMESZ 18 194#define AUXENT union external_auxent 195#define AUXESZ 18 196#define DBXMASK 0x80 /* for dbx storage mask */ 197#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK) 198 199/* Values for auxtype field in XCOFF64, taken from AIX 4.3 sym.h */ 200#define _AUX_EXCEPT 255 201#define _AUX_FCN 254 202#define _AUX_SYM 253 203#define _AUX_FILE 252 204#define _AUX_CSECT 251 205 206 207 208/********************** RELOCATION DIRECTIVES **********************/ 209 210 211struct external_reloc { 212 char r_vaddr[8]; 213 char r_symndx[4]; 214 char r_size[1]; 215 char r_type[1]; 216}; 217 218 219#define RELOC struct external_reloc 220#define RELSZ 14 221 222#define DEFAULT_DATA_SECTION_ALIGNMENT 4 223#define DEFAULT_BSS_SECTION_ALIGNMENT 4 224#define DEFAULT_TEXT_SECTION_ALIGNMENT 4 225/* For new sections we havn't heard of before */ 226#define DEFAULT_SECTION_ALIGNMENT 4 227 228/* The ldhdr structure. This appears at the start of the .loader 229 section. */ 230 231struct external_ldhdr 232{ 233 bfd_byte l_version[4]; 234 bfd_byte l_nsyms[4]; 235 bfd_byte l_nreloc[4]; 236 bfd_byte l_istlen[4]; 237 bfd_byte l_nimpid[4]; 238 bfd_byte l_stlen[4]; 239 bfd_byte l_impoff[8]; 240 bfd_byte l_stoff[8]; 241 bfd_byte l_symoff[8]; 242 bfd_byte l_rldoff[8]; 243}; 244#define LDHDRSZ (56) 245 246struct external_ldsym 247{ 248 bfd_byte l_value[8]; 249 bfd_byte l_offset[4]; 250 bfd_byte l_scnum[2]; 251 bfd_byte l_smtype[1]; 252 bfd_byte l_smclas[1]; 253 bfd_byte l_ifile[4]; 254 bfd_byte l_parm[4]; 255}; 256 257#define LDSYMSZ (24) 258 259struct external_ldrel 260{ 261 bfd_byte l_vaddr[8]; 262 bfd_byte l_rtype[2]; 263 bfd_byte l_rsecnm[2]; 264 bfd_byte l_symndx[4]; 265}; 266 267#define LDRELSZ (16) 268