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