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