1 /* IBM RS/6000 "XCOFF" file definitions for BFD. 2 Copyright (C) 1990, 1991 Free Software Foundation, Inc. 3 FIXME: Can someone provide a transliteration of this name into ASCII? 4 Using the following chars caused a compiler warning on HIUX (so I replaced 5 them with octal escapes), and isn't useful without an understanding of what 6 character set it is. 7 Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM 8 and John Gilmore of Cygnus Support. */ 9 10 /********************** FILE HEADER **********************/ 11 12 struct external_filehdr { 13 char f_magic[2]; /* magic number */ 14 char f_nscns[2]; /* number of sections */ 15 char f_timdat[4]; /* time & date stamp */ 16 char f_symptr[4]; /* file pointer to symtab */ 17 char f_nsyms[4]; /* number of symtab entries */ 18 char f_opthdr[2]; /* sizeof(optional hdr) */ 19 char f_flags[2]; /* flags */ 20 }; 21 22 /* IBM RS/6000 */ 23 #define U802WRMAGIC 0730 /* writeable text segments **chh** */ 24 #define U802ROMAGIC 0735 /* readonly sharable text segments */ 25 #define U802TOCMAGIC 0737 /* readonly text segments and TOC */ 26 27 #define BADMAG(x) \ 28 ((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \ 29 (x).f_magic != U802TOCMAGIC) 30 31 #define FILHDR struct external_filehdr 32 #define FILHSZ 20 33 34 35 /********************** AOUT "OPTIONAL HEADER" **********************/ 36 37 38 typedef struct 39 { 40 unsigned char magic[2]; /* type of file */ 41 unsigned char vstamp[2]; /* version stamp */ 42 unsigned char tsize[4]; /* text size in bytes, padded to FW bdry */ 43 unsigned char dsize[4]; /* initialized data " " */ 44 unsigned char bsize[4]; /* uninitialized data " " */ 45 unsigned char entry[4]; /* entry pt. */ 46 unsigned char text_start[4]; /* base of text used for this file */ 47 unsigned char data_start[4]; /* base of data used for this file */ 48 unsigned char o_toc[4]; /* address of TOC */ 49 unsigned char o_snentry[2]; /* section number of entry point */ 50 unsigned char o_sntext[2]; /* section number of .text section */ 51 unsigned char o_sndata[2]; /* section number of .data section */ 52 unsigned char o_sntoc[2]; /* section number of TOC */ 53 unsigned char o_snloader[2]; /* section number of .loader section */ 54 unsigned char o_snbss[2]; /* section number of .bss section */ 55 unsigned char o_algntext[2]; /* .text alignment */ 56 unsigned char o_algndata[2]; /* .data alignment */ 57 unsigned char o_modtype[2]; /* module type (??) */ 58 unsigned char o_cputype[2]; /* cpu type */ 59 unsigned char o_maxstack[4]; /* max stack size (??) */ 60 unsigned char o_maxdata[4]; /* max data size (??) */ 61 unsigned char o_resv2[12]; /* reserved */ 62 } 63 AOUTHDR; 64 65 #define AOUTSZ 72 66 #define SMALL_AOUTSZ (28) 67 #define AOUTHDRSZ 72 68 69 /********************** SECTION HEADER **********************/ 70 71 72 struct external_scnhdr { 73 char s_name[8]; /* section name */ 74 char s_paddr[4]; /* physical address, aliased s_nlib */ 75 char s_vaddr[4]; /* virtual address */ 76 char s_size[4]; /* section size */ 77 char s_scnptr[4]; /* file ptr to raw data for section */ 78 char s_relptr[4]; /* file ptr to relocation */ 79 char s_lnnoptr[4]; /* file ptr to line numbers */ 80 char s_nreloc[2]; /* number of relocation entries */ 81 char s_nlnno[2]; /* number of line number entries*/ 82 char s_flags[4]; /* flags */ 83 }; 84 85 #define SCNHDR struct external_scnhdr 86 #define SCNHSZ 40 87 88 /********************** LINE NUMBERS **********************/ 89 90 /* 1 line number entry for every "breakpointable" source line in a section. 91 * Line numbers are grouped on a per function basis; first entry in a function 92 * grouping will have l_lnno = 0 and in place of physical address will be the 93 * symbol table index of the function name. 94 */ 95 struct external_lineno { 96 union { 97 char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ 98 char l_paddr[4]; /* (physical) address of line number */ 99 } l_addr; 100 char l_lnno[2]; /* line number */ 101 }; 102 103 104 #define LINENO struct external_lineno 105 #define LINESZ 6 106 107 108 /********************** SYMBOLS **********************/ 109 110 #define E_SYMNMLEN 8 /* # characters in a symbol name */ 111 #define E_FILNMLEN 14 /* # characters in a file name */ 112 #define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ 113 114 struct external_syment 115 { 116 union { 117 char e_name[E_SYMNMLEN]; 118 struct { 119 char e_zeroes[4]; 120 char e_offset[4]; 121 } e; 122 } e; 123 char e_value[4]; 124 char e_scnum[2]; 125 char e_type[2]; 126 char e_sclass[1]; 127 char e_numaux[1]; 128 }; 129 130 131 132 #define N_BTMASK (017) 133 #define N_TMASK (060) 134 #define N_BTSHFT (4) 135 #define N_TSHIFT (2) 136 137 138 union external_auxent { 139 struct { 140 char x_tagndx[4]; /* str, un, or enum tag indx */ 141 union { 142 struct { 143 char x_lnno[2]; /* declaration line number */ 144 char x_size[2]; /* str/union/array size */ 145 } x_lnsz; 146 char x_fsize[4]; /* size of function */ 147 } x_misc; 148 union { 149 struct { /* if ISFCN, tag, or .bb */ 150 char x_lnnoptr[4]; /* ptr to fcn line # */ 151 char x_endndx[4]; /* entry ndx past block end */ 152 } x_fcn; 153 struct { /* if ISARY, up to 4 dimen. */ 154 char x_dimen[E_DIMNUM][2]; 155 } x_ary; 156 } x_fcnary; 157 char x_tvndx[2]; /* tv index */ 158 } x_sym; 159 160 union { 161 char x_fname[E_FILNMLEN]; 162 struct { 163 char x_zeroes[4]; 164 char x_offset[4]; 165 } x_n; 166 } x_file; 167 168 struct { 169 char x_scnlen[4]; /* section length */ 170 char x_nreloc[2]; /* # relocation entries */ 171 char x_nlinno[2]; /* # line numbers */ 172 } x_scn; 173 174 struct { 175 char x_tvfill[4]; /* tv fill value */ 176 char x_tvlen[2]; /* length of .tv */ 177 char x_tvran[2][2]; /* tv range */ 178 } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ 179 180 struct { 181 unsigned char x_scnlen[4]; 182 unsigned char x_parmhash[4]; 183 unsigned char x_snhash[2]; 184 unsigned char x_smtyp[1]; 185 unsigned char x_smclas[1]; 186 unsigned char x_stab[4]; 187 unsigned char x_snstab[2]; 188 } x_csect; 189 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 200 201 /********************** RELOCATION DIRECTIVES **********************/ 202 203 204 struct external_reloc { 205 char r_vaddr[4]; 206 char r_symndx[4]; 207 char r_size[1]; 208 char r_type[1]; 209 }; 210 211 212 #define RELOC struct external_reloc 213 #define RELSZ 10 214 215 #define DEFAULT_DATA_SECTION_ALIGNMENT 4 216 #define DEFAULT_BSS_SECTION_ALIGNMENT 4 217 #define DEFAULT_TEXT_SECTION_ALIGNMENT 4 218 /* For new sections we havn't heard of before */ 219 #define DEFAULT_SECTION_ALIGNMENT 4 220 221 /* The ldhdr structure. This appears at the start of the .loader 222 section. */ 223 224 struct external_ldhdr 225 { 226 bfd_byte l_version[4]; 227 bfd_byte l_nsyms[4]; 228 bfd_byte l_nreloc[4]; 229 bfd_byte l_istlen[4]; 230 bfd_byte l_nimpid[4]; 231 bfd_byte l_impoff[4]; 232 bfd_byte l_stlen[4]; 233 bfd_byte l_stoff[4]; 234 }; 235 236 #define LDHDRSZ (8 * 4) 237 238 struct external_ldsym 239 { 240 union 241 { 242 bfd_byte _l_name[SYMNMLEN]; 243 struct 244 { 245 bfd_byte _l_zeroes[4]; 246 bfd_byte _l_offset[4]; 247 } _l_l; 248 } _l; 249 bfd_byte l_value[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 (8 + 3 * 4 + 2 + 2) 258 259 struct external_ldrel 260 { 261 bfd_byte l_vaddr[4]; 262 bfd_byte l_symndx[4]; 263 bfd_byte l_rtype[2]; 264 bfd_byte l_rsecnm[2]; 265 }; 266 267 #define LDRELSZ (2 * 4 + 2 * 2) 268