1 /* Generic COFF swapping routines, for BFD. 2 Copyright (C) 1990-2018 Free Software Foundation, Inc. 3 Written by Cygnus Support. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 /* This file contains routines used to swap COFF data. It is a header 23 file because the details of swapping depend on the details of the 24 structures used by each COFF implementation. This is included by 25 coffcode.h, as well as by the ECOFF backend. 26 27 Any file which uses this must first include "coff/internal.h" and 28 "coff/CPU.h". The functions will then be correct for that CPU. */ 29 30 #ifndef GET_FCN_LNNOPTR 31 #define GET_FCN_LNNOPTR(abfd, ext) \ 32 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr) 33 #endif 34 35 #ifndef GET_FCN_ENDNDX 36 #define GET_FCN_ENDNDX(abfd, ext) \ 37 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx) 38 #endif 39 40 #ifndef PUT_FCN_LNNOPTR 41 #define PUT_FCN_LNNOPTR(abfd, in, ext) \ 42 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr) 43 #endif 44 #ifndef PUT_FCN_ENDNDX 45 #define PUT_FCN_ENDNDX(abfd, in, ext) \ 46 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_endndx) 47 #endif 48 #ifndef GET_LNSZ_LNNO 49 #define GET_LNSZ_LNNO(abfd, ext) \ 50 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno) 51 #endif 52 #ifndef GET_LNSZ_SIZE 53 #define GET_LNSZ_SIZE(abfd, ext) \ 54 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size) 55 #endif 56 #ifndef PUT_LNSZ_LNNO 57 #define PUT_LNSZ_LNNO(abfd, in, ext) \ 58 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno) 59 #endif 60 #ifndef PUT_LNSZ_SIZE 61 #define PUT_LNSZ_SIZE(abfd, in, ext) \ 62 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size) 63 #endif 64 #ifndef GET_SCN_SCNLEN 65 #define GET_SCN_SCNLEN(abfd, ext) \ 66 H_GET_32 (abfd, ext->x_scn.x_scnlen) 67 #endif 68 #ifndef GET_SCN_NRELOC 69 #define GET_SCN_NRELOC(abfd, ext) \ 70 H_GET_16 (abfd, ext->x_scn.x_nreloc) 71 #endif 72 #ifndef GET_SCN_NLINNO 73 #define GET_SCN_NLINNO(abfd, ext) \ 74 H_GET_16 (abfd, ext->x_scn.x_nlinno) 75 #endif 76 #ifndef PUT_SCN_SCNLEN 77 #define PUT_SCN_SCNLEN(abfd, in, ext) \ 78 H_PUT_32 (abfd, in, ext->x_scn.x_scnlen) 79 #endif 80 #ifndef PUT_SCN_NRELOC 81 #define PUT_SCN_NRELOC(abfd, in, ext) \ 82 H_PUT_16 (abfd, in, ext->x_scn.x_nreloc) 83 #endif 84 #ifndef PUT_SCN_NLINNO 85 #define PUT_SCN_NLINNO(abfd, in, ext) \ 86 H_PUT_16 (abfd, in, ext->x_scn.x_nlinno) 87 #endif 88 #ifndef GET_LINENO_LNNO 89 #define GET_LINENO_LNNO(abfd, ext) \ 90 H_GET_16 (abfd, ext->l_lnno); 91 #endif 92 #ifndef PUT_LINENO_LNNO 93 #define PUT_LINENO_LNNO(abfd, val, ext) \ 94 H_PUT_16 (abfd, val, ext->l_lnno); 95 #endif 96 97 /* The f_symptr field in the filehdr is sometimes 64 bits. */ 98 #ifndef GET_FILEHDR_SYMPTR 99 #define GET_FILEHDR_SYMPTR H_GET_32 100 #endif 101 #ifndef PUT_FILEHDR_SYMPTR 102 #define PUT_FILEHDR_SYMPTR H_PUT_32 103 #endif 104 105 /* Some fields in the aouthdr are sometimes 64 bits. */ 106 #ifndef GET_AOUTHDR_TSIZE 107 #define GET_AOUTHDR_TSIZE H_GET_32 108 #endif 109 #ifndef PUT_AOUTHDR_TSIZE 110 #define PUT_AOUTHDR_TSIZE H_PUT_32 111 #endif 112 #ifndef GET_AOUTHDR_DSIZE 113 #define GET_AOUTHDR_DSIZE H_GET_32 114 #endif 115 #ifndef PUT_AOUTHDR_DSIZE 116 #define PUT_AOUTHDR_DSIZE H_PUT_32 117 #endif 118 #ifndef GET_AOUTHDR_BSIZE 119 #define GET_AOUTHDR_BSIZE H_GET_32 120 #endif 121 #ifndef PUT_AOUTHDR_BSIZE 122 #define PUT_AOUTHDR_BSIZE H_PUT_32 123 #endif 124 #ifndef GET_AOUTHDR_ENTRY 125 #define GET_AOUTHDR_ENTRY H_GET_32 126 #endif 127 #ifndef PUT_AOUTHDR_ENTRY 128 #define PUT_AOUTHDR_ENTRY H_PUT_32 129 #endif 130 #ifndef GET_AOUTHDR_TEXT_START 131 #define GET_AOUTHDR_TEXT_START H_GET_32 132 #endif 133 #ifndef PUT_AOUTHDR_TEXT_START 134 #define PUT_AOUTHDR_TEXT_START H_PUT_32 135 #endif 136 #ifndef GET_AOUTHDR_DATA_START 137 #define GET_AOUTHDR_DATA_START H_GET_32 138 #endif 139 #ifndef PUT_AOUTHDR_DATA_START 140 #define PUT_AOUTHDR_DATA_START H_PUT_32 141 #endif 142 143 /* Some fields in the scnhdr are sometimes 64 bits. */ 144 #ifndef GET_SCNHDR_PADDR 145 #define GET_SCNHDR_PADDR H_GET_32 146 #endif 147 #ifndef PUT_SCNHDR_PADDR 148 #define PUT_SCNHDR_PADDR H_PUT_32 149 #endif 150 #ifndef GET_SCNHDR_VADDR 151 #define GET_SCNHDR_VADDR H_GET_32 152 #endif 153 #ifndef PUT_SCNHDR_VADDR 154 #define PUT_SCNHDR_VADDR H_PUT_32 155 #endif 156 #ifndef GET_SCNHDR_SIZE 157 #define GET_SCNHDR_SIZE H_GET_32 158 #endif 159 #ifndef PUT_SCNHDR_SIZE 160 #define PUT_SCNHDR_SIZE H_PUT_32 161 #endif 162 #ifndef GET_SCNHDR_SCNPTR 163 #define GET_SCNHDR_SCNPTR H_GET_32 164 #endif 165 #ifndef PUT_SCNHDR_SCNPTR 166 #define PUT_SCNHDR_SCNPTR H_PUT_32 167 #endif 168 #ifndef GET_SCNHDR_RELPTR 169 #define GET_SCNHDR_RELPTR H_GET_32 170 #endif 171 #ifndef PUT_SCNHDR_RELPTR 172 #define PUT_SCNHDR_RELPTR H_PUT_32 173 #endif 174 #ifndef GET_SCNHDR_LNNOPTR 175 #define GET_SCNHDR_LNNOPTR H_GET_32 176 #endif 177 #ifndef PUT_SCNHDR_LNNOPTR 178 #define PUT_SCNHDR_LNNOPTR H_PUT_32 179 #endif 180 #ifndef GET_SCNHDR_NRELOC 181 #define GET_SCNHDR_NRELOC H_GET_16 182 #endif 183 #ifndef MAX_SCNHDR_NRELOC 184 #define MAX_SCNHDR_NRELOC 0xffff 185 #endif 186 #ifndef PUT_SCNHDR_NRELOC 187 #define PUT_SCNHDR_NRELOC H_PUT_16 188 #endif 189 #ifndef GET_SCNHDR_NLNNO 190 #define GET_SCNHDR_NLNNO H_GET_16 191 #endif 192 #ifndef MAX_SCNHDR_NLNNO 193 #define MAX_SCNHDR_NLNNO 0xffff 194 #endif 195 #ifndef PUT_SCNHDR_NLNNO 196 #define PUT_SCNHDR_NLNNO H_PUT_16 197 #endif 198 #ifndef GET_SCNHDR_FLAGS 199 #define GET_SCNHDR_FLAGS H_GET_32 200 #endif 201 #ifndef PUT_SCNHDR_FLAGS 202 #define PUT_SCNHDR_FLAGS H_PUT_32 203 #endif 204 205 #ifndef GET_RELOC_VADDR 206 #define GET_RELOC_VADDR H_GET_32 207 #endif 208 #ifndef PUT_RELOC_VADDR 209 #define PUT_RELOC_VADDR H_PUT_32 210 #endif 211 212 #ifndef NO_COFF_RELOCS 213 214 static void 215 coff_swap_reloc_in (bfd * abfd, void * src, void * dst) 216 { 217 RELOC *reloc_src = (RELOC *) src; 218 struct internal_reloc *reloc_dst = (struct internal_reloc *) dst; 219 220 reloc_dst->r_vaddr = GET_RELOC_VADDR (abfd, reloc_src->r_vaddr); 221 reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx); 222 reloc_dst->r_type = H_GET_16 (abfd, reloc_src->r_type); 223 224 #ifdef SWAP_IN_RELOC_OFFSET 225 reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset); 226 #endif 227 } 228 229 static unsigned int 230 coff_swap_reloc_out (bfd * abfd, void * src, void * dst) 231 { 232 struct internal_reloc *reloc_src = (struct internal_reloc *) src; 233 struct external_reloc *reloc_dst = (struct external_reloc *) dst; 234 235 PUT_RELOC_VADDR (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr); 236 H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx); 237 H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type); 238 239 #ifdef SWAP_OUT_RELOC_OFFSET 240 SWAP_OUT_RELOC_OFFSET (abfd, reloc_src->r_offset, reloc_dst->r_offset); 241 #endif 242 #ifdef SWAP_OUT_RELOC_EXTRA 243 SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst); 244 #endif 245 246 return bfd_coff_relsz (abfd); 247 } 248 249 #endif /* NO_COFF_RELOCS */ 250 251 static void 252 coff_swap_filehdr_in (bfd * abfd, void * src, void * dst) 253 { 254 FILHDR *filehdr_src = (FILHDR *) src; 255 struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst; 256 257 #ifdef COFF_ADJUST_FILEHDR_IN_PRE 258 COFF_ADJUST_FILEHDR_IN_PRE (abfd, src, dst); 259 #endif 260 filehdr_dst->f_magic = H_GET_16 (abfd, filehdr_src->f_magic); 261 filehdr_dst->f_nscns = H_GET_16 (abfd, filehdr_src->f_nscns); 262 filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat); 263 filehdr_dst->f_symptr = GET_FILEHDR_SYMPTR (abfd, filehdr_src->f_symptr); 264 filehdr_dst->f_nsyms = H_GET_32 (abfd, filehdr_src->f_nsyms); 265 filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src->f_opthdr); 266 filehdr_dst->f_flags = H_GET_16 (abfd, filehdr_src->f_flags); 267 #ifdef TIC80_TARGET_ID 268 filehdr_dst->f_target_id = H_GET_16 (abfd, filehdr_src->f_target_id); 269 #endif 270 271 #ifdef COFF_ADJUST_FILEHDR_IN_POST 272 COFF_ADJUST_FILEHDR_IN_POST (abfd, src, dst); 273 #endif 274 } 275 276 static unsigned int 277 coff_swap_filehdr_out (bfd *abfd, void * in, void * out) 278 { 279 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in; 280 FILHDR *filehdr_out = (FILHDR *) out; 281 282 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE 283 COFF_ADJUST_FILEHDR_OUT_PRE (abfd, in, out); 284 #endif 285 H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic); 286 H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns); 287 H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat); 288 PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr); 289 H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms); 290 H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr); 291 H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags); 292 #ifdef TIC80_TARGET_ID 293 H_PUT_16 (abfd, filehdr_in->f_target_id, filehdr_out->f_target_id); 294 #endif 295 296 #ifdef COFF_ADJUST_FILEHDR_OUT_POST 297 COFF_ADJUST_FILEHDR_OUT_POST (abfd, in, out); 298 #endif 299 return bfd_coff_filhsz (abfd); 300 } 301 302 #ifndef NO_COFF_SYMBOLS 303 304 static void 305 coff_swap_sym_in (bfd * abfd, void * ext1, void * in1) 306 { 307 SYMENT *ext = (SYMENT *) ext1; 308 struct internal_syment *in = (struct internal_syment *) in1; 309 310 if (ext->e.e_name[0] == 0) 311 { 312 in->_n._n_n._n_zeroes = 0; 313 in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset); 314 } 315 else 316 { 317 #if SYMNMLEN != E_SYMNMLEN 318 #error we need to cope with truncating or extending SYMNMLEN 319 #else 320 memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN); 321 #endif 322 } 323 324 in->n_value = H_GET_32 (abfd, ext->e_value); 325 in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum); 326 if (sizeof (ext->e_type) == 2) 327 in->n_type = H_GET_16 (abfd, ext->e_type); 328 else 329 in->n_type = H_GET_32 (abfd, ext->e_type); 330 in->n_sclass = H_GET_8 (abfd, ext->e_sclass); 331 in->n_numaux = H_GET_8 (abfd, ext->e_numaux); 332 #ifdef COFF_ADJUST_SYM_IN_POST 333 COFF_ADJUST_SYM_IN_POST (abfd, ext1, in1); 334 #endif 335 } 336 337 static unsigned int 338 coff_swap_sym_out (bfd * abfd, void * inp, void * extp) 339 { 340 struct internal_syment *in = (struct internal_syment *) inp; 341 SYMENT *ext =(SYMENT *) extp; 342 343 #ifdef COFF_ADJUST_SYM_OUT_PRE 344 COFF_ADJUST_SYM_OUT_PRE (abfd, inp, extp); 345 #endif 346 347 if (in->_n._n_name[0] == 0) 348 { 349 H_PUT_32 (abfd, 0, ext->e.e.e_zeroes); 350 H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset); 351 } 352 else 353 { 354 #if SYMNMLEN != E_SYMNMLEN 355 #error we need to cope with truncating or extending SYMNMLEN 356 #else 357 memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN); 358 #endif 359 } 360 361 H_PUT_32 (abfd, in->n_value, ext->e_value); 362 H_PUT_16 (abfd, in->n_scnum, ext->e_scnum); 363 364 if (sizeof (ext->e_type) == 2) 365 H_PUT_16 (abfd, in->n_type, ext->e_type); 366 else 367 H_PUT_32 (abfd, in->n_type, ext->e_type); 368 369 H_PUT_8 (abfd, in->n_sclass, ext->e_sclass); 370 H_PUT_8 (abfd, in->n_numaux, ext->e_numaux); 371 372 #ifdef COFF_ADJUST_SYM_OUT_POST 373 COFF_ADJUST_SYM_OUT_POST (abfd, inp, extp); 374 #endif 375 376 return SYMESZ; 377 } 378 379 static void 380 coff_swap_aux_in (bfd *abfd, 381 void * ext1, 382 int type, 383 int in_class, 384 int indx, 385 int numaux, 386 void * in1) 387 { 388 AUXENT *ext = (AUXENT *) ext1; 389 union internal_auxent *in = (union internal_auxent *) in1; 390 391 #ifdef COFF_ADJUST_AUX_IN_PRE 392 COFF_ADJUST_AUX_IN_PRE (abfd, ext1, type, in_class, indx, numaux, in1); 393 #endif 394 395 switch (in_class) 396 { 397 case C_FILE: 398 if (ext->x_file.x_fname[0] == 0) 399 { 400 in->x_file.x_n.x_zeroes = 0; 401 in->x_file.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset); 402 } 403 else 404 { 405 #if FILNMLEN != E_FILNMLEN 406 #error we need to cope with truncating or extending FILNMLEN 407 #else 408 if (numaux > 1) 409 { 410 if (indx == 0) 411 memcpy (in->x_file.x_fname, ext->x_file.x_fname, 412 numaux * sizeof (AUXENT)); 413 } 414 else 415 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN); 416 #endif 417 } 418 goto end; 419 420 case C_STAT: 421 #ifdef C_LEAFSTAT 422 case C_LEAFSTAT: 423 #endif 424 case C_HIDDEN: 425 if (type == T_NULL) 426 { 427 in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext); 428 in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext); 429 in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext); 430 431 /* PE defines some extra fields; we zero them out for 432 safety. */ 433 in->x_scn.x_checksum = 0; 434 in->x_scn.x_associated = 0; 435 in->x_scn.x_comdat = 0; 436 437 goto end; 438 } 439 break; 440 } 441 442 in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx); 443 #ifndef NO_TVNDX 444 in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx); 445 #endif 446 447 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type) 448 || ISTAG (in_class)) 449 { 450 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext); 451 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext); 452 } 453 else 454 { 455 #if DIMNUM != E_DIMNUM 456 #error we need to cope with truncating or extending DIMNUM 457 #endif 458 in->x_sym.x_fcnary.x_ary.x_dimen[0] = 459 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]); 460 in->x_sym.x_fcnary.x_ary.x_dimen[1] = 461 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]); 462 in->x_sym.x_fcnary.x_ary.x_dimen[2] = 463 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]); 464 in->x_sym.x_fcnary.x_ary.x_dimen[3] = 465 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]); 466 } 467 468 if (ISFCN (type)) 469 in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize); 470 else 471 { 472 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext); 473 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext); 474 } 475 476 end: ; 477 478 #ifdef COFF_ADJUST_AUX_IN_POST 479 COFF_ADJUST_AUX_IN_POST (abfd, ext1, type, in_class, indx, numaux, in1); 480 #endif 481 } 482 483 static unsigned int 484 coff_swap_aux_out (bfd * abfd, 485 void * inp, 486 int type, 487 int in_class, 488 int indx ATTRIBUTE_UNUSED, 489 int numaux ATTRIBUTE_UNUSED, 490 void * extp) 491 { 492 union internal_auxent * in = (union internal_auxent *) inp; 493 AUXENT *ext = (AUXENT *) extp; 494 495 #ifdef COFF_ADJUST_AUX_OUT_PRE 496 COFF_ADJUST_AUX_OUT_PRE (abfd, inp, type, in_class, indx, numaux, extp); 497 #endif 498 499 memset (ext, 0, AUXESZ); 500 501 switch (in_class) 502 { 503 case C_FILE: 504 if (in->x_file.x_fname[0] == 0) 505 { 506 H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes); 507 H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset); 508 } 509 else 510 { 511 #if FILNMLEN != E_FILNMLEN 512 #error we need to cope with truncating or extending FILNMLEN 513 #else 514 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN); 515 #endif 516 } 517 goto end; 518 519 case C_STAT: 520 #ifdef C_LEAFSTAT 521 case C_LEAFSTAT: 522 #endif 523 case C_HIDDEN: 524 if (type == T_NULL) 525 { 526 PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext); 527 PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext); 528 PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext); 529 goto end; 530 } 531 break; 532 } 533 534 H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx); 535 #ifndef NO_TVNDX 536 H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx); 537 #endif 538 539 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type) 540 || ISTAG (in_class)) 541 { 542 PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext); 543 PUT_FCN_ENDNDX (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext); 544 } 545 else 546 { 547 #if DIMNUM != E_DIMNUM 548 #error we need to cope with truncating or extending DIMNUM 549 #endif 550 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0], 551 ext->x_sym.x_fcnary.x_ary.x_dimen[0]); 552 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1], 553 ext->x_sym.x_fcnary.x_ary.x_dimen[1]); 554 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2], 555 ext->x_sym.x_fcnary.x_ary.x_dimen[2]); 556 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3], 557 ext->x_sym.x_fcnary.x_ary.x_dimen[3]); 558 } 559 560 if (ISFCN (type)) 561 H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize); 562 else 563 { 564 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext); 565 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext); 566 } 567 568 end: 569 #ifdef COFF_ADJUST_AUX_OUT_POST 570 COFF_ADJUST_AUX_OUT_POST (abfd, inp, type, in_class, indx, numaux, extp); 571 #endif 572 return AUXESZ; 573 } 574 575 #endif /* NO_COFF_SYMBOLS */ 576 577 #ifndef NO_COFF_LINENOS 578 579 static void 580 coff_swap_lineno_in (bfd * abfd, void * ext1, void * in1) 581 { 582 LINENO *ext = (LINENO *) ext1; 583 struct internal_lineno *in = (struct internal_lineno *) in1; 584 585 in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx); 586 in->l_lnno = GET_LINENO_LNNO (abfd, ext); 587 } 588 589 static unsigned int 590 coff_swap_lineno_out (bfd * abfd, void * inp, void * outp) 591 { 592 struct internal_lineno *in = (struct internal_lineno *) inp; 593 struct external_lineno *ext = (struct external_lineno *) outp; 594 H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx); 595 596 PUT_LINENO_LNNO (abfd, in->l_lnno, ext); 597 return LINESZ; 598 } 599 600 #endif /* NO_COFF_LINENOS */ 601 602 static void 603 coff_swap_aouthdr_in (bfd * abfd, void * aouthdr_ext1, void * aouthdr_int1) 604 { 605 AOUTHDR *aouthdr_ext; 606 struct internal_aouthdr *aouthdr_int; 607 608 aouthdr_ext = (AOUTHDR *) aouthdr_ext1; 609 aouthdr_int = (struct internal_aouthdr *) aouthdr_int1; 610 aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic); 611 aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp); 612 aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize); 613 aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize); 614 aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize); 615 aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry); 616 aouthdr_int->text_start = 617 GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start); 618 aouthdr_int->data_start = 619 GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start); 620 621 #ifdef RS6000COFF_C 622 #ifdef XCOFF64 623 aouthdr_int->o_toc = H_GET_64 (abfd, aouthdr_ext->o_toc); 624 #else 625 aouthdr_int->o_toc = H_GET_32 (abfd, aouthdr_ext->o_toc); 626 #endif 627 aouthdr_int->o_snentry = H_GET_16 (abfd, aouthdr_ext->o_snentry); 628 aouthdr_int->o_sntext = H_GET_16 (abfd, aouthdr_ext->o_sntext); 629 aouthdr_int->o_sndata = H_GET_16 (abfd, aouthdr_ext->o_sndata); 630 aouthdr_int->o_sntoc = H_GET_16 (abfd, aouthdr_ext->o_sntoc); 631 aouthdr_int->o_snloader = H_GET_16 (abfd, aouthdr_ext->o_snloader); 632 aouthdr_int->o_snbss = H_GET_16 (abfd, aouthdr_ext->o_snbss); 633 aouthdr_int->o_algntext = H_GET_16 (abfd, aouthdr_ext->o_algntext); 634 aouthdr_int->o_algndata = H_GET_16 (abfd, aouthdr_ext->o_algndata); 635 aouthdr_int->o_modtype = H_GET_16 (abfd, aouthdr_ext->o_modtype); 636 aouthdr_int->o_cputype = H_GET_16 (abfd, aouthdr_ext->o_cputype); 637 #ifdef XCOFF64 638 aouthdr_int->o_maxstack = H_GET_64 (abfd, aouthdr_ext->o_maxstack); 639 aouthdr_int->o_maxdata = H_GET_64 (abfd, aouthdr_ext->o_maxdata); 640 #else 641 aouthdr_int->o_maxstack = H_GET_32 (abfd, aouthdr_ext->o_maxstack); 642 aouthdr_int->o_maxdata = H_GET_32 (abfd, aouthdr_ext->o_maxdata); 643 #endif 644 #endif 645 646 #ifdef MIPSECOFF 647 aouthdr_int->bss_start = H_GET_32 (abfd, aouthdr_ext->bss_start); 648 aouthdr_int->gp_value = H_GET_32 (abfd, aouthdr_ext->gp_value); 649 aouthdr_int->gprmask = H_GET_32 (abfd, aouthdr_ext->gprmask); 650 aouthdr_int->cprmask[0] = H_GET_32 (abfd, aouthdr_ext->cprmask[0]); 651 aouthdr_int->cprmask[1] = H_GET_32 (abfd, aouthdr_ext->cprmask[1]); 652 aouthdr_int->cprmask[2] = H_GET_32 (abfd, aouthdr_ext->cprmask[2]); 653 aouthdr_int->cprmask[3] = H_GET_32 (abfd, aouthdr_ext->cprmask[3]); 654 #endif 655 656 #ifdef ALPHAECOFF 657 aouthdr_int->bss_start = H_GET_64 (abfd, aouthdr_ext->bss_start); 658 aouthdr_int->gp_value = H_GET_64 (abfd, aouthdr_ext->gp_value); 659 aouthdr_int->gprmask = H_GET_32 (abfd, aouthdr_ext->gprmask); 660 aouthdr_int->fprmask = H_GET_32 (abfd, aouthdr_ext->fprmask); 661 #endif 662 } 663 664 static unsigned int 665 coff_swap_aouthdr_out (bfd * abfd, void * in, void * out) 666 { 667 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in; 668 AOUTHDR *aouthdr_out = (AOUTHDR *) out; 669 670 H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->magic); 671 H_PUT_16 (abfd, aouthdr_in->vstamp, aouthdr_out->vstamp); 672 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->tsize); 673 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->dsize); 674 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->bsize); 675 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->entry); 676 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start, 677 aouthdr_out->text_start); 678 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start, 679 aouthdr_out->data_start); 680 681 #ifdef RS6000COFF_C 682 #ifdef XCOFF64 683 H_PUT_64 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc); 684 #else 685 H_PUT_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc); 686 #endif 687 H_PUT_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry); 688 H_PUT_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext); 689 H_PUT_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata); 690 H_PUT_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc); 691 H_PUT_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader); 692 H_PUT_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss); 693 H_PUT_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext); 694 H_PUT_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata); 695 H_PUT_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype); 696 H_PUT_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype); 697 #ifdef XCOFF64 698 H_PUT_64 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack); 699 H_PUT_64 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata); 700 #else 701 H_PUT_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack); 702 H_PUT_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata); 703 #endif 704 memset (aouthdr_out->o_resv2, 0, sizeof aouthdr_out->o_resv2); 705 #ifdef XCOFF64 706 memset (aouthdr_out->o_debugger, 0, sizeof aouthdr_out->o_debugger); 707 memset (aouthdr_out->o_resv3, 0, sizeof aouthdr_out->o_resv3); 708 #endif 709 #endif 710 711 #ifdef MIPSECOFF 712 H_PUT_32 (abfd, aouthdr_in->bss_start, aouthdr_out->bss_start); 713 H_PUT_32 (abfd, aouthdr_in->gp_value, aouthdr_out->gp_value); 714 H_PUT_32 (abfd, aouthdr_in->gprmask, aouthdr_out->gprmask); 715 H_PUT_32 (abfd, aouthdr_in->cprmask[0], aouthdr_out->cprmask[0]); 716 H_PUT_32 (abfd, aouthdr_in->cprmask[1], aouthdr_out->cprmask[1]); 717 H_PUT_32 (abfd, aouthdr_in->cprmask[2], aouthdr_out->cprmask[2]); 718 H_PUT_32 (abfd, aouthdr_in->cprmask[3], aouthdr_out->cprmask[3]); 719 #endif 720 721 #ifdef ALPHAECOFF 722 /* FIXME: What does bldrev mean? */ 723 H_PUT_16 (abfd, 2, aouthdr_out->bldrev); 724 H_PUT_16 (abfd, 0, aouthdr_out->padding); 725 H_PUT_64 (abfd, aouthdr_in->bss_start, aouthdr_out->bss_start); 726 H_PUT_64 (abfd, aouthdr_in->gp_value, aouthdr_out->gp_value); 727 H_PUT_32 (abfd, aouthdr_in->gprmask, aouthdr_out->gprmask); 728 H_PUT_32 (abfd, aouthdr_in->fprmask, aouthdr_out->fprmask); 729 #endif 730 731 return AOUTSZ; 732 } 733 734 static void 735 coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in) 736 { 737 SCNHDR *scnhdr_ext = (SCNHDR *) ext; 738 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in; 739 740 #ifdef COFF_ADJUST_SCNHDR_IN_PRE 741 COFF_ADJUST_SCNHDR_IN_PRE (abfd, ext, in); 742 #endif 743 memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name)); 744 745 scnhdr_int->s_vaddr = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr); 746 scnhdr_int->s_paddr = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr); 747 scnhdr_int->s_size = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size); 748 749 scnhdr_int->s_scnptr = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr); 750 scnhdr_int->s_relptr = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr); 751 scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr); 752 scnhdr_int->s_flags = GET_SCNHDR_FLAGS (abfd, scnhdr_ext->s_flags); 753 scnhdr_int->s_nreloc = GET_SCNHDR_NRELOC (abfd, scnhdr_ext->s_nreloc); 754 scnhdr_int->s_nlnno = GET_SCNHDR_NLNNO (abfd, scnhdr_ext->s_nlnno); 755 #ifdef COFF_ADJUST_SCNHDR_IN_POST 756 COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in); 757 #endif 758 } 759 760 static unsigned int 761 coff_swap_scnhdr_out (bfd * abfd, void * in, void * out) 762 { 763 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in; 764 SCNHDR *scnhdr_ext = (SCNHDR *) out; 765 unsigned int ret = bfd_coff_scnhsz (abfd); 766 767 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE 768 COFF_ADJUST_SCNHDR_OUT_PRE (abfd, in, out); 769 #endif 770 memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name)); 771 772 PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr, scnhdr_ext->s_vaddr); 773 PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr, scnhdr_ext->s_paddr); 774 PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size, scnhdr_ext->s_size); 775 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr, scnhdr_ext->s_scnptr); 776 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr, scnhdr_ext->s_relptr); 777 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr, scnhdr_ext->s_lnnoptr); 778 PUT_SCNHDR_FLAGS (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags); 779 if (scnhdr_int->s_nlnno <= MAX_SCNHDR_NLNNO) 780 PUT_SCNHDR_NLNNO (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno); 781 else 782 { 783 char buf[sizeof (scnhdr_int->s_name) + 1]; 784 785 memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name)); 786 buf[sizeof (scnhdr_int->s_name)] = '\0'; 787 _bfd_error_handler 788 /* xgettext:c-format */ 789 (_("%pB: warning: %s: line number overflow: 0x%lx > 0xffff"), 790 abfd, buf, scnhdr_int->s_nlnno); 791 PUT_SCNHDR_NLNNO (abfd, 0xffff, scnhdr_ext->s_nlnno); 792 } 793 794 if (scnhdr_int->s_nreloc <= MAX_SCNHDR_NRELOC) 795 PUT_SCNHDR_NRELOC (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc); 796 else 797 { 798 char buf[sizeof (scnhdr_int->s_name) + 1]; 799 800 memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name)); 801 buf[sizeof (scnhdr_int->s_name)] = '\0'; 802 /* xgettext:c-format */ 803 _bfd_error_handler (_("%pB: %s: reloc overflow: 0x%lx > 0xffff"), 804 abfd, buf, scnhdr_int->s_nreloc); 805 bfd_set_error (bfd_error_file_truncated); 806 PUT_SCNHDR_NRELOC (abfd, 0xffff, scnhdr_ext->s_nreloc); 807 ret = 0; 808 } 809 810 #ifdef COFF_ADJUST_SCNHDR_OUT_POST 811 COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out); 812 #endif 813 return ret; 814 } 815