1 /* Generic ECOFF (Extended-COFF) routines. 2 Copyright (C) 1990-2016 Free Software Foundation, Inc. 3 Original version by Per Bothner. 4 Full support added by Ian Lance Taylor, ian@cygnus.com. 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 3 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., 51 Franklin Street - Fifth Floor, Boston, 21 MA 02110-1301, USA. */ 22 23 #include "sysdep.h" 24 #include "bfd.h" 25 #include "bfdlink.h" 26 #include "libbfd.h" 27 #include "aout/ar.h" 28 #include "aout/stab_gnu.h" 29 30 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines 31 some other stuff which we don't want and which conflicts with stuff 32 we do want. */ 33 #include "libaout.h" 34 #include "aout/aout64.h" 35 #undef N_ABS 36 #undef exec_hdr 37 #undef obj_sym_filepos 38 39 #include "coff/internal.h" 40 #include "coff/sym.h" 41 #include "coff/symconst.h" 42 #include "coff/ecoff.h" 43 #include "libcoff.h" 44 #include "libecoff.h" 45 #include "libiberty.h" 46 47 #define streq(a, b) (strcmp ((a), (b)) == 0) 48 #define strneq(a, b, n) (strncmp ((a), (b), (n)) == 0) 49 50 51 /* This stuff is somewhat copied from coffcode.h. */ 52 static asection bfd_debug_section = 53 { 54 /* name, id, index, next, prev, flags, user_set_vma, */ 55 "*DEBUG*", 0, 0, NULL, NULL, 0, 0, 56 /* linker_mark, linker_has_input, gc_mark, compress_status, */ 57 0, 0, 1, 0, 58 /* segment_mark, sec_info_type, use_rela_p, */ 59 0, 0, 0, 60 /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */ 61 0, 0, 0, 0, 0, 0, 62 /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */ 63 0, 0, 0, 0, 0, 0, 0, 64 /* output_offset, output_section, alignment_power, */ 65 0, NULL, 0, 66 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */ 67 NULL, NULL, 0, 0, 0, 68 /* line_filepos, userdata, contents, lineno, lineno_count, */ 69 0, NULL, NULL, NULL, 0, 70 /* entsize, kept_section, moving_line_filepos, */ 71 0, NULL, 0, 72 /* target_index, used_by_bfd, constructor_chain, owner, */ 73 0, NULL, NULL, NULL, 74 /* symbol, */ 75 NULL, 76 /* symbol_ptr_ptr, */ 77 NULL, 78 /* map_head, map_tail */ 79 { NULL }, { NULL } 80 }; 81 82 /* Create an ECOFF object. */ 83 84 bfd_boolean 85 _bfd_ecoff_mkobject (bfd *abfd) 86 { 87 bfd_size_type amt = sizeof (ecoff_data_type); 88 89 abfd->tdata.ecoff_obj_data = (struct ecoff_tdata *) bfd_zalloc (abfd, amt); 90 if (abfd->tdata.ecoff_obj_data == NULL) 91 return FALSE; 92 93 return TRUE; 94 } 95 96 /* This is a hook called by coff_real_object_p to create any backend 97 specific information. */ 98 99 void * 100 _bfd_ecoff_mkobject_hook (bfd *abfd, void * filehdr, void * aouthdr) 101 { 102 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; 103 struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr; 104 ecoff_data_type *ecoff; 105 106 if (! _bfd_ecoff_mkobject (abfd)) 107 return NULL; 108 109 ecoff = ecoff_data (abfd); 110 ecoff->gp_size = 8; 111 ecoff->sym_filepos = internal_f->f_symptr; 112 113 if (internal_a != NULL) 114 { 115 int i; 116 117 ecoff->text_start = internal_a->text_start; 118 ecoff->text_end = internal_a->text_start + internal_a->tsize; 119 ecoff->gp = internal_a->gp_value; 120 ecoff->gprmask = internal_a->gprmask; 121 for (i = 0; i < 4; i++) 122 ecoff->cprmask[i] = internal_a->cprmask[i]; 123 ecoff->fprmask = internal_a->fprmask; 124 if (internal_a->magic == ECOFF_AOUT_ZMAGIC) 125 abfd->flags |= D_PAGED; 126 else 127 abfd->flags &=~ D_PAGED; 128 } 129 130 /* It turns out that no special action is required by the MIPS or 131 Alpha ECOFF backends. They have different information in the 132 a.out header, but we just copy it all (e.g., gprmask, cprmask and 133 fprmask) and let the swapping routines ensure that only relevant 134 information is written out. */ 135 136 return (void *) ecoff; 137 } 138 139 /* Initialize a new section. */ 140 141 bfd_boolean 142 _bfd_ecoff_new_section_hook (bfd *abfd, asection *section) 143 { 144 unsigned int i; 145 static struct 146 { 147 const char * name; 148 flagword flags; 149 } 150 section_flags [] = 151 { 152 { _TEXT, SEC_ALLOC | SEC_CODE | SEC_LOAD }, 153 { _INIT, SEC_ALLOC | SEC_CODE | SEC_LOAD }, 154 { _FINI, SEC_ALLOC | SEC_CODE | SEC_LOAD }, 155 { _DATA, SEC_ALLOC | SEC_DATA | SEC_LOAD }, 156 { _SDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD }, 157 { _RDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, 158 { _LIT8, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, 159 { _LIT4, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, 160 { _RCONST, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, 161 { _PDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, 162 { _BSS, SEC_ALLOC}, 163 { _SBSS, SEC_ALLOC}, 164 /* An Irix 4 shared libary. */ 165 { _LIB, SEC_COFF_SHARED_LIBRARY} 166 }; 167 168 section->alignment_power = 4; 169 170 for (i = 0; i < ARRAY_SIZE (section_flags); i++) 171 if (streq (section->name, section_flags[i].name)) 172 { 173 section->flags |= section_flags[i].flags; 174 break; 175 } 176 177 178 /* Probably any other section name is SEC_NEVER_LOAD, but I'm 179 uncertain about .init on some systems and I don't know how shared 180 libraries work. */ 181 182 return _bfd_generic_new_section_hook (abfd, section); 183 } 184 185 /* Determine the machine architecture and type. This is called from 186 the generic COFF routines. It is the inverse of ecoff_get_magic, 187 below. This could be an ECOFF backend routine, with one version 188 for each target, but there aren't all that many ECOFF targets. */ 189 190 bfd_boolean 191 _bfd_ecoff_set_arch_mach_hook (bfd *abfd, void * filehdr) 192 { 193 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; 194 enum bfd_architecture arch; 195 unsigned long mach; 196 197 switch (internal_f->f_magic) 198 { 199 case MIPS_MAGIC_1: 200 case MIPS_MAGIC_LITTLE: 201 case MIPS_MAGIC_BIG: 202 arch = bfd_arch_mips; 203 mach = bfd_mach_mips3000; 204 break; 205 206 case MIPS_MAGIC_LITTLE2: 207 case MIPS_MAGIC_BIG2: 208 /* MIPS ISA level 2: the r6000. */ 209 arch = bfd_arch_mips; 210 mach = bfd_mach_mips6000; 211 break; 212 213 case MIPS_MAGIC_LITTLE3: 214 case MIPS_MAGIC_BIG3: 215 /* MIPS ISA level 3: the r4000. */ 216 arch = bfd_arch_mips; 217 mach = bfd_mach_mips4000; 218 break; 219 220 case ALPHA_MAGIC: 221 arch = bfd_arch_alpha; 222 mach = 0; 223 break; 224 225 default: 226 arch = bfd_arch_obscure; 227 mach = 0; 228 break; 229 } 230 231 return bfd_default_set_arch_mach (abfd, arch, mach); 232 } 233 234 bfd_boolean 235 _bfd_ecoff_no_long_sections (bfd *abfd, int enable) 236 { 237 (void) abfd; 238 (void) enable; 239 return FALSE; 240 } 241 242 /* Get the magic number to use based on the architecture and machine. 243 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */ 244 245 static int 246 ecoff_get_magic (bfd *abfd) 247 { 248 int big, little; 249 250 switch (bfd_get_arch (abfd)) 251 { 252 case bfd_arch_mips: 253 switch (bfd_get_mach (abfd)) 254 { 255 default: 256 case 0: 257 case bfd_mach_mips3000: 258 big = MIPS_MAGIC_BIG; 259 little = MIPS_MAGIC_LITTLE; 260 break; 261 262 case bfd_mach_mips6000: 263 big = MIPS_MAGIC_BIG2; 264 little = MIPS_MAGIC_LITTLE2; 265 break; 266 267 case bfd_mach_mips4000: 268 big = MIPS_MAGIC_BIG3; 269 little = MIPS_MAGIC_LITTLE3; 270 break; 271 } 272 273 return bfd_big_endian (abfd) ? big : little; 274 275 case bfd_arch_alpha: 276 return ALPHA_MAGIC; 277 278 default: 279 abort (); 280 return 0; 281 } 282 } 283 284 /* Get the section s_flags to use for a section. */ 285 286 static long 287 ecoff_sec_to_styp_flags (const char *name, flagword flags) 288 { 289 unsigned int i; 290 static struct 291 { 292 const char * name; 293 long flags; 294 } 295 styp_flags [] = 296 { 297 { _TEXT, STYP_TEXT }, 298 { _DATA, STYP_DATA }, 299 { _SDATA, STYP_SDATA }, 300 { _RDATA, STYP_RDATA }, 301 { _LITA, STYP_LITA }, 302 { _LIT8, STYP_LIT8 }, 303 { _LIT4, STYP_LIT4 }, 304 { _BSS, STYP_BSS }, 305 { _SBSS, STYP_SBSS }, 306 { _INIT, STYP_ECOFF_INIT }, 307 { _FINI, STYP_ECOFF_FINI }, 308 { _PDATA, STYP_PDATA }, 309 { _XDATA, STYP_XDATA }, 310 { _LIB, STYP_ECOFF_LIB }, 311 { _GOT, STYP_GOT }, 312 { _HASH, STYP_HASH }, 313 { _DYNAMIC, STYP_DYNAMIC }, 314 { _LIBLIST, STYP_LIBLIST }, 315 { _RELDYN, STYP_RELDYN }, 316 { _CONFLIC, STYP_CONFLIC }, 317 { _DYNSTR, STYP_DYNSTR }, 318 { _DYNSYM, STYP_DYNSYM }, 319 { _RCONST, STYP_RCONST } 320 }; 321 long styp = 0; 322 323 for (i = 0; i < ARRAY_SIZE (styp_flags); i++) 324 if (streq (name, styp_flags[i].name)) 325 { 326 styp = styp_flags[i].flags; 327 break; 328 } 329 330 if (styp == 0) 331 { 332 if (streq (name, _COMMENT)) 333 { 334 styp = STYP_COMMENT; 335 flags &=~ SEC_NEVER_LOAD; 336 } 337 else if (flags & SEC_CODE) 338 styp = STYP_TEXT; 339 else if (flags & SEC_DATA) 340 styp = STYP_DATA; 341 else if (flags & SEC_READONLY) 342 styp = STYP_RDATA; 343 else if (flags & SEC_LOAD) 344 styp = STYP_REG; 345 else 346 styp = STYP_BSS; 347 } 348 349 if (flags & SEC_NEVER_LOAD) 350 styp |= STYP_NOLOAD; 351 352 return styp; 353 } 354 355 /* Get the BFD flags to use for a section. */ 356 357 bfd_boolean 358 _bfd_ecoff_styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED, 359 void * hdr, 360 const char *name ATTRIBUTE_UNUSED, 361 asection *section ATTRIBUTE_UNUSED, 362 flagword * flags_ptr) 363 { 364 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr; 365 long styp_flags = internal_s->s_flags; 366 flagword sec_flags = 0; 367 368 if (styp_flags & STYP_NOLOAD) 369 sec_flags |= SEC_NEVER_LOAD; 370 371 /* For 386 COFF, at least, an unloadable text or data section is 372 actually a shared library section. */ 373 if ((styp_flags & STYP_TEXT) 374 || (styp_flags & STYP_ECOFF_INIT) 375 || (styp_flags & STYP_ECOFF_FINI) 376 || (styp_flags & STYP_DYNAMIC) 377 || (styp_flags & STYP_LIBLIST) 378 || (styp_flags & STYP_RELDYN) 379 || styp_flags == STYP_CONFLIC 380 || (styp_flags & STYP_DYNSTR) 381 || (styp_flags & STYP_DYNSYM) 382 || (styp_flags & STYP_HASH)) 383 { 384 if (sec_flags & SEC_NEVER_LOAD) 385 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY; 386 else 387 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC; 388 } 389 else if ((styp_flags & STYP_DATA) 390 || (styp_flags & STYP_RDATA) 391 || (styp_flags & STYP_SDATA) 392 || styp_flags == STYP_PDATA 393 || styp_flags == STYP_XDATA 394 || (styp_flags & STYP_GOT) 395 || styp_flags == STYP_RCONST) 396 { 397 if (sec_flags & SEC_NEVER_LOAD) 398 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY; 399 else 400 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC; 401 if ((styp_flags & STYP_RDATA) 402 || styp_flags == STYP_PDATA 403 || styp_flags == STYP_RCONST) 404 sec_flags |= SEC_READONLY; 405 } 406 else if ((styp_flags & STYP_BSS) 407 || (styp_flags & STYP_SBSS)) 408 sec_flags |= SEC_ALLOC; 409 else if ((styp_flags & STYP_INFO) || styp_flags == STYP_COMMENT) 410 sec_flags |= SEC_NEVER_LOAD; 411 else if ((styp_flags & STYP_LITA) 412 || (styp_flags & STYP_LIT8) 413 || (styp_flags & STYP_LIT4)) 414 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY; 415 else if (styp_flags & STYP_ECOFF_LIB) 416 sec_flags |= SEC_COFF_SHARED_LIBRARY; 417 else 418 sec_flags |= SEC_ALLOC | SEC_LOAD; 419 420 * flags_ptr = sec_flags; 421 return TRUE; 422 } 423 424 /* Read in the symbolic header for an ECOFF object file. */ 425 426 static bfd_boolean 427 ecoff_slurp_symbolic_header (bfd *abfd) 428 { 429 const struct ecoff_backend_data * const backend = ecoff_backend (abfd); 430 bfd_size_type external_hdr_size; 431 void * raw = NULL; 432 HDRR *internal_symhdr; 433 434 /* See if we've already read it in. */ 435 if (ecoff_data (abfd)->debug_info.symbolic_header.magic == 436 backend->debug_swap.sym_magic) 437 return TRUE; 438 439 /* See whether there is a symbolic header. */ 440 if (ecoff_data (abfd)->sym_filepos == 0) 441 { 442 bfd_get_symcount (abfd) = 0; 443 return TRUE; 444 } 445 446 /* At this point bfd_get_symcount (abfd) holds the number of symbols 447 as read from the file header, but on ECOFF this is always the 448 size of the symbolic information header. It would be cleaner to 449 handle this when we first read the file in coffgen.c. */ 450 external_hdr_size = backend->debug_swap.external_hdr_size; 451 if (bfd_get_symcount (abfd) != external_hdr_size) 452 { 453 bfd_set_error (bfd_error_bad_value); 454 return FALSE; 455 } 456 457 /* Read the symbolic information header. */ 458 raw = bfd_malloc (external_hdr_size); 459 if (raw == NULL) 460 goto error_return; 461 462 if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) != 0 463 || bfd_bread (raw, external_hdr_size, abfd) != external_hdr_size) 464 goto error_return; 465 internal_symhdr = &ecoff_data (abfd)->debug_info.symbolic_header; 466 (*backend->debug_swap.swap_hdr_in) (abfd, raw, internal_symhdr); 467 468 if (internal_symhdr->magic != backend->debug_swap.sym_magic) 469 { 470 bfd_set_error (bfd_error_bad_value); 471 goto error_return; 472 } 473 474 /* Now we can get the correct number of symbols. */ 475 bfd_get_symcount (abfd) = (internal_symhdr->isymMax 476 + internal_symhdr->iextMax); 477 478 if (raw != NULL) 479 free (raw); 480 return TRUE; 481 error_return: 482 if (raw != NULL) 483 free (raw); 484 return FALSE; 485 } 486 487 /* Read in and swap the important symbolic information for an ECOFF 488 object file. This is called by gdb via the read_debug_info entry 489 point in the backend structure. */ 490 491 bfd_boolean 492 _bfd_ecoff_slurp_symbolic_info (bfd *abfd, 493 asection *ignore ATTRIBUTE_UNUSED, 494 struct ecoff_debug_info *debug) 495 { 496 const struct ecoff_backend_data * const backend = ecoff_backend (abfd); 497 HDRR *internal_symhdr; 498 bfd_size_type raw_base; 499 bfd_size_type raw_size; 500 void * raw; 501 bfd_size_type external_fdr_size; 502 char *fraw_src; 503 char *fraw_end; 504 struct fdr *fdr_ptr; 505 bfd_size_type raw_end; 506 bfd_size_type cb_end; 507 file_ptr pos; 508 509 BFD_ASSERT (debug == &ecoff_data (abfd)->debug_info); 510 511 /* Check whether we've already gotten it, and whether there's any to 512 get. */ 513 if (ecoff_data (abfd)->raw_syments != NULL) 514 return TRUE; 515 if (ecoff_data (abfd)->sym_filepos == 0) 516 { 517 bfd_get_symcount (abfd) = 0; 518 return TRUE; 519 } 520 521 if (! ecoff_slurp_symbolic_header (abfd)) 522 return FALSE; 523 524 internal_symhdr = &debug->symbolic_header; 525 526 /* Read all the symbolic information at once. */ 527 raw_base = (ecoff_data (abfd)->sym_filepos 528 + backend->debug_swap.external_hdr_size); 529 530 /* Alpha ecoff makes the determination of raw_size difficult. It has 531 an undocumented debug data section between the symhdr and the first 532 documented section. And the ordering of the sections varies between 533 statically and dynamically linked executables. 534 If bfd supports SEEK_END someday, this code could be simplified. */ 535 raw_end = 0; 536 537 #define UPDATE_RAW_END(start, count, size) \ 538 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \ 539 if (cb_end > raw_end) \ 540 raw_end = cb_end 541 542 UPDATE_RAW_END (cbLineOffset, cbLine, sizeof (unsigned char)); 543 UPDATE_RAW_END (cbDnOffset, idnMax, backend->debug_swap.external_dnr_size); 544 UPDATE_RAW_END (cbPdOffset, ipdMax, backend->debug_swap.external_pdr_size); 545 UPDATE_RAW_END (cbSymOffset, isymMax, backend->debug_swap.external_sym_size); 546 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the 547 optimization symtab, not the number of entries. */ 548 UPDATE_RAW_END (cbOptOffset, ioptMax, sizeof (char)); 549 UPDATE_RAW_END (cbAuxOffset, iauxMax, sizeof (union aux_ext)); 550 UPDATE_RAW_END (cbSsOffset, issMax, sizeof (char)); 551 UPDATE_RAW_END (cbSsExtOffset, issExtMax, sizeof (char)); 552 UPDATE_RAW_END (cbFdOffset, ifdMax, backend->debug_swap.external_fdr_size); 553 UPDATE_RAW_END (cbRfdOffset, crfd, backend->debug_swap.external_rfd_size); 554 UPDATE_RAW_END (cbExtOffset, iextMax, backend->debug_swap.external_ext_size); 555 556 #undef UPDATE_RAW_END 557 558 raw_size = raw_end - raw_base; 559 if (raw_size == 0) 560 { 561 ecoff_data (abfd)->sym_filepos = 0; 562 return TRUE; 563 } 564 raw = bfd_alloc (abfd, raw_size); 565 if (raw == NULL) 566 return FALSE; 567 568 pos = ecoff_data (abfd)->sym_filepos; 569 pos += backend->debug_swap.external_hdr_size; 570 if (bfd_seek (abfd, pos, SEEK_SET) != 0 571 || bfd_bread (raw, raw_size, abfd) != raw_size) 572 { 573 bfd_release (abfd, raw); 574 return FALSE; 575 } 576 577 ecoff_data (abfd)->raw_syments = raw; 578 579 /* Get pointers for the numeric offsets in the HDRR structure. */ 580 #define FIX(off1, off2, type) \ 581 if (internal_symhdr->off1 == 0) \ 582 debug->off2 = NULL; \ 583 else \ 584 debug->off2 = (type) ((char *) raw \ 585 + (internal_symhdr->off1 \ 586 - raw_base)) 587 588 FIX (cbLineOffset, line, unsigned char *); 589 FIX (cbDnOffset, external_dnr, void *); 590 FIX (cbPdOffset, external_pdr, void *); 591 FIX (cbSymOffset, external_sym, void *); 592 FIX (cbOptOffset, external_opt, void *); 593 FIX (cbAuxOffset, external_aux, union aux_ext *); 594 FIX (cbSsOffset, ss, char *); 595 FIX (cbSsExtOffset, ssext, char *); 596 FIX (cbFdOffset, external_fdr, void *); 597 FIX (cbRfdOffset, external_rfd, void *); 598 FIX (cbExtOffset, external_ext, void *); 599 #undef FIX 600 601 /* I don't want to always swap all the data, because it will just 602 waste time and most programs will never look at it. The only 603 time the linker needs most of the debugging information swapped 604 is when linking big-endian and little-endian MIPS object files 605 together, which is not a common occurrence. 606 607 We need to look at the fdr to deal with a lot of information in 608 the symbols, so we swap them here. */ 609 debug->fdr = (FDR *) bfd_alloc2 (abfd, internal_symhdr->ifdMax, 610 sizeof (struct fdr)); 611 if (debug->fdr == NULL) 612 return FALSE; 613 external_fdr_size = backend->debug_swap.external_fdr_size; 614 fdr_ptr = debug->fdr; 615 fraw_src = (char *) debug->external_fdr; 616 /* PR 17512: file: 3372-1243-0.004. */ 617 if (fraw_src == NULL && internal_symhdr->ifdMax > 0) 618 return FALSE; 619 fraw_end = fraw_src + internal_symhdr->ifdMax * external_fdr_size; 620 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++) 621 (*backend->debug_swap.swap_fdr_in) (abfd, (void *) fraw_src, fdr_ptr); 622 623 return TRUE; 624 } 625 626 /* ECOFF symbol table routines. The ECOFF symbol table is described 627 in gcc/mips-tfile.c. */ 628 629 /* ECOFF uses two common sections. One is the usual one, and the 630 other is for small objects. All the small objects are kept 631 together, and then referenced via the gp pointer, which yields 632 faster assembler code. This is what we use for the small common 633 section. */ 634 static asection ecoff_scom_section; 635 static asymbol ecoff_scom_symbol; 636 static asymbol *ecoff_scom_symbol_ptr; 637 638 /* Create an empty symbol. */ 639 640 asymbol * 641 _bfd_ecoff_make_empty_symbol (bfd *abfd) 642 { 643 ecoff_symbol_type *new_symbol; 644 bfd_size_type amt = sizeof (ecoff_symbol_type); 645 646 new_symbol = (ecoff_symbol_type *) bfd_zalloc (abfd, amt); 647 if (new_symbol == NULL) 648 return NULL; 649 new_symbol->symbol.section = NULL; 650 new_symbol->fdr = NULL; 651 new_symbol->local = FALSE; 652 new_symbol->native = NULL; 653 new_symbol->symbol.the_bfd = abfd; 654 return &new_symbol->symbol; 655 } 656 657 /* Set the BFD flags and section for an ECOFF symbol. */ 658 659 static bfd_boolean 660 ecoff_set_symbol_info (bfd *abfd, 661 SYMR *ecoff_sym, 662 asymbol *asym, 663 int ext, 664 int weak) 665 { 666 asym->the_bfd = abfd; 667 asym->value = ecoff_sym->value; 668 asym->section = &bfd_debug_section; 669 asym->udata.i = 0; 670 671 /* Most symbol types are just for debugging. */ 672 switch (ecoff_sym->st) 673 { 674 case stGlobal: 675 case stStatic: 676 case stLabel: 677 case stProc: 678 case stStaticProc: 679 break; 680 case stNil: 681 if (ECOFF_IS_STAB (ecoff_sym)) 682 { 683 asym->flags = BSF_DEBUGGING; 684 return TRUE; 685 } 686 break; 687 default: 688 asym->flags = BSF_DEBUGGING; 689 return TRUE; 690 } 691 692 if (weak) 693 asym->flags = BSF_EXPORT | BSF_WEAK; 694 else if (ext) 695 asym->flags = BSF_EXPORT | BSF_GLOBAL; 696 else 697 { 698 asym->flags = BSF_LOCAL; 699 /* Normally, a local stProc symbol will have a corresponding 700 external symbol. We mark the local symbol as a debugging 701 symbol, in order to prevent nm from printing both out. 702 Similarly, we mark stLabel and stabs symbols as debugging 703 symbols. In both cases, we do want to set the value 704 correctly based on the symbol class. */ 705 if (ecoff_sym->st == stProc 706 || ecoff_sym->st == stLabel 707 || ECOFF_IS_STAB (ecoff_sym)) 708 asym->flags |= BSF_DEBUGGING; 709 } 710 711 if (ecoff_sym->st == stProc || ecoff_sym->st == stStaticProc) 712 asym->flags |= BSF_FUNCTION; 713 714 switch (ecoff_sym->sc) 715 { 716 case scNil: 717 /* Used for compiler generated labels. Leave them in the 718 debugging section, and mark them as local. If BSF_DEBUGGING 719 is set, then nm does not display them for some reason. If no 720 flags are set then the linker whines about them. */ 721 asym->flags = BSF_LOCAL; 722 break; 723 case scText: 724 asym->section = bfd_make_section_old_way (abfd, _TEXT); 725 asym->value -= asym->section->vma; 726 break; 727 case scData: 728 asym->section = bfd_make_section_old_way (abfd, _DATA); 729 asym->value -= asym->section->vma; 730 break; 731 case scBss: 732 asym->section = bfd_make_section_old_way (abfd, _BSS); 733 asym->value -= asym->section->vma; 734 break; 735 case scRegister: 736 asym->flags = BSF_DEBUGGING; 737 break; 738 case scAbs: 739 asym->section = bfd_abs_section_ptr; 740 break; 741 case scUndefined: 742 asym->section = bfd_und_section_ptr; 743 asym->flags = 0; 744 asym->value = 0; 745 break; 746 case scCdbLocal: 747 case scBits: 748 case scCdbSystem: 749 case scRegImage: 750 case scInfo: 751 case scUserStruct: 752 asym->flags = BSF_DEBUGGING; 753 break; 754 case scSData: 755 asym->section = bfd_make_section_old_way (abfd, ".sdata"); 756 asym->value -= asym->section->vma; 757 break; 758 case scSBss: 759 asym->section = bfd_make_section_old_way (abfd, ".sbss"); 760 asym->value -= asym->section->vma; 761 break; 762 case scRData: 763 asym->section = bfd_make_section_old_way (abfd, ".rdata"); 764 asym->value -= asym->section->vma; 765 break; 766 case scVar: 767 asym->flags = BSF_DEBUGGING; 768 break; 769 case scCommon: 770 if (asym->value > ecoff_data (abfd)->gp_size) 771 { 772 asym->section = bfd_com_section_ptr; 773 asym->flags = 0; 774 break; 775 } 776 /* Fall through. */ 777 case scSCommon: 778 if (ecoff_scom_section.name == NULL) 779 { 780 /* Initialize the small common section. */ 781 ecoff_scom_section.name = SCOMMON; 782 ecoff_scom_section.flags = SEC_IS_COMMON; 783 ecoff_scom_section.output_section = &ecoff_scom_section; 784 ecoff_scom_section.symbol = &ecoff_scom_symbol; 785 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr; 786 ecoff_scom_symbol.name = SCOMMON; 787 ecoff_scom_symbol.flags = BSF_SECTION_SYM; 788 ecoff_scom_symbol.section = &ecoff_scom_section; 789 ecoff_scom_symbol_ptr = &ecoff_scom_symbol; 790 } 791 asym->section = &ecoff_scom_section; 792 asym->flags = 0; 793 break; 794 case scVarRegister: 795 case scVariant: 796 asym->flags = BSF_DEBUGGING; 797 break; 798 case scSUndefined: 799 asym->section = bfd_und_section_ptr; 800 asym->flags = 0; 801 asym->value = 0; 802 break; 803 case scInit: 804 asym->section = bfd_make_section_old_way (abfd, ".init"); 805 asym->value -= asym->section->vma; 806 break; 807 case scBasedVar: 808 case scXData: 809 case scPData: 810 asym->flags = BSF_DEBUGGING; 811 break; 812 case scFini: 813 asym->section = bfd_make_section_old_way (abfd, ".fini"); 814 asym->value -= asym->section->vma; 815 break; 816 case scRConst: 817 asym->section = bfd_make_section_old_way (abfd, ".rconst"); 818 asym->value -= asym->section->vma; 819 break; 820 default: 821 break; 822 } 823 824 /* Look for special constructors symbols and make relocation entries 825 in a special construction section. These are produced by the 826 -fgnu-linker argument to g++. */ 827 if (ECOFF_IS_STAB (ecoff_sym)) 828 { 829 switch (ECOFF_UNMARK_STAB (ecoff_sym->index)) 830 { 831 default: 832 break; 833 834 case N_SETA: 835 case N_SETT: 836 case N_SETD: 837 case N_SETB: 838 /* Mark the symbol as a constructor. */ 839 asym->flags |= BSF_CONSTRUCTOR; 840 break; 841 } 842 } 843 return TRUE; 844 } 845 846 /* Read an ECOFF symbol table. */ 847 848 bfd_boolean 849 _bfd_ecoff_slurp_symbol_table (bfd *abfd) 850 { 851 const struct ecoff_backend_data * const backend = ecoff_backend (abfd); 852 const bfd_size_type external_ext_size 853 = backend->debug_swap.external_ext_size; 854 const bfd_size_type external_sym_size 855 = backend->debug_swap.external_sym_size; 856 void (* const swap_ext_in) (bfd *, void *, EXTR *) 857 = backend->debug_swap.swap_ext_in; 858 void (* const swap_sym_in) (bfd *, void *, SYMR *) 859 = backend->debug_swap.swap_sym_in; 860 ecoff_symbol_type *internal; 861 ecoff_symbol_type *internal_ptr; 862 char *eraw_src; 863 char *eraw_end; 864 FDR *fdr_ptr; 865 FDR *fdr_end; 866 867 /* If we've already read in the symbol table, do nothing. */ 868 if (ecoff_data (abfd)->canonical_symbols != NULL) 869 return TRUE; 870 871 /* Get the symbolic information. */ 872 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL, 873 &ecoff_data (abfd)->debug_info)) 874 return FALSE; 875 if (bfd_get_symcount (abfd) == 0) 876 return TRUE; 877 878 internal = (ecoff_symbol_type *) bfd_alloc2 (abfd, bfd_get_symcount (abfd), 879 sizeof (ecoff_symbol_type)); 880 if (internal == NULL) 881 return FALSE; 882 883 internal_ptr = internal; 884 eraw_src = (char *) ecoff_data (abfd)->debug_info.external_ext; 885 eraw_end = (eraw_src 886 + (ecoff_data (abfd)->debug_info.symbolic_header.iextMax 887 * external_ext_size)); 888 for (; eraw_src < eraw_end; eraw_src += external_ext_size, internal_ptr++) 889 { 890 EXTR internal_esym; 891 892 (*swap_ext_in) (abfd, (void *) eraw_src, &internal_esym); 893 894 /* PR 17512: file: 3372-1000-0.004. */ 895 if (internal_esym.asym.iss >= ecoff_data (abfd)->debug_info.symbolic_header.issExtMax 896 || internal_esym.asym.iss < 0) 897 return FALSE; 898 899 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ssext 900 + internal_esym.asym.iss); 901 902 if (!ecoff_set_symbol_info (abfd, &internal_esym.asym, 903 &internal_ptr->symbol, 1, 904 internal_esym.weakext)) 905 return FALSE; 906 907 /* The alpha uses a negative ifd field for section symbols. */ 908 if (internal_esym.ifd >= 0) 909 { 910 /* PR 17512: file: 3372-1983-0.004. */ 911 if (internal_esym.ifd >= ecoff_data (abfd)->debug_info.symbolic_header.ifdMax) 912 internal_ptr->fdr = NULL; 913 else 914 internal_ptr->fdr = (ecoff_data (abfd)->debug_info.fdr 915 + internal_esym.ifd); 916 } 917 else 918 internal_ptr->fdr = NULL; 919 internal_ptr->local = FALSE; 920 internal_ptr->native = (void *) eraw_src; 921 } 922 923 /* The local symbols must be accessed via the fdr's, because the 924 string and aux indices are relative to the fdr information. */ 925 fdr_ptr = ecoff_data (abfd)->debug_info.fdr; 926 fdr_end = fdr_ptr + ecoff_data (abfd)->debug_info.symbolic_header.ifdMax; 927 for (; fdr_ptr < fdr_end; fdr_ptr++) 928 { 929 char *lraw_src; 930 char *lraw_end; 931 932 lraw_src = ((char *) ecoff_data (abfd)->debug_info.external_sym 933 + fdr_ptr->isymBase * external_sym_size); 934 lraw_end = lraw_src + fdr_ptr->csym * external_sym_size; 935 for (; 936 lraw_src < lraw_end; 937 lraw_src += external_sym_size, internal_ptr++) 938 { 939 SYMR internal_sym; 940 941 (*swap_sym_in) (abfd, (void *) lraw_src, &internal_sym); 942 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ss 943 + fdr_ptr->issBase 944 + internal_sym.iss); 945 if (!ecoff_set_symbol_info (abfd, &internal_sym, 946 &internal_ptr->symbol, 0, 0)) 947 return FALSE; 948 internal_ptr->fdr = fdr_ptr; 949 internal_ptr->local = TRUE; 950 internal_ptr->native = (void *) lraw_src; 951 } 952 } 953 954 /* PR 17512: file: 3372-3080-0.004. 955 A discrepancy between ecoff_data (abfd)->debug_info.symbolic_header.isymMax 956 and ecoff_data (abfd)->debug_info.symbolic_header.ifdMax can mean that 957 we have fewer symbols than we were expecting. Allow for this by updating 958 the symbol count and warning the user. */ 959 if (internal_ptr - internal < (ptrdiff_t) bfd_get_symcount (abfd)) 960 { 961 bfd_get_symcount (abfd) = internal_ptr - internal; 962 (*_bfd_error_handler) 963 (_("%B: warning: isymMax (%ld) is greater than ifdMax (%d)\n"), 964 abfd, ecoff_data (abfd)->debug_info.symbolic_header.isymMax, 965 ecoff_data (abfd)->debug_info.symbolic_header.ifdMax); 966 } 967 968 ecoff_data (abfd)->canonical_symbols = internal; 969 970 return TRUE; 971 } 972 973 /* Return the amount of space needed for the canonical symbols. */ 974 975 long 976 _bfd_ecoff_get_symtab_upper_bound (bfd *abfd) 977 { 978 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL, 979 &ecoff_data (abfd)->debug_info)) 980 return -1; 981 982 if (bfd_get_symcount (abfd) == 0) 983 return 0; 984 985 return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *)); 986 } 987 988 /* Get the canonical symbols. */ 989 990 long 991 _bfd_ecoff_canonicalize_symtab (bfd *abfd, asymbol **alocation) 992 { 993 unsigned int counter = 0; 994 ecoff_symbol_type *symbase; 995 ecoff_symbol_type **location = (ecoff_symbol_type **) alocation; 996 997 if (! _bfd_ecoff_slurp_symbol_table (abfd)) 998 return -1; 999 if (bfd_get_symcount (abfd) == 0) 1000 return 0; 1001 1002 symbase = ecoff_data (abfd)->canonical_symbols; 1003 while (counter < bfd_get_symcount (abfd)) 1004 { 1005 *(location++) = symbase++; 1006 counter++; 1007 } 1008 *location++ = NULL; 1009 return bfd_get_symcount (abfd); 1010 } 1011 1012 /* Turn ECOFF type information into a printable string. 1013 ecoff_emit_aggregate and ecoff_type_to_string are from 1014 gcc/mips-tdump.c, with swapping added and used_ptr removed. */ 1015 1016 /* Write aggregate information to a string. */ 1017 1018 static void 1019 ecoff_emit_aggregate (bfd *abfd, 1020 FDR *fdr, 1021 char *string, 1022 RNDXR *rndx, 1023 long isym, 1024 const char *which) 1025 { 1026 const struct ecoff_debug_swap * const debug_swap = 1027 &ecoff_backend (abfd)->debug_swap; 1028 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info; 1029 unsigned int ifd = rndx->rfd; 1030 unsigned int indx = rndx->index; 1031 const char *name; 1032 1033 if (ifd == 0xfff) 1034 ifd = isym; 1035 1036 /* An ifd of -1 is an opaque type. An escaped index of 0 is a 1037 struct return type of a procedure compiled without -g. */ 1038 if (ifd == 0xffffffff 1039 || (rndx->rfd == 0xfff && indx == 0)) 1040 name = "<undefined>"; 1041 else if (indx == indexNil) 1042 name = "<no name>"; 1043 else 1044 { 1045 SYMR sym; 1046 1047 if (debug_info->external_rfd == NULL) 1048 fdr = debug_info->fdr + ifd; 1049 else 1050 { 1051 RFDT rfd; 1052 1053 (*debug_swap->swap_rfd_in) (abfd, 1054 ((char *) debug_info->external_rfd 1055 + ((fdr->rfdBase + ifd) 1056 * debug_swap->external_rfd_size)), 1057 &rfd); 1058 fdr = debug_info->fdr + rfd; 1059 } 1060 1061 indx += fdr->isymBase; 1062 1063 (*debug_swap->swap_sym_in) (abfd, 1064 ((char *) debug_info->external_sym 1065 + indx * debug_swap->external_sym_size), 1066 &sym); 1067 1068 name = debug_info->ss + fdr->issBase + sym.iss; 1069 } 1070 1071 sprintf (string, 1072 "%s %s { ifd = %u, index = %lu }", 1073 which, name, ifd, 1074 ((unsigned long) indx 1075 + debug_info->symbolic_header.iextMax)); 1076 } 1077 1078 /* Convert the type information to string format. */ 1079 1080 static char * 1081 ecoff_type_to_string (bfd *abfd, FDR *fdr, unsigned int indx) 1082 { 1083 union aux_ext *aux_ptr; 1084 int bigendian; 1085 AUXU u; 1086 struct qual 1087 { 1088 unsigned int type; 1089 int low_bound; 1090 int high_bound; 1091 int stride; 1092 } qualifiers[7]; 1093 unsigned int basic_type; 1094 int i; 1095 char buffer1[1024]; 1096 static char buffer2[1024]; 1097 char *p1 = buffer1; 1098 char *p2 = buffer2; 1099 RNDXR rndx; 1100 1101 aux_ptr = ecoff_data (abfd)->debug_info.external_aux + fdr->iauxBase; 1102 bigendian = fdr->fBigendian; 1103 1104 for (i = 0; i < 7; i++) 1105 { 1106 qualifiers[i].low_bound = 0; 1107 qualifiers[i].high_bound = 0; 1108 qualifiers[i].stride = 0; 1109 } 1110 1111 if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == (bfd_vma) -1) 1112 return "-1 (no type)"; 1113 _bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti); 1114 1115 basic_type = u.ti.bt; 1116 qualifiers[0].type = u.ti.tq0; 1117 qualifiers[1].type = u.ti.tq1; 1118 qualifiers[2].type = u.ti.tq2; 1119 qualifiers[3].type = u.ti.tq3; 1120 qualifiers[4].type = u.ti.tq4; 1121 qualifiers[5].type = u.ti.tq5; 1122 qualifiers[6].type = tqNil; 1123 1124 /* Go get the basic type. */ 1125 switch (basic_type) 1126 { 1127 case btNil: /* Undefined. */ 1128 strcpy (p1, "nil"); 1129 break; 1130 1131 case btAdr: /* Address - integer same size as pointer. */ 1132 strcpy (p1, "address"); 1133 break; 1134 1135 case btChar: /* Character. */ 1136 strcpy (p1, "char"); 1137 break; 1138 1139 case btUChar: /* Unsigned character. */ 1140 strcpy (p1, "unsigned char"); 1141 break; 1142 1143 case btShort: /* Short. */ 1144 strcpy (p1, "short"); 1145 break; 1146 1147 case btUShort: /* Unsigned short. */ 1148 strcpy (p1, "unsigned short"); 1149 break; 1150 1151 case btInt: /* Int. */ 1152 strcpy (p1, "int"); 1153 break; 1154 1155 case btUInt: /* Unsigned int. */ 1156 strcpy (p1, "unsigned int"); 1157 break; 1158 1159 case btLong: /* Long. */ 1160 strcpy (p1, "long"); 1161 break; 1162 1163 case btULong: /* Unsigned long. */ 1164 strcpy (p1, "unsigned long"); 1165 break; 1166 1167 case btFloat: /* Float (real). */ 1168 strcpy (p1, "float"); 1169 break; 1170 1171 case btDouble: /* Double (real). */ 1172 strcpy (p1, "double"); 1173 break; 1174 1175 /* Structures add 1-2 aux words: 1176 1st word is [ST_RFDESCAPE, offset] pointer to struct def; 1177 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */ 1178 1179 case btStruct: /* Structure (Record). */ 1180 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); 1181 ecoff_emit_aggregate (abfd, fdr, p1, &rndx, 1182 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), 1183 "struct"); 1184 indx++; /* Skip aux words. */ 1185 break; 1186 1187 /* Unions add 1-2 aux words: 1188 1st word is [ST_RFDESCAPE, offset] pointer to union def; 1189 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */ 1190 1191 case btUnion: /* Union. */ 1192 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); 1193 ecoff_emit_aggregate (abfd, fdr, p1, &rndx, 1194 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), 1195 "union"); 1196 indx++; /* Skip aux words. */ 1197 break; 1198 1199 /* Enumerations add 1-2 aux words: 1200 1st word is [ST_RFDESCAPE, offset] pointer to enum def; 1201 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */ 1202 1203 case btEnum: /* Enumeration. */ 1204 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); 1205 ecoff_emit_aggregate (abfd, fdr, p1, &rndx, 1206 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), 1207 "enum"); 1208 indx++; /* Skip aux words. */ 1209 break; 1210 1211 case btTypedef: /* Defined via a typedef, isymRef points. */ 1212 strcpy (p1, "typedef"); 1213 break; 1214 1215 case btRange: /* Subrange of int. */ 1216 strcpy (p1, "subrange"); 1217 break; 1218 1219 case btSet: /* Pascal sets. */ 1220 strcpy (p1, "set"); 1221 break; 1222 1223 case btComplex: /* Fortran complex. */ 1224 strcpy (p1, "complex"); 1225 break; 1226 1227 case btDComplex: /* Fortran double complex. */ 1228 strcpy (p1, "double complex"); 1229 break; 1230 1231 case btIndirect: /* Forward or unnamed typedef. */ 1232 strcpy (p1, "forward/unamed typedef"); 1233 break; 1234 1235 case btFixedDec: /* Fixed Decimal. */ 1236 strcpy (p1, "fixed decimal"); 1237 break; 1238 1239 case btFloatDec: /* Float Decimal. */ 1240 strcpy (p1, "float decimal"); 1241 break; 1242 1243 case btString: /* Varying Length Character String. */ 1244 strcpy (p1, "string"); 1245 break; 1246 1247 case btBit: /* Aligned Bit String. */ 1248 strcpy (p1, "bit"); 1249 break; 1250 1251 case btPicture: /* Picture. */ 1252 strcpy (p1, "picture"); 1253 break; 1254 1255 case btVoid: /* Void. */ 1256 strcpy (p1, "void"); 1257 break; 1258 1259 default: 1260 sprintf (p1, _("Unknown basic type %d"), (int) basic_type); 1261 break; 1262 } 1263 1264 p1 += strlen (buffer1); 1265 1266 /* If this is a bitfield, get the bitsize. */ 1267 if (u.ti.fBitfield) 1268 { 1269 int bitsize; 1270 1271 bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]); 1272 sprintf (p1, " : %d", bitsize); 1273 p1 += strlen (buffer1); 1274 } 1275 1276 /* Deal with any qualifiers. */ 1277 if (qualifiers[0].type != tqNil) 1278 { 1279 /* Snarf up any array bounds in the correct order. Arrays 1280 store 5 successive words in the aux. table: 1281 word 0 RNDXR to type of the bounds (ie, int) 1282 word 1 Current file descriptor index 1283 word 2 low bound 1284 word 3 high bound (or -1 if []) 1285 word 4 stride size in bits. */ 1286 for (i = 0; i < 7; i++) 1287 { 1288 if (qualifiers[i].type == tqArray) 1289 { 1290 qualifiers[i].low_bound = 1291 AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]); 1292 qualifiers[i].high_bound = 1293 AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]); 1294 qualifiers[i].stride = 1295 AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]); 1296 indx += 5; 1297 } 1298 } 1299 1300 /* Now print out the qualifiers. */ 1301 for (i = 0; i < 6; i++) 1302 { 1303 switch (qualifiers[i].type) 1304 { 1305 case tqNil: 1306 case tqMax: 1307 break; 1308 1309 case tqPtr: 1310 strcpy (p2, "ptr to "); 1311 p2 += sizeof ("ptr to ")-1; 1312 break; 1313 1314 case tqVol: 1315 strcpy (p2, "volatile "); 1316 p2 += sizeof ("volatile ")-1; 1317 break; 1318 1319 case tqFar: 1320 strcpy (p2, "far "); 1321 p2 += sizeof ("far ")-1; 1322 break; 1323 1324 case tqProc: 1325 strcpy (p2, "func. ret. "); 1326 p2 += sizeof ("func. ret. "); 1327 break; 1328 1329 case tqArray: 1330 { 1331 int first_array = i; 1332 int j; 1333 1334 /* Print array bounds reversed (ie, in the order the C 1335 programmer writes them). C is such a fun language.... */ 1336 while (i < 5 && qualifiers[i+1].type == tqArray) 1337 i++; 1338 1339 for (j = i; j >= first_array; j--) 1340 { 1341 strcpy (p2, "array ["); 1342 p2 += sizeof ("array [")-1; 1343 if (qualifiers[j].low_bound != 0) 1344 sprintf (p2, 1345 "%ld:%ld {%ld bits}", 1346 (long) qualifiers[j].low_bound, 1347 (long) qualifiers[j].high_bound, 1348 (long) qualifiers[j].stride); 1349 1350 else if (qualifiers[j].high_bound != -1) 1351 sprintf (p2, 1352 "%ld {%ld bits}", 1353 (long) (qualifiers[j].high_bound + 1), 1354 (long) (qualifiers[j].stride)); 1355 1356 else 1357 sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride)); 1358 1359 p2 += strlen (p2); 1360 strcpy (p2, "] of "); 1361 p2 += sizeof ("] of ")-1; 1362 } 1363 } 1364 break; 1365 } 1366 } 1367 } 1368 1369 strcpy (p2, buffer1); 1370 return buffer2; 1371 } 1372 1373 /* Return information about ECOFF symbol SYMBOL in RET. */ 1374 1375 void 1376 _bfd_ecoff_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, 1377 asymbol *symbol, 1378 symbol_info *ret) 1379 { 1380 bfd_symbol_info (symbol, ret); 1381 } 1382 1383 /* Return whether this is a local label. */ 1384 1385 bfd_boolean 1386 _bfd_ecoff_bfd_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, 1387 const char *name) 1388 { 1389 return name[0] == '$'; 1390 } 1391 1392 /* Print information about an ECOFF symbol. */ 1393 1394 void 1395 _bfd_ecoff_print_symbol (bfd *abfd, 1396 void * filep, 1397 asymbol *symbol, 1398 bfd_print_symbol_type how) 1399 { 1400 const struct ecoff_debug_swap * const debug_swap 1401 = &ecoff_backend (abfd)->debug_swap; 1402 FILE *file = (FILE *)filep; 1403 1404 switch (how) 1405 { 1406 case bfd_print_symbol_name: 1407 fprintf (file, "%s", symbol->name); 1408 break; 1409 case bfd_print_symbol_more: 1410 if (ecoffsymbol (symbol)->local) 1411 { 1412 SYMR ecoff_sym; 1413 1414 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native, 1415 &ecoff_sym); 1416 fprintf (file, "ecoff local "); 1417 fprintf_vma (file, (bfd_vma) ecoff_sym.value); 1418 fprintf (file, " %x %x", (unsigned) ecoff_sym.st, 1419 (unsigned) ecoff_sym.sc); 1420 } 1421 else 1422 { 1423 EXTR ecoff_ext; 1424 1425 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native, 1426 &ecoff_ext); 1427 fprintf (file, "ecoff extern "); 1428 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value); 1429 fprintf (file, " %x %x", (unsigned) ecoff_ext.asym.st, 1430 (unsigned) ecoff_ext.asym.sc); 1431 } 1432 break; 1433 case bfd_print_symbol_all: 1434 /* Print out the symbols in a reasonable way. */ 1435 { 1436 char type; 1437 int pos; 1438 EXTR ecoff_ext; 1439 char jmptbl; 1440 char cobol_main; 1441 char weakext; 1442 1443 if (ecoffsymbol (symbol)->local) 1444 { 1445 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native, 1446 &ecoff_ext.asym); 1447 type = 'l'; 1448 pos = ((((char *) ecoffsymbol (symbol)->native 1449 - (char *) ecoff_data (abfd)->debug_info.external_sym) 1450 / debug_swap->external_sym_size) 1451 + ecoff_data (abfd)->debug_info.symbolic_header.iextMax); 1452 jmptbl = ' '; 1453 cobol_main = ' '; 1454 weakext = ' '; 1455 } 1456 else 1457 { 1458 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native, 1459 &ecoff_ext); 1460 type = 'e'; 1461 pos = (((char *) ecoffsymbol (symbol)->native 1462 - (char *) ecoff_data (abfd)->debug_info.external_ext) 1463 / debug_swap->external_ext_size); 1464 jmptbl = ecoff_ext.jmptbl ? 'j' : ' '; 1465 cobol_main = ecoff_ext.cobol_main ? 'c' : ' '; 1466 weakext = ecoff_ext.weakext ? 'w' : ' '; 1467 } 1468 1469 fprintf (file, "[%3d] %c ", 1470 pos, type); 1471 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value); 1472 fprintf (file, " st %x sc %x indx %x %c%c%c %s", 1473 (unsigned) ecoff_ext.asym.st, 1474 (unsigned) ecoff_ext.asym.sc, 1475 (unsigned) ecoff_ext.asym.index, 1476 jmptbl, cobol_main, weakext, 1477 symbol->name); 1478 1479 if (ecoffsymbol (symbol)->fdr != NULL 1480 && ecoff_ext.asym.index != indexNil) 1481 { 1482 FDR *fdr; 1483 unsigned int indx; 1484 int bigendian; 1485 bfd_size_type sym_base; 1486 union aux_ext *aux_base; 1487 1488 fdr = ecoffsymbol (symbol)->fdr; 1489 indx = ecoff_ext.asym.index; 1490 1491 /* sym_base is used to map the fdr relative indices which 1492 appear in the file to the position number which we are 1493 using. */ 1494 sym_base = fdr->isymBase; 1495 if (ecoffsymbol (symbol)->local) 1496 sym_base += 1497 ecoff_data (abfd)->debug_info.symbolic_header.iextMax; 1498 1499 /* aux_base is the start of the aux entries for this file; 1500 asym.index is an offset from this. */ 1501 aux_base = (ecoff_data (abfd)->debug_info.external_aux 1502 + fdr->iauxBase); 1503 1504 /* The aux entries are stored in host byte order; the 1505 order is indicated by a bit in the fdr. */ 1506 bigendian = fdr->fBigendian; 1507 1508 /* This switch is basically from gcc/mips-tdump.c. */ 1509 switch (ecoff_ext.asym.st) 1510 { 1511 case stNil: 1512 case stLabel: 1513 break; 1514 1515 case stFile: 1516 case stBlock: 1517 fprintf (file, _("\n End+1 symbol: %ld"), 1518 (long) (indx + sym_base)); 1519 break; 1520 1521 case stEnd: 1522 if (ecoff_ext.asym.sc == scText 1523 || ecoff_ext.asym.sc == scInfo) 1524 fprintf (file, _("\n First symbol: %ld"), 1525 (long) (indx + sym_base)); 1526 else 1527 fprintf (file, _("\n First symbol: %ld"), 1528 ((long) 1529 (AUX_GET_ISYM (bigendian, 1530 &aux_base[ecoff_ext.asym.index]) 1531 + sym_base))); 1532 break; 1533 1534 case stProc: 1535 case stStaticProc: 1536 if (ECOFF_IS_STAB (&ecoff_ext.asym)) 1537 ; 1538 else if (ecoffsymbol (symbol)->local) 1539 fprintf (file, _("\n End+1 symbol: %-7ld Type: %s"), 1540 ((long) 1541 (AUX_GET_ISYM (bigendian, 1542 &aux_base[ecoff_ext.asym.index]) 1543 + sym_base)), 1544 ecoff_type_to_string (abfd, fdr, indx + 1)); 1545 else 1546 fprintf (file, _("\n Local symbol: %ld"), 1547 ((long) indx 1548 + (long) sym_base 1549 + (ecoff_data (abfd) 1550 ->debug_info.symbolic_header.iextMax))); 1551 break; 1552 1553 case stStruct: 1554 fprintf (file, _("\n struct; End+1 symbol: %ld"), 1555 (long) (indx + sym_base)); 1556 break; 1557 1558 case stUnion: 1559 fprintf (file, _("\n union; End+1 symbol: %ld"), 1560 (long) (indx + sym_base)); 1561 break; 1562 1563 case stEnum: 1564 fprintf (file, _("\n enum; End+1 symbol: %ld"), 1565 (long) (indx + sym_base)); 1566 break; 1567 1568 default: 1569 if (! ECOFF_IS_STAB (&ecoff_ext.asym)) 1570 fprintf (file, _("\n Type: %s"), 1571 ecoff_type_to_string (abfd, fdr, indx)); 1572 break; 1573 } 1574 } 1575 } 1576 break; 1577 } 1578 } 1579 1580 /* Read in the relocs for a section. */ 1581 1582 static bfd_boolean 1583 ecoff_slurp_reloc_table (bfd *abfd, 1584 asection *section, 1585 asymbol **symbols) 1586 { 1587 const struct ecoff_backend_data * const backend = ecoff_backend (abfd); 1588 arelent *internal_relocs; 1589 bfd_size_type external_reloc_size; 1590 bfd_size_type amt; 1591 char *external_relocs; 1592 arelent *rptr; 1593 unsigned int i; 1594 1595 if (section->relocation != NULL 1596 || section->reloc_count == 0 1597 || (section->flags & SEC_CONSTRUCTOR) != 0) 1598 return TRUE; 1599 1600 if (! _bfd_ecoff_slurp_symbol_table (abfd)) 1601 return FALSE; 1602 1603 amt = section->reloc_count; 1604 amt *= sizeof (arelent); 1605 internal_relocs = (arelent *) bfd_alloc (abfd, amt); 1606 1607 external_reloc_size = backend->external_reloc_size; 1608 amt = external_reloc_size * section->reloc_count; 1609 external_relocs = (char *) bfd_alloc (abfd, amt); 1610 if (internal_relocs == NULL || external_relocs == NULL) 1611 return FALSE; 1612 if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0) 1613 return FALSE; 1614 if (bfd_bread (external_relocs, amt, abfd) != amt) 1615 return FALSE; 1616 1617 for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++) 1618 { 1619 struct internal_reloc intern; 1620 1621 (*backend->swap_reloc_in) (abfd, 1622 external_relocs + i * external_reloc_size, 1623 &intern); 1624 1625 if (intern.r_extern) 1626 { 1627 /* r_symndx is an index into the external symbols. */ 1628 BFD_ASSERT (intern.r_symndx >= 0 1629 && (intern.r_symndx 1630 < (ecoff_data (abfd) 1631 ->debug_info.symbolic_header.iextMax))); 1632 rptr->sym_ptr_ptr = symbols + intern.r_symndx; 1633 rptr->addend = 0; 1634 } 1635 else if (intern.r_symndx == RELOC_SECTION_NONE 1636 || intern.r_symndx == RELOC_SECTION_ABS) 1637 { 1638 rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 1639 rptr->addend = 0; 1640 } 1641 else 1642 { 1643 const char *sec_name; 1644 asection *sec; 1645 1646 /* r_symndx is a section key. */ 1647 switch (intern.r_symndx) 1648 { 1649 case RELOC_SECTION_TEXT: sec_name = _TEXT; break; 1650 case RELOC_SECTION_RDATA: sec_name = _RDATA; break; 1651 case RELOC_SECTION_DATA: sec_name = _DATA; break; 1652 case RELOC_SECTION_SDATA: sec_name = _SDATA; break; 1653 case RELOC_SECTION_SBSS: sec_name = _SBSS; break; 1654 case RELOC_SECTION_BSS: sec_name = _BSS; break; 1655 case RELOC_SECTION_INIT: sec_name = _INIT; break; 1656 case RELOC_SECTION_LIT8: sec_name = _LIT8; break; 1657 case RELOC_SECTION_LIT4: sec_name = _LIT4; break; 1658 case RELOC_SECTION_XDATA: sec_name = _XDATA; break; 1659 case RELOC_SECTION_PDATA: sec_name = _PDATA; break; 1660 case RELOC_SECTION_FINI: sec_name = _FINI; break; 1661 case RELOC_SECTION_LITA: sec_name = _LITA; break; 1662 case RELOC_SECTION_RCONST: sec_name = _RCONST; break; 1663 default: abort (); 1664 } 1665 1666 sec = bfd_get_section_by_name (abfd, sec_name); 1667 if (sec == NULL) 1668 abort (); 1669 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr; 1670 1671 rptr->addend = - bfd_get_section_vma (abfd, sec); 1672 } 1673 1674 rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section); 1675 1676 /* Let the backend select the howto field and do any other 1677 required processing. */ 1678 (*backend->adjust_reloc_in) (abfd, &intern, rptr); 1679 } 1680 1681 bfd_release (abfd, external_relocs); 1682 1683 section->relocation = internal_relocs; 1684 1685 return TRUE; 1686 } 1687 1688 /* Get a canonical list of relocs. */ 1689 1690 long 1691 _bfd_ecoff_canonicalize_reloc (bfd *abfd, 1692 asection *section, 1693 arelent **relptr, 1694 asymbol **symbols) 1695 { 1696 unsigned int count; 1697 1698 if (section->flags & SEC_CONSTRUCTOR) 1699 { 1700 arelent_chain *chain; 1701 1702 /* This section has relocs made up by us, not the file, so take 1703 them out of their chain and place them into the data area 1704 provided. */ 1705 for (count = 0, chain = section->constructor_chain; 1706 count < section->reloc_count; 1707 count++, chain = chain->next) 1708 *relptr++ = &chain->relent; 1709 } 1710 else 1711 { 1712 arelent *tblptr; 1713 1714 if (! ecoff_slurp_reloc_table (abfd, section, symbols)) 1715 return -1; 1716 1717 tblptr = section->relocation; 1718 1719 for (count = 0; count < section->reloc_count; count++) 1720 *relptr++ = tblptr++; 1721 } 1722 1723 *relptr = NULL; 1724 1725 return section->reloc_count; 1726 } 1727 1728 /* Provided a BFD, a section and an offset into the section, calculate 1729 and return the name of the source file and the line nearest to the 1730 wanted location. */ 1731 1732 bfd_boolean 1733 _bfd_ecoff_find_nearest_line (bfd *abfd, 1734 asymbol **symbols ATTRIBUTE_UNUSED, 1735 asection *section, 1736 bfd_vma offset, 1737 const char **filename_ptr, 1738 const char **functionname_ptr, 1739 unsigned int *retline_ptr, 1740 unsigned int *discriminator_ptr) 1741 { 1742 const struct ecoff_debug_swap * const debug_swap 1743 = &ecoff_backend (abfd)->debug_swap; 1744 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info; 1745 struct ecoff_find_line *line_info; 1746 1747 /* Make sure we have the FDR's. */ 1748 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL, debug_info) 1749 || bfd_get_symcount (abfd) == 0) 1750 return FALSE; 1751 1752 if (ecoff_data (abfd)->find_line_info == NULL) 1753 { 1754 bfd_size_type amt = sizeof (struct ecoff_find_line); 1755 1756 ecoff_data (abfd)->find_line_info = 1757 (struct ecoff_find_line *) bfd_zalloc (abfd, amt); 1758 if (ecoff_data (abfd)->find_line_info == NULL) 1759 return FALSE; 1760 } 1761 1762 if (discriminator_ptr) 1763 *discriminator_ptr = 0; 1764 line_info = ecoff_data (abfd)->find_line_info; 1765 return _bfd_ecoff_locate_line (abfd, section, offset, debug_info, 1766 debug_swap, line_info, filename_ptr, 1767 functionname_ptr, retline_ptr); 1768 } 1769 1770 /* Copy private BFD data. This is called by objcopy and strip. We 1771 use it to copy the ECOFF debugging information from one BFD to the 1772 other. It would be theoretically possible to represent the ECOFF 1773 debugging information in the symbol table. However, it would be a 1774 lot of work, and there would be little gain (gas, gdb, and ld 1775 already access the ECOFF debugging information via the 1776 ecoff_debug_info structure, and that structure would have to be 1777 retained in order to support ECOFF debugging in MIPS ELF). 1778 1779 The debugging information for the ECOFF external symbols comes from 1780 the symbol table, so this function only handles the other debugging 1781 information. */ 1782 1783 bfd_boolean 1784 _bfd_ecoff_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd) 1785 { 1786 struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info; 1787 struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info; 1788 int i; 1789 asymbol **sym_ptr_ptr; 1790 size_t c; 1791 bfd_boolean local; 1792 1793 /* We only want to copy information over if both BFD's use ECOFF 1794 format. */ 1795 if (bfd_get_flavour (ibfd) != bfd_target_ecoff_flavour 1796 || bfd_get_flavour (obfd) != bfd_target_ecoff_flavour) 1797 return TRUE; 1798 1799 /* Copy the GP value and the register masks. */ 1800 ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp; 1801 ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask; 1802 ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask; 1803 for (i = 0; i < 3; i++) 1804 ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i]; 1805 1806 /* Copy the version stamp. */ 1807 oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp; 1808 1809 /* If there are no symbols, don't copy any debugging information. */ 1810 c = bfd_get_symcount (obfd); 1811 sym_ptr_ptr = bfd_get_outsymbols (obfd); 1812 if (c == 0 || sym_ptr_ptr == NULL) 1813 return TRUE; 1814 1815 /* See if there are any local symbols. */ 1816 local = FALSE; 1817 for (; c > 0; c--, sym_ptr_ptr++) 1818 { 1819 if (ecoffsymbol (*sym_ptr_ptr)->local) 1820 { 1821 local = TRUE; 1822 break; 1823 } 1824 } 1825 1826 if (local) 1827 { 1828 /* There are some local symbols. We just bring over all the 1829 debugging information. FIXME: This is not quite the right 1830 thing to do. If the user has asked us to discard all 1831 debugging information, then we are probably going to wind up 1832 keeping it because there will probably be some local symbol 1833 which objcopy did not discard. We should actually break 1834 apart the debugging information and only keep that which 1835 applies to the symbols we want to keep. */ 1836 oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax; 1837 oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine; 1838 oinfo->line = iinfo->line; 1839 1840 oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax; 1841 oinfo->external_dnr = iinfo->external_dnr; 1842 1843 oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax; 1844 oinfo->external_pdr = iinfo->external_pdr; 1845 1846 oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax; 1847 oinfo->external_sym = iinfo->external_sym; 1848 1849 oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax; 1850 oinfo->external_opt = iinfo->external_opt; 1851 1852 oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax; 1853 oinfo->external_aux = iinfo->external_aux; 1854 1855 oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax; 1856 oinfo->ss = iinfo->ss; 1857 1858 oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax; 1859 oinfo->external_fdr = iinfo->external_fdr; 1860 1861 oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd; 1862 oinfo->external_rfd = iinfo->external_rfd; 1863 } 1864 else 1865 { 1866 /* We are discarding all the local symbol information. Look 1867 through the external symbols and remove all references to FDR 1868 or aux information. */ 1869 c = bfd_get_symcount (obfd); 1870 sym_ptr_ptr = bfd_get_outsymbols (obfd); 1871 for (; c > 0; c--, sym_ptr_ptr++) 1872 { 1873 EXTR esym; 1874 1875 (*(ecoff_backend (obfd)->debug_swap.swap_ext_in)) 1876 (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym); 1877 esym.ifd = ifdNil; 1878 esym.asym.index = indexNil; 1879 (*(ecoff_backend (obfd)->debug_swap.swap_ext_out)) 1880 (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native); 1881 } 1882 } 1883 1884 return TRUE; 1885 } 1886 1887 /* Set the architecture. The supported architecture is stored in the 1888 backend pointer. We always set the architecture anyhow, since many 1889 callers ignore the return value. */ 1890 1891 bfd_boolean 1892 _bfd_ecoff_set_arch_mach (bfd *abfd, 1893 enum bfd_architecture arch, 1894 unsigned long machine) 1895 { 1896 bfd_default_set_arch_mach (abfd, arch, machine); 1897 return arch == ecoff_backend (abfd)->arch; 1898 } 1899 1900 /* Get the size of the section headers. */ 1901 1902 int 1903 _bfd_ecoff_sizeof_headers (bfd *abfd, 1904 struct bfd_link_info *info ATTRIBUTE_UNUSED) 1905 { 1906 asection *current; 1907 int c; 1908 int ret; 1909 1910 c = 0; 1911 for (current = abfd->sections; 1912 current != NULL; 1913 current = current->next) 1914 ++c; 1915 1916 ret = (bfd_coff_filhsz (abfd) 1917 + bfd_coff_aoutsz (abfd) 1918 + c * bfd_coff_scnhsz (abfd)); 1919 return (int) BFD_ALIGN (ret, 16); 1920 } 1921 1922 /* Get the contents of a section. */ 1923 1924 bfd_boolean 1925 _bfd_ecoff_get_section_contents (bfd *abfd, 1926 asection *section, 1927 void * location, 1928 file_ptr offset, 1929 bfd_size_type count) 1930 { 1931 return _bfd_generic_get_section_contents (abfd, section, location, 1932 offset, count); 1933 } 1934 1935 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is 1936 called via qsort. */ 1937 1938 static int 1939 ecoff_sort_hdrs (const void * arg1, const void * arg2) 1940 { 1941 const asection *hdr1 = *(const asection **) arg1; 1942 const asection *hdr2 = *(const asection **) arg2; 1943 1944 if ((hdr1->flags & SEC_ALLOC) != 0) 1945 { 1946 if ((hdr2->flags & SEC_ALLOC) == 0) 1947 return -1; 1948 } 1949 else 1950 { 1951 if ((hdr2->flags & SEC_ALLOC) != 0) 1952 return 1; 1953 } 1954 if (hdr1->vma < hdr2->vma) 1955 return -1; 1956 else if (hdr1->vma > hdr2->vma) 1957 return 1; 1958 else 1959 return 0; 1960 } 1961 1962 /* Calculate the file position for each section, and set 1963 reloc_filepos. */ 1964 1965 static bfd_boolean 1966 ecoff_compute_section_file_positions (bfd *abfd) 1967 { 1968 file_ptr sofar, file_sofar; 1969 asection **sorted_hdrs; 1970 asection *current; 1971 unsigned int i; 1972 file_ptr old_sofar; 1973 bfd_boolean rdata_in_text; 1974 bfd_boolean first_data, first_nonalloc; 1975 const bfd_vma round = ecoff_backend (abfd)->round; 1976 bfd_size_type amt; 1977 1978 sofar = _bfd_ecoff_sizeof_headers (abfd, NULL); 1979 file_sofar = sofar; 1980 1981 /* Sort the sections by VMA. */ 1982 amt = abfd->section_count; 1983 amt *= sizeof (asection *); 1984 sorted_hdrs = (asection **) bfd_malloc (amt); 1985 if (sorted_hdrs == NULL) 1986 return FALSE; 1987 for (current = abfd->sections, i = 0; 1988 current != NULL; 1989 current = current->next, i++) 1990 sorted_hdrs[i] = current; 1991 BFD_ASSERT (i == abfd->section_count); 1992 1993 qsort (sorted_hdrs, abfd->section_count, sizeof (asection *), 1994 ecoff_sort_hdrs); 1995 1996 /* Some versions of the OSF linker put the .rdata section in the 1997 text segment, and some do not. */ 1998 rdata_in_text = ecoff_backend (abfd)->rdata_in_text; 1999 if (rdata_in_text) 2000 { 2001 for (i = 0; i < abfd->section_count; i++) 2002 { 2003 current = sorted_hdrs[i]; 2004 if (streq (current->name, _RDATA)) 2005 break; 2006 if ((current->flags & SEC_CODE) == 0 2007 && ! streq (current->name, _PDATA) 2008 && ! streq (current->name, _RCONST)) 2009 { 2010 rdata_in_text = FALSE; 2011 break; 2012 } 2013 } 2014 } 2015 ecoff_data (abfd)->rdata_in_text = rdata_in_text; 2016 2017 first_data = TRUE; 2018 first_nonalloc = TRUE; 2019 for (i = 0; i < abfd->section_count; i++) 2020 { 2021 unsigned int alignment_power; 2022 2023 current = sorted_hdrs[i]; 2024 2025 /* For the Alpha ECOFF .pdata section the lnnoptr field is 2026 supposed to indicate the number of .pdata entries that are 2027 really in the section. Each entry is 8 bytes. We store this 2028 away in line_filepos before increasing the section size. */ 2029 if (streq (current->name, _PDATA)) 2030 current->line_filepos = current->size / 8; 2031 2032 alignment_power = current->alignment_power; 2033 2034 /* On Ultrix, the data sections in an executable file must be 2035 aligned to a page boundary within the file. This does not 2036 affect the section size, though. FIXME: Does this work for 2037 other platforms? It requires some modification for the 2038 Alpha, because .rdata on the Alpha goes with the text, not 2039 the data. */ 2040 if ((abfd->flags & EXEC_P) != 0 2041 && (abfd->flags & D_PAGED) != 0 2042 && ! first_data 2043 && (current->flags & SEC_CODE) == 0 2044 && (! rdata_in_text 2045 || ! streq (current->name, _RDATA)) 2046 && ! streq (current->name, _PDATA) 2047 && ! streq (current->name, _RCONST)) 2048 { 2049 sofar = (sofar + round - 1) &~ (round - 1); 2050 file_sofar = (file_sofar + round - 1) &~ (round - 1); 2051 first_data = FALSE; 2052 } 2053 else if (streq (current->name, _LIB)) 2054 { 2055 /* On Irix 4, the location of contents of the .lib section 2056 from a shared library section is also rounded up to a 2057 page boundary. */ 2058 2059 sofar = (sofar + round - 1) &~ (round - 1); 2060 file_sofar = (file_sofar + round - 1) &~ (round - 1); 2061 } 2062 else if (first_nonalloc 2063 && (current->flags & SEC_ALLOC) == 0 2064 && (abfd->flags & D_PAGED) != 0) 2065 { 2066 /* Skip up to the next page for an unallocated section, such 2067 as the .comment section on the Alpha. This leaves room 2068 for the .bss section. */ 2069 first_nonalloc = FALSE; 2070 sofar = (sofar + round - 1) &~ (round - 1); 2071 file_sofar = (file_sofar + round - 1) &~ (round - 1); 2072 } 2073 2074 /* Align the sections in the file to the same boundary on 2075 which they are aligned in virtual memory. */ 2076 sofar = BFD_ALIGN (sofar, 1 << alignment_power); 2077 if ((current->flags & SEC_HAS_CONTENTS) != 0) 2078 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power); 2079 2080 if ((abfd->flags & D_PAGED) != 0 2081 && (current->flags & SEC_ALLOC) != 0) 2082 { 2083 sofar += (current->vma - sofar) % round; 2084 if ((current->flags & SEC_HAS_CONTENTS) != 0) 2085 file_sofar += (current->vma - file_sofar) % round; 2086 } 2087 2088 if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0) 2089 current->filepos = file_sofar; 2090 2091 sofar += current->size; 2092 if ((current->flags & SEC_HAS_CONTENTS) != 0) 2093 file_sofar += current->size; 2094 2095 /* Make sure that this section is of the right size too. */ 2096 old_sofar = sofar; 2097 sofar = BFD_ALIGN (sofar, 1 << alignment_power); 2098 if ((current->flags & SEC_HAS_CONTENTS) != 0) 2099 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power); 2100 current->size += sofar - old_sofar; 2101 } 2102 2103 free (sorted_hdrs); 2104 sorted_hdrs = NULL; 2105 2106 ecoff_data (abfd)->reloc_filepos = file_sofar; 2107 2108 return TRUE; 2109 } 2110 2111 /* Determine the location of the relocs for all the sections in the 2112 output file, as well as the location of the symbolic debugging 2113 information. */ 2114 2115 static bfd_size_type 2116 ecoff_compute_reloc_file_positions (bfd *abfd) 2117 { 2118 const bfd_size_type external_reloc_size = 2119 ecoff_backend (abfd)->external_reloc_size; 2120 file_ptr reloc_base; 2121 bfd_size_type reloc_size; 2122 asection *current; 2123 file_ptr sym_base; 2124 2125 if (! abfd->output_has_begun) 2126 { 2127 if (! ecoff_compute_section_file_positions (abfd)) 2128 abort (); 2129 abfd->output_has_begun = TRUE; 2130 } 2131 2132 reloc_base = ecoff_data (abfd)->reloc_filepos; 2133 2134 reloc_size = 0; 2135 for (current = abfd->sections; 2136 current != NULL; 2137 current = current->next) 2138 { 2139 if (current->reloc_count == 0) 2140 current->rel_filepos = 0; 2141 else 2142 { 2143 bfd_size_type relsize; 2144 2145 current->rel_filepos = reloc_base; 2146 relsize = current->reloc_count * external_reloc_size; 2147 reloc_size += relsize; 2148 reloc_base += relsize; 2149 } 2150 } 2151 2152 sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size; 2153 2154 /* At least on Ultrix, the symbol table of an executable file must 2155 be aligned to a page boundary. FIXME: Is this true on other 2156 platforms? */ 2157 if ((abfd->flags & EXEC_P) != 0 2158 && (abfd->flags & D_PAGED) != 0) 2159 sym_base = ((sym_base + ecoff_backend (abfd)->round - 1) 2160 &~ (ecoff_backend (abfd)->round - 1)); 2161 2162 ecoff_data (abfd)->sym_filepos = sym_base; 2163 2164 return reloc_size; 2165 } 2166 2167 /* Set the contents of a section. */ 2168 2169 bfd_boolean 2170 _bfd_ecoff_set_section_contents (bfd *abfd, 2171 asection *section, 2172 const void * location, 2173 file_ptr offset, 2174 bfd_size_type count) 2175 { 2176 file_ptr pos; 2177 2178 /* This must be done first, because bfd_set_section_contents is 2179 going to set output_has_begun to TRUE. */ 2180 if (! abfd->output_has_begun 2181 && ! ecoff_compute_section_file_positions (abfd)) 2182 return FALSE; 2183 2184 /* Handle the .lib section specially so that Irix 4 shared libraries 2185 work out. See coff_set_section_contents in coffcode.h. */ 2186 if (streq (section->name, _LIB)) 2187 { 2188 bfd_byte *rec, *recend; 2189 2190 rec = (bfd_byte *) location; 2191 recend = rec + count; 2192 while (rec < recend) 2193 { 2194 ++section->lma; 2195 rec += bfd_get_32 (abfd, rec) * 4; 2196 } 2197 2198 BFD_ASSERT (rec == recend); 2199 } 2200 2201 if (count == 0) 2202 return TRUE; 2203 2204 pos = section->filepos + offset; 2205 if (bfd_seek (abfd, pos, SEEK_SET) != 0 2206 || bfd_bwrite (location, count, abfd) != count) 2207 return FALSE; 2208 2209 return TRUE; 2210 } 2211 2212 /* Get the GP value for an ECOFF file. This is a hook used by 2213 nlmconv. */ 2214 2215 bfd_vma 2216 bfd_ecoff_get_gp_value (bfd *abfd) 2217 { 2218 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour 2219 || bfd_get_format (abfd) != bfd_object) 2220 { 2221 bfd_set_error (bfd_error_invalid_operation); 2222 return 0; 2223 } 2224 2225 return ecoff_data (abfd)->gp; 2226 } 2227 2228 /* Set the GP value for an ECOFF file. This is a hook used by the 2229 assembler. */ 2230 2231 bfd_boolean 2232 bfd_ecoff_set_gp_value (bfd *abfd, bfd_vma gp_value) 2233 { 2234 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour 2235 || bfd_get_format (abfd) != bfd_object) 2236 { 2237 bfd_set_error (bfd_error_invalid_operation); 2238 return FALSE; 2239 } 2240 2241 ecoff_data (abfd)->gp = gp_value; 2242 2243 return TRUE; 2244 } 2245 2246 /* Set the register masks for an ECOFF file. This is a hook used by 2247 the assembler. */ 2248 2249 bfd_boolean 2250 bfd_ecoff_set_regmasks (bfd *abfd, 2251 unsigned long gprmask, 2252 unsigned long fprmask, 2253 unsigned long *cprmask) 2254 { 2255 ecoff_data_type *tdata; 2256 2257 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour 2258 || bfd_get_format (abfd) != bfd_object) 2259 { 2260 bfd_set_error (bfd_error_invalid_operation); 2261 return FALSE; 2262 } 2263 2264 tdata = ecoff_data (abfd); 2265 tdata->gprmask = gprmask; 2266 tdata->fprmask = fprmask; 2267 if (cprmask != NULL) 2268 { 2269 int i; 2270 2271 for (i = 0; i < 3; i++) 2272 tdata->cprmask[i] = cprmask[i]; 2273 } 2274 2275 return TRUE; 2276 } 2277 2278 /* Get ECOFF EXTR information for an external symbol. This function 2279 is passed to bfd_ecoff_debug_externals. */ 2280 2281 static bfd_boolean 2282 ecoff_get_extr (asymbol *sym, EXTR *esym) 2283 { 2284 ecoff_symbol_type *ecoff_sym_ptr; 2285 bfd *input_bfd; 2286 2287 if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour 2288 || ecoffsymbol (sym)->native == NULL) 2289 { 2290 /* Don't include debugging, local, or section symbols. */ 2291 if ((sym->flags & BSF_DEBUGGING) != 0 2292 || (sym->flags & BSF_LOCAL) != 0 2293 || (sym->flags & BSF_SECTION_SYM) != 0) 2294 return FALSE; 2295 2296 esym->jmptbl = 0; 2297 esym->cobol_main = 0; 2298 esym->weakext = (sym->flags & BSF_WEAK) != 0; 2299 esym->reserved = 0; 2300 esym->ifd = ifdNil; 2301 /* FIXME: we can do better than this for st and sc. */ 2302 esym->asym.st = stGlobal; 2303 esym->asym.sc = scAbs; 2304 esym->asym.reserved = 0; 2305 esym->asym.index = indexNil; 2306 return TRUE; 2307 } 2308 2309 ecoff_sym_ptr = ecoffsymbol (sym); 2310 2311 if (ecoff_sym_ptr->local) 2312 return FALSE; 2313 2314 input_bfd = bfd_asymbol_bfd (sym); 2315 (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in)) 2316 (input_bfd, ecoff_sym_ptr->native, esym); 2317 2318 /* If the symbol was defined by the linker, then esym will be 2319 undefined but sym will not be. Get a better class for such a 2320 symbol. */ 2321 if ((esym->asym.sc == scUndefined 2322 || esym->asym.sc == scSUndefined) 2323 && ! bfd_is_und_section (bfd_get_section (sym))) 2324 esym->asym.sc = scAbs; 2325 2326 /* Adjust the FDR index for the symbol by that used for the input 2327 BFD. */ 2328 if (esym->ifd != -1) 2329 { 2330 struct ecoff_debug_info *input_debug; 2331 2332 input_debug = &ecoff_data (input_bfd)->debug_info; 2333 BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax); 2334 if (input_debug->ifdmap != NULL) 2335 esym->ifd = input_debug->ifdmap[esym->ifd]; 2336 } 2337 2338 return TRUE; 2339 } 2340 2341 /* Set the external symbol index. This routine is passed to 2342 bfd_ecoff_debug_externals. */ 2343 2344 static void 2345 ecoff_set_index (asymbol *sym, bfd_size_type indx) 2346 { 2347 ecoff_set_sym_index (sym, indx); 2348 } 2349 2350 /* Write out an ECOFF file. */ 2351 2352 bfd_boolean 2353 _bfd_ecoff_write_object_contents (bfd *abfd) 2354 { 2355 const struct ecoff_backend_data * const backend = ecoff_backend (abfd); 2356 const bfd_vma round = backend->round; 2357 const bfd_size_type filhsz = bfd_coff_filhsz (abfd); 2358 const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd); 2359 const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd); 2360 const bfd_size_type external_hdr_size 2361 = backend->debug_swap.external_hdr_size; 2362 const bfd_size_type external_reloc_size = backend->external_reloc_size; 2363 void (* const adjust_reloc_out) (bfd *, const arelent *, struct internal_reloc *) 2364 = backend->adjust_reloc_out; 2365 void (* const swap_reloc_out) (bfd *, const struct internal_reloc *, void *) 2366 = backend->swap_reloc_out; 2367 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info; 2368 HDRR * const symhdr = &debug->symbolic_header; 2369 asection *current; 2370 unsigned int count; 2371 bfd_size_type reloc_size; 2372 bfd_size_type text_size; 2373 bfd_vma text_start; 2374 bfd_boolean set_text_start; 2375 bfd_size_type data_size; 2376 bfd_vma data_start; 2377 bfd_boolean set_data_start; 2378 bfd_size_type bss_size; 2379 void * buff = NULL; 2380 void * reloc_buff = NULL; 2381 struct internal_filehdr internal_f; 2382 struct internal_aouthdr internal_a; 2383 int i; 2384 2385 /* Determine where the sections and relocs will go in the output 2386 file. */ 2387 reloc_size = ecoff_compute_reloc_file_positions (abfd); 2388 2389 count = 1; 2390 for (current = abfd->sections; 2391 current != NULL; 2392 current = current->next) 2393 { 2394 current->target_index = count; 2395 ++count; 2396 } 2397 2398 if ((abfd->flags & D_PAGED) != 0) 2399 text_size = _bfd_ecoff_sizeof_headers (abfd, NULL); 2400 else 2401 text_size = 0; 2402 text_start = 0; 2403 set_text_start = FALSE; 2404 data_size = 0; 2405 data_start = 0; 2406 set_data_start = FALSE; 2407 bss_size = 0; 2408 2409 /* Write section headers to the file. */ 2410 2411 /* Allocate buff big enough to hold a section header, 2412 file header, or a.out header. */ 2413 { 2414 bfd_size_type siz; 2415 2416 siz = scnhsz; 2417 if (siz < filhsz) 2418 siz = filhsz; 2419 if (siz < aoutsz) 2420 siz = aoutsz; 2421 buff = bfd_malloc (siz); 2422 if (buff == NULL) 2423 goto error_return; 2424 } 2425 2426 internal_f.f_nscns = 0; 2427 if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0) 2428 goto error_return; 2429 2430 for (current = abfd->sections; 2431 current != NULL; 2432 current = current->next) 2433 { 2434 struct internal_scnhdr section; 2435 bfd_vma vma; 2436 2437 ++internal_f.f_nscns; 2438 2439 strncpy (section.s_name, current->name, sizeof section.s_name); 2440 2441 /* This seems to be correct for Irix 4 shared libraries. */ 2442 vma = bfd_get_section_vma (abfd, current); 2443 if (streq (current->name, _LIB)) 2444 section.s_vaddr = 0; 2445 else 2446 section.s_vaddr = vma; 2447 2448 section.s_paddr = current->lma; 2449 section.s_size = current->size; 2450 2451 /* If this section is unloadable then the scnptr will be 0. */ 2452 if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) 2453 section.s_scnptr = 0; 2454 else 2455 section.s_scnptr = current->filepos; 2456 section.s_relptr = current->rel_filepos; 2457 2458 /* FIXME: the lnnoptr of the .sbss or .sdata section of an 2459 object file produced by the assembler is supposed to point to 2460 information about how much room is required by objects of 2461 various different sizes. I think this only matters if we 2462 want the linker to compute the best size to use, or 2463 something. I don't know what happens if the information is 2464 not present. */ 2465 if (! streq (current->name, _PDATA)) 2466 section.s_lnnoptr = 0; 2467 else 2468 { 2469 /* The Alpha ECOFF .pdata section uses the lnnoptr field to 2470 hold the number of entries in the section (each entry is 2471 8 bytes). We stored this in the line_filepos field in 2472 ecoff_compute_section_file_positions. */ 2473 section.s_lnnoptr = current->line_filepos; 2474 } 2475 2476 section.s_nreloc = current->reloc_count; 2477 section.s_nlnno = 0; 2478 section.s_flags = ecoff_sec_to_styp_flags (current->name, 2479 current->flags); 2480 2481 if (bfd_coff_swap_scnhdr_out (abfd, (void *) §ion, buff) == 0 2482 || bfd_bwrite (buff, scnhsz, abfd) != scnhsz) 2483 goto error_return; 2484 2485 if ((section.s_flags & STYP_TEXT) != 0 2486 || ((section.s_flags & STYP_RDATA) != 0 2487 && ecoff_data (abfd)->rdata_in_text) 2488 || section.s_flags == STYP_PDATA 2489 || (section.s_flags & STYP_DYNAMIC) != 0 2490 || (section.s_flags & STYP_LIBLIST) != 0 2491 || (section.s_flags & STYP_RELDYN) != 0 2492 || section.s_flags == STYP_CONFLIC 2493 || (section.s_flags & STYP_DYNSTR) != 0 2494 || (section.s_flags & STYP_DYNSYM) != 0 2495 || (section.s_flags & STYP_HASH) != 0 2496 || (section.s_flags & STYP_ECOFF_INIT) != 0 2497 || (section.s_flags & STYP_ECOFF_FINI) != 0 2498 || section.s_flags == STYP_RCONST) 2499 { 2500 text_size += current->size; 2501 if (! set_text_start || text_start > vma) 2502 { 2503 text_start = vma; 2504 set_text_start = TRUE; 2505 } 2506 } 2507 else if ((section.s_flags & STYP_RDATA) != 0 2508 || (section.s_flags & STYP_DATA) != 0 2509 || (section.s_flags & STYP_LITA) != 0 2510 || (section.s_flags & STYP_LIT8) != 0 2511 || (section.s_flags & STYP_LIT4) != 0 2512 || (section.s_flags & STYP_SDATA) != 0 2513 || section.s_flags == STYP_XDATA 2514 || (section.s_flags & STYP_GOT) != 0) 2515 { 2516 data_size += current->size; 2517 if (! set_data_start || data_start > vma) 2518 { 2519 data_start = vma; 2520 set_data_start = TRUE; 2521 } 2522 } 2523 else if ((section.s_flags & STYP_BSS) != 0 2524 || (section.s_flags & STYP_SBSS) != 0) 2525 bss_size += current->size; 2526 else if (section.s_flags == 0 2527 || (section.s_flags & STYP_ECOFF_LIB) != 0 2528 || section.s_flags == STYP_COMMENT) 2529 /* Do nothing. */ ; 2530 else 2531 abort (); 2532 } 2533 2534 /* Set up the file header. */ 2535 internal_f.f_magic = ecoff_get_magic (abfd); 2536 2537 /* We will NOT put a fucking timestamp in the header here. Every 2538 time you put it back, I will come in and take it out again. I'm 2539 sorry. This field does not belong here. We fill it with a 0 so 2540 it compares the same but is not a reasonable time. -- 2541 gnu@cygnus.com. */ 2542 internal_f.f_timdat = 0; 2543 2544 if (bfd_get_symcount (abfd) != 0) 2545 { 2546 /* The ECOFF f_nsyms field is not actually the number of 2547 symbols, it's the size of symbolic information header. */ 2548 internal_f.f_nsyms = external_hdr_size; 2549 internal_f.f_symptr = ecoff_data (abfd)->sym_filepos; 2550 } 2551 else 2552 { 2553 internal_f.f_nsyms = 0; 2554 internal_f.f_symptr = 0; 2555 } 2556 2557 internal_f.f_opthdr = aoutsz; 2558 2559 internal_f.f_flags = F_LNNO; 2560 if (reloc_size == 0) 2561 internal_f.f_flags |= F_RELFLG; 2562 if (bfd_get_symcount (abfd) == 0) 2563 internal_f.f_flags |= F_LSYMS; 2564 if (abfd->flags & EXEC_P) 2565 internal_f.f_flags |= F_EXEC; 2566 2567 if (bfd_little_endian (abfd)) 2568 internal_f.f_flags |= F_AR32WR; 2569 else 2570 internal_f.f_flags |= F_AR32W; 2571 2572 /* Set up the ``optional'' header. */ 2573 if ((abfd->flags & D_PAGED) != 0) 2574 internal_a.magic = ECOFF_AOUT_ZMAGIC; 2575 else 2576 internal_a.magic = ECOFF_AOUT_OMAGIC; 2577 2578 /* FIXME: Is this really correct? */ 2579 internal_a.vstamp = symhdr->vstamp; 2580 2581 /* At least on Ultrix, these have to be rounded to page boundaries. 2582 FIXME: Is this true on other platforms? */ 2583 if ((abfd->flags & D_PAGED) != 0) 2584 { 2585 internal_a.tsize = (text_size + round - 1) &~ (round - 1); 2586 internal_a.text_start = text_start &~ (round - 1); 2587 internal_a.dsize = (data_size + round - 1) &~ (round - 1); 2588 internal_a.data_start = data_start &~ (round - 1); 2589 } 2590 else 2591 { 2592 internal_a.tsize = text_size; 2593 internal_a.text_start = text_start; 2594 internal_a.dsize = data_size; 2595 internal_a.data_start = data_start; 2596 } 2597 2598 /* On Ultrix, the initial portions of the .sbss and .bss segments 2599 are at the end of the data section. The bsize field in the 2600 optional header records how many bss bytes are required beyond 2601 those in the data section. The value is not rounded to a page 2602 boundary. */ 2603 if (bss_size < internal_a.dsize - data_size) 2604 bss_size = 0; 2605 else 2606 bss_size -= internal_a.dsize - data_size; 2607 internal_a.bsize = bss_size; 2608 internal_a.bss_start = internal_a.data_start + internal_a.dsize; 2609 2610 internal_a.entry = bfd_get_start_address (abfd); 2611 2612 internal_a.gp_value = ecoff_data (abfd)->gp; 2613 2614 internal_a.gprmask = ecoff_data (abfd)->gprmask; 2615 internal_a.fprmask = ecoff_data (abfd)->fprmask; 2616 for (i = 0; i < 4; i++) 2617 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i]; 2618 2619 /* Let the backend adjust the headers if necessary. */ 2620 if (backend->adjust_headers) 2621 { 2622 if (! (*backend->adjust_headers) (abfd, &internal_f, &internal_a)) 2623 goto error_return; 2624 } 2625 2626 /* Write out the file header and the optional header. */ 2627 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) 2628 goto error_return; 2629 2630 bfd_coff_swap_filehdr_out (abfd, (void *) &internal_f, buff); 2631 if (bfd_bwrite (buff, filhsz, abfd) != filhsz) 2632 goto error_return; 2633 2634 bfd_coff_swap_aouthdr_out (abfd, (void *) &internal_a, buff); 2635 if (bfd_bwrite (buff, aoutsz, abfd) != aoutsz) 2636 goto error_return; 2637 2638 /* Build the external symbol information. This must be done before 2639 writing out the relocs so that we know the symbol indices. We 2640 don't do this if this BFD was created by the backend linker, 2641 since it will have already handled the symbols and relocs. */ 2642 if (! ecoff_data (abfd)->linker) 2643 { 2644 symhdr->iextMax = 0; 2645 symhdr->issExtMax = 0; 2646 debug->external_ext = debug->external_ext_end = NULL; 2647 debug->ssext = debug->ssext_end = NULL; 2648 if (! bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap, 2649 (abfd->flags & EXEC_P) == 0, 2650 ecoff_get_extr, ecoff_set_index)) 2651 goto error_return; 2652 2653 /* Write out the relocs. */ 2654 for (current = abfd->sections; 2655 current != NULL; 2656 current = current->next) 2657 { 2658 arelent **reloc_ptr_ptr; 2659 arelent **reloc_end; 2660 char *out_ptr; 2661 bfd_size_type amt; 2662 2663 if (current->reloc_count == 0) 2664 continue; 2665 2666 amt = current->reloc_count * external_reloc_size; 2667 reloc_buff = bfd_alloc (abfd, amt); 2668 if (reloc_buff == NULL) 2669 goto error_return; 2670 2671 reloc_ptr_ptr = current->orelocation; 2672 reloc_end = reloc_ptr_ptr + current->reloc_count; 2673 out_ptr = (char *) reloc_buff; 2674 2675 for (; 2676 reloc_ptr_ptr < reloc_end; 2677 reloc_ptr_ptr++, out_ptr += external_reloc_size) 2678 { 2679 arelent *reloc; 2680 asymbol *sym; 2681 struct internal_reloc in; 2682 2683 memset ((void *) &in, 0, sizeof in); 2684 2685 reloc = *reloc_ptr_ptr; 2686 sym = *reloc->sym_ptr_ptr; 2687 2688 /* If the howto field has not been initialised then skip this reloc. 2689 This assumes that an error message has been issued elsewhere. */ 2690 if (reloc->howto == NULL) 2691 continue; 2692 2693 in.r_vaddr = (reloc->address 2694 + bfd_get_section_vma (abfd, current)); 2695 in.r_type = reloc->howto->type; 2696 2697 if ((sym->flags & BSF_SECTION_SYM) == 0) 2698 { 2699 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr); 2700 in.r_extern = 1; 2701 } 2702 else 2703 { 2704 const char *name; 2705 unsigned int j; 2706 static struct 2707 { 2708 const char * name; 2709 long r_symndx; 2710 } 2711 section_symndx [] = 2712 { 2713 { _TEXT, RELOC_SECTION_TEXT }, 2714 { _RDATA, RELOC_SECTION_RDATA }, 2715 { _DATA, RELOC_SECTION_DATA }, 2716 { _SDATA, RELOC_SECTION_SDATA }, 2717 { _SBSS, RELOC_SECTION_SBSS }, 2718 { _BSS, RELOC_SECTION_BSS }, 2719 { _INIT, RELOC_SECTION_INIT }, 2720 { _LIT8, RELOC_SECTION_LIT8 }, 2721 { _LIT4, RELOC_SECTION_LIT4 }, 2722 { _XDATA, RELOC_SECTION_XDATA }, 2723 { _PDATA, RELOC_SECTION_PDATA }, 2724 { _FINI, RELOC_SECTION_FINI }, 2725 { _LITA, RELOC_SECTION_LITA }, 2726 { "*ABS*", RELOC_SECTION_ABS }, 2727 { _RCONST, RELOC_SECTION_RCONST } 2728 }; 2729 2730 name = bfd_get_section_name (abfd, bfd_get_section (sym)); 2731 2732 for (j = 0; j < ARRAY_SIZE (section_symndx); j++) 2733 if (streq (name, section_symndx[j].name)) 2734 { 2735 in.r_symndx = section_symndx[j].r_symndx; 2736 break; 2737 } 2738 2739 if (j == ARRAY_SIZE (section_symndx)) 2740 abort (); 2741 in.r_extern = 0; 2742 } 2743 2744 (*adjust_reloc_out) (abfd, reloc, &in); 2745 2746 (*swap_reloc_out) (abfd, &in, (void *) out_ptr); 2747 } 2748 2749 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0) 2750 goto error_return; 2751 amt = current->reloc_count * external_reloc_size; 2752 if (bfd_bwrite (reloc_buff, amt, abfd) != amt) 2753 goto error_return; 2754 bfd_release (abfd, reloc_buff); 2755 reloc_buff = NULL; 2756 } 2757 2758 /* Write out the symbolic debugging information. */ 2759 if (bfd_get_symcount (abfd) > 0) 2760 { 2761 /* Write out the debugging information. */ 2762 if (! bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap, 2763 ecoff_data (abfd)->sym_filepos)) 2764 goto error_return; 2765 } 2766 } 2767 2768 /* The .bss section of a demand paged executable must receive an 2769 entire page. If there are symbols, the symbols will start on the 2770 next page. If there are no symbols, we must fill out the page by 2771 hand. */ 2772 if (bfd_get_symcount (abfd) == 0 2773 && (abfd->flags & EXEC_P) != 0 2774 && (abfd->flags & D_PAGED) != 0) 2775 { 2776 char c; 2777 2778 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1, 2779 SEEK_SET) != 0) 2780 goto error_return; 2781 if (bfd_bread (&c, (bfd_size_type) 1, abfd) == 0) 2782 c = 0; 2783 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1, 2784 SEEK_SET) != 0) 2785 goto error_return; 2786 if (bfd_bwrite (&c, (bfd_size_type) 1, abfd) != 1) 2787 goto error_return; 2788 } 2789 2790 if (reloc_buff != NULL) 2791 bfd_release (abfd, reloc_buff); 2792 if (buff != NULL) 2793 free (buff); 2794 return TRUE; 2795 error_return: 2796 if (reloc_buff != NULL) 2797 bfd_release (abfd, reloc_buff); 2798 if (buff != NULL) 2799 free (buff); 2800 return FALSE; 2801 } 2802 2803 /* Archive handling. ECOFF uses what appears to be a unique type of 2804 archive header (armap). The byte ordering of the armap and the 2805 contents are encoded in the name of the armap itself. At least for 2806 now, we only support archives with the same byte ordering in the 2807 armap and the contents. 2808 2809 The first four bytes in the armap are the number of symbol 2810 definitions. This is always a power of two. 2811 2812 This is followed by the symbol definitions. Each symbol definition 2813 occupies 8 bytes. The first four bytes are the offset from the 2814 start of the armap strings to the null-terminated string naming 2815 this symbol. The second four bytes are the file offset to the 2816 archive member which defines this symbol. If the second four bytes 2817 are 0, then this is not actually a symbol definition, and it should 2818 be ignored. 2819 2820 The symbols are hashed into the armap with a closed hashing scheme. 2821 See the functions below for the details of the algorithm. 2822 2823 After the symbol definitions comes four bytes holding the size of 2824 the string table, followed by the string table itself. */ 2825 2826 /* The name of an archive headers looks like this: 2827 __________E[BL]E[BL]_ (with a trailing space). 2828 The trailing space is changed to an X if the archive is changed to 2829 indicate that the armap is out of date. 2830 2831 The Alpha seems to use ________64E[BL]E[BL]_. */ 2832 2833 #define ARMAP_BIG_ENDIAN 'B' 2834 #define ARMAP_LITTLE_ENDIAN 'L' 2835 #define ARMAP_MARKER 'E' 2836 #define ARMAP_START_LENGTH 10 2837 #define ARMAP_HEADER_MARKER_INDEX 10 2838 #define ARMAP_HEADER_ENDIAN_INDEX 11 2839 #define ARMAP_OBJECT_MARKER_INDEX 12 2840 #define ARMAP_OBJECT_ENDIAN_INDEX 13 2841 #define ARMAP_END_INDEX 14 2842 #define ARMAP_END "_ " 2843 2844 /* This is a magic number used in the hashing algorithm. */ 2845 #define ARMAP_HASH_MAGIC 0x9dd68ab5 2846 2847 /* This returns the hash value to use for a string. It also sets 2848 *REHASH to the rehash adjustment if the first slot is taken. SIZE 2849 is the number of entries in the hash table, and HLOG is the log 2850 base 2 of SIZE. */ 2851 2852 static unsigned int 2853 ecoff_armap_hash (const char *s, 2854 unsigned int *rehash, 2855 unsigned int size, 2856 unsigned int hlog) 2857 { 2858 unsigned int hash; 2859 2860 if (hlog == 0) 2861 return 0; 2862 hash = *s++; 2863 while (*s != '\0') 2864 hash = ((hash >> 27) | (hash << 5)) + *s++; 2865 hash *= ARMAP_HASH_MAGIC; 2866 *rehash = (hash & (size - 1)) | 1; 2867 return hash >> (32 - hlog); 2868 } 2869 2870 /* Read in the armap. */ 2871 2872 bfd_boolean 2873 _bfd_ecoff_slurp_armap (bfd *abfd) 2874 { 2875 char nextname[17]; 2876 unsigned int i; 2877 struct areltdata *mapdata; 2878 bfd_size_type parsed_size; 2879 char *raw_armap; 2880 struct artdata *ardata; 2881 unsigned int count; 2882 char *raw_ptr; 2883 carsym *symdef_ptr; 2884 char *stringbase; 2885 bfd_size_type amt; 2886 2887 /* Get the name of the first element. */ 2888 i = bfd_bread ((void *) nextname, (bfd_size_type) 16, abfd); 2889 if (i == 0) 2890 return TRUE; 2891 if (i != 16) 2892 return FALSE; 2893 2894 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0) 2895 return FALSE; 2896 2897 /* Irix 4.0.5F apparently can use either an ECOFF armap or a 2898 standard COFF armap. We could move the ECOFF armap stuff into 2899 bfd_slurp_armap, but that seems inappropriate since no other 2900 target uses this format. Instead, we check directly for a COFF 2901 armap. */ 2902 if (CONST_STRNEQ (nextname, "/ ")) 2903 return bfd_slurp_armap (abfd); 2904 2905 /* See if the first element is an armap. */ 2906 if (! strneq (nextname, ecoff_backend (abfd)->armap_start, ARMAP_START_LENGTH) 2907 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER 2908 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN 2909 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN) 2910 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER 2911 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN 2912 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN) 2913 || ! strneq (nextname + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1)) 2914 { 2915 bfd_has_map (abfd) = FALSE; 2916 return TRUE; 2917 } 2918 2919 /* Make sure we have the right byte ordering. */ 2920 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN) 2921 ^ (bfd_header_big_endian (abfd))) 2922 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN) 2923 ^ (bfd_big_endian (abfd)))) 2924 { 2925 bfd_set_error (bfd_error_wrong_format); 2926 return FALSE; 2927 } 2928 2929 /* Read in the armap. */ 2930 ardata = bfd_ardata (abfd); 2931 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 2932 if (mapdata == NULL) 2933 return FALSE; 2934 parsed_size = mapdata->parsed_size; 2935 free (mapdata); 2936 2937 raw_armap = (char *) bfd_alloc (abfd, parsed_size); 2938 if (raw_armap == NULL) 2939 return FALSE; 2940 2941 if (bfd_bread ((void *) raw_armap, parsed_size, abfd) != parsed_size) 2942 { 2943 if (bfd_get_error () != bfd_error_system_call) 2944 bfd_set_error (bfd_error_malformed_archive); 2945 bfd_release (abfd, (void *) raw_armap); 2946 return FALSE; 2947 } 2948 2949 ardata->tdata = (void *) raw_armap; 2950 2951 count = H_GET_32 (abfd, raw_armap); 2952 2953 ardata->symdef_count = 0; 2954 ardata->cache = NULL; 2955 2956 /* This code used to overlay the symdefs over the raw archive data, 2957 but that doesn't work on a 64 bit host. */ 2958 stringbase = raw_armap + count * 8 + 8; 2959 2960 #ifdef CHECK_ARMAP_HASH 2961 { 2962 unsigned int hlog; 2963 2964 /* Double check that I have the hashing algorithm right by making 2965 sure that every symbol can be looked up successfully. */ 2966 hlog = 0; 2967 for (i = 1; i < count; i <<= 1) 2968 hlog++; 2969 BFD_ASSERT (i == count); 2970 2971 raw_ptr = raw_armap + 4; 2972 for (i = 0; i < count; i++, raw_ptr += 8) 2973 { 2974 unsigned int name_offset, file_offset; 2975 unsigned int hash, rehash, srch; 2976 2977 name_offset = H_GET_32 (abfd, raw_ptr); 2978 file_offset = H_GET_32 (abfd, (raw_ptr + 4)); 2979 if (file_offset == 0) 2980 continue; 2981 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count, 2982 hlog); 2983 if (hash == i) 2984 continue; 2985 2986 /* See if we can rehash to this location. */ 2987 for (srch = (hash + rehash) & (count - 1); 2988 srch != hash && srch != i; 2989 srch = (srch + rehash) & (count - 1)) 2990 BFD_ASSERT (H_GET_32 (abfd, (raw_armap + 8 + srch * 8)) != 0); 2991 BFD_ASSERT (srch == i); 2992 } 2993 } 2994 2995 #endif /* CHECK_ARMAP_HASH */ 2996 2997 raw_ptr = raw_armap + 4; 2998 for (i = 0; i < count; i++, raw_ptr += 8) 2999 if (H_GET_32 (abfd, (raw_ptr + 4)) != 0) 3000 ++ardata->symdef_count; 3001 3002 amt = ardata->symdef_count; 3003 amt *= sizeof (carsym); 3004 symdef_ptr = (carsym *) bfd_alloc (abfd, amt); 3005 if (!symdef_ptr) 3006 return FALSE; 3007 3008 ardata->symdefs = symdef_ptr; 3009 3010 raw_ptr = raw_armap + 4; 3011 for (i = 0; i < count; i++, raw_ptr += 8) 3012 { 3013 unsigned int name_offset, file_offset; 3014 3015 file_offset = H_GET_32 (abfd, (raw_ptr + 4)); 3016 if (file_offset == 0) 3017 continue; 3018 name_offset = H_GET_32 (abfd, raw_ptr); 3019 symdef_ptr->name = stringbase + name_offset; 3020 symdef_ptr->file_offset = file_offset; 3021 ++symdef_ptr; 3022 } 3023 3024 ardata->first_file_filepos = bfd_tell (abfd); 3025 /* Pad to an even boundary. */ 3026 ardata->first_file_filepos += ardata->first_file_filepos % 2; 3027 3028 bfd_has_map (abfd) = TRUE; 3029 3030 return TRUE; 3031 } 3032 3033 /* Write out an armap. */ 3034 3035 bfd_boolean 3036 _bfd_ecoff_write_armap (bfd *abfd, 3037 unsigned int elength, 3038 struct orl *map, 3039 unsigned int orl_count, 3040 int stridx) 3041 { 3042 unsigned int hashsize, hashlog; 3043 bfd_size_type symdefsize; 3044 int padit; 3045 unsigned int stringsize; 3046 unsigned int mapsize; 3047 file_ptr firstreal; 3048 struct ar_hdr hdr; 3049 struct stat statbuf; 3050 unsigned int i; 3051 bfd_byte temp[4]; 3052 bfd_byte *hashtable; 3053 bfd *current; 3054 bfd *last_elt; 3055 3056 /* Ultrix appears to use as a hash table size the least power of two 3057 greater than twice the number of entries. */ 3058 for (hashlog = 0; ((unsigned int) 1 << hashlog) <= 2 * orl_count; hashlog++) 3059 ; 3060 hashsize = 1 << hashlog; 3061 3062 symdefsize = hashsize * 8; 3063 padit = stridx % 2; 3064 stringsize = stridx + padit; 3065 3066 /* Include 8 bytes to store symdefsize and stringsize in output. */ 3067 mapsize = symdefsize + stringsize + 8; 3068 3069 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength; 3070 3071 memset ((void *) &hdr, 0, sizeof hdr); 3072 3073 /* Work out the ECOFF armap name. */ 3074 strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start); 3075 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER; 3076 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] = 3077 (bfd_header_big_endian (abfd) 3078 ? ARMAP_BIG_ENDIAN 3079 : ARMAP_LITTLE_ENDIAN); 3080 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER; 3081 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] = 3082 bfd_big_endian (abfd) ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN; 3083 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1); 3084 3085 /* Write the timestamp of the archive header to be just a little bit 3086 later than the timestamp of the file, otherwise the linker will 3087 complain that the index is out of date. Actually, the Ultrix 3088 linker just checks the archive name; the GNU linker may check the 3089 date. */ 3090 stat (abfd->filename, &statbuf); 3091 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld", 3092 (long) (statbuf.st_mtime + 60)); 3093 3094 /* The DECstation uses zeroes for the uid, gid and mode of the 3095 armap. */ 3096 hdr.ar_uid[0] = '0'; 3097 hdr.ar_gid[0] = '0'; 3098 /* Building gcc ends up extracting the armap as a file - twice. */ 3099 hdr.ar_mode[0] = '6'; 3100 hdr.ar_mode[1] = '4'; 3101 hdr.ar_mode[2] = '4'; 3102 3103 _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld", mapsize); 3104 3105 hdr.ar_fmag[0] = '`'; 3106 hdr.ar_fmag[1] = '\012'; 3107 3108 /* Turn all null bytes in the header into spaces. */ 3109 for (i = 0; i < sizeof (struct ar_hdr); i++) 3110 if (((char *) (&hdr))[i] == '\0') 3111 (((char *) (&hdr))[i]) = ' '; 3112 3113 if (bfd_bwrite ((void *) &hdr, (bfd_size_type) sizeof (struct ar_hdr), abfd) 3114 != sizeof (struct ar_hdr)) 3115 return FALSE; 3116 3117 H_PUT_32 (abfd, hashsize, temp); 3118 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4) 3119 return FALSE; 3120 3121 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize); 3122 if (!hashtable) 3123 return FALSE; 3124 3125 current = abfd->archive_head; 3126 last_elt = current; 3127 for (i = 0; i < orl_count; i++) 3128 { 3129 unsigned int hash, rehash = 0; 3130 3131 /* Advance firstreal to the file position of this archive 3132 element. */ 3133 if (map[i].u.abfd != last_elt) 3134 { 3135 do 3136 { 3137 firstreal += arelt_size (current) + sizeof (struct ar_hdr); 3138 firstreal += firstreal % 2; 3139 current = current->archive_next; 3140 } 3141 while (current != map[i].u.abfd); 3142 } 3143 3144 last_elt = current; 3145 3146 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog); 3147 if (H_GET_32 (abfd, (hashtable + (hash * 8) + 4)) != 0) 3148 { 3149 unsigned int srch; 3150 3151 /* The desired slot is already taken. */ 3152 for (srch = (hash + rehash) & (hashsize - 1); 3153 srch != hash; 3154 srch = (srch + rehash) & (hashsize - 1)) 3155 if (H_GET_32 (abfd, (hashtable + (srch * 8) + 4)) == 0) 3156 break; 3157 3158 BFD_ASSERT (srch != hash); 3159 3160 hash = srch; 3161 } 3162 3163 H_PUT_32 (abfd, map[i].namidx, (hashtable + hash * 8)); 3164 H_PUT_32 (abfd, firstreal, (hashtable + hash * 8 + 4)); 3165 } 3166 3167 if (bfd_bwrite ((void *) hashtable, symdefsize, abfd) != symdefsize) 3168 return FALSE; 3169 3170 bfd_release (abfd, hashtable); 3171 3172 /* Now write the strings. */ 3173 H_PUT_32 (abfd, stringsize, temp); 3174 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4) 3175 return FALSE; 3176 for (i = 0; i < orl_count; i++) 3177 { 3178 bfd_size_type len; 3179 3180 len = strlen (*map[i].name) + 1; 3181 if (bfd_bwrite ((void *) (*map[i].name), len, abfd) != len) 3182 return FALSE; 3183 } 3184 3185 /* The spec sez this should be a newline. But in order to be 3186 bug-compatible for DECstation ar we use a null. */ 3187 if (padit) 3188 { 3189 if (bfd_bwrite ("", (bfd_size_type) 1, abfd) != 1) 3190 return FALSE; 3191 } 3192 3193 return TRUE; 3194 } 3195 3196 /* ECOFF linker code. */ 3197 3198 /* Routine to create an entry in an ECOFF link hash table. */ 3199 3200 static struct bfd_hash_entry * 3201 ecoff_link_hash_newfunc (struct bfd_hash_entry *entry, 3202 struct bfd_hash_table *table, 3203 const char *string) 3204 { 3205 struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry; 3206 3207 /* Allocate the structure if it has not already been allocated by a 3208 subclass. */ 3209 if (ret == NULL) 3210 ret = ((struct ecoff_link_hash_entry *) 3211 bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry))); 3212 if (ret == NULL) 3213 return NULL; 3214 3215 /* Call the allocation method of the superclass. */ 3216 ret = ((struct ecoff_link_hash_entry *) 3217 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, 3218 table, string)); 3219 3220 if (ret) 3221 { 3222 /* Set local fields. */ 3223 ret->indx = -1; 3224 ret->abfd = NULL; 3225 ret->written = 0; 3226 ret->small = 0; 3227 } 3228 memset ((void *) &ret->esym, 0, sizeof ret->esym); 3229 3230 return (struct bfd_hash_entry *) ret; 3231 } 3232 3233 /* Create an ECOFF link hash table. */ 3234 3235 struct bfd_link_hash_table * 3236 _bfd_ecoff_bfd_link_hash_table_create (bfd *abfd) 3237 { 3238 struct ecoff_link_hash_table *ret; 3239 bfd_size_type amt = sizeof (struct ecoff_link_hash_table); 3240 3241 ret = (struct ecoff_link_hash_table *) bfd_malloc (amt); 3242 if (ret == NULL) 3243 return NULL; 3244 if (!_bfd_link_hash_table_init (&ret->root, abfd, 3245 ecoff_link_hash_newfunc, 3246 sizeof (struct ecoff_link_hash_entry))) 3247 { 3248 free (ret); 3249 return NULL; 3250 } 3251 return &ret->root; 3252 } 3253 3254 /* Look up an entry in an ECOFF link hash table. */ 3255 3256 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \ 3257 ((struct ecoff_link_hash_entry *) \ 3258 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow))) 3259 3260 /* Get the ECOFF link hash table from the info structure. This is 3261 just a cast. */ 3262 3263 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash)) 3264 3265 /* Add the external symbols of an object file to the global linker 3266 hash table. The external symbols and strings we are passed are 3267 just allocated on the stack, and will be discarded. We must 3268 explicitly save any information we may need later on in the link. 3269 We do not want to read the external symbol information again. */ 3270 3271 static bfd_boolean 3272 ecoff_link_add_externals (bfd *abfd, 3273 struct bfd_link_info *info, 3274 void * external_ext, 3275 char *ssext) 3276 { 3277 const struct ecoff_backend_data * const backend = ecoff_backend (abfd); 3278 void (* const swap_ext_in) (bfd *, void *, EXTR *) 3279 = backend->debug_swap.swap_ext_in; 3280 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size; 3281 unsigned long ext_count; 3282 struct bfd_link_hash_entry **sym_hash; 3283 char *ext_ptr; 3284 char *ext_end; 3285 bfd_size_type amt; 3286 3287 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax; 3288 3289 amt = ext_count; 3290 amt *= sizeof (struct bfd_link_hash_entry *); 3291 sym_hash = (struct bfd_link_hash_entry **) bfd_alloc (abfd, amt); 3292 if (!sym_hash) 3293 return FALSE; 3294 ecoff_data (abfd)->sym_hashes = (struct ecoff_link_hash_entry **) sym_hash; 3295 3296 ext_ptr = (char *) external_ext; 3297 ext_end = ext_ptr + ext_count * external_ext_size; 3298 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++) 3299 { 3300 EXTR esym; 3301 bfd_boolean skip; 3302 bfd_vma value; 3303 asection *section; 3304 const char *name; 3305 struct ecoff_link_hash_entry *h; 3306 3307 *sym_hash = NULL; 3308 3309 (*swap_ext_in) (abfd, (void *) ext_ptr, &esym); 3310 3311 /* Skip debugging symbols. */ 3312 skip = FALSE; 3313 switch (esym.asym.st) 3314 { 3315 case stGlobal: 3316 case stStatic: 3317 case stLabel: 3318 case stProc: 3319 case stStaticProc: 3320 break; 3321 default: 3322 skip = TRUE; 3323 break; 3324 } 3325 3326 if (skip) 3327 continue; 3328 3329 /* Get the information for this symbol. */ 3330 value = esym.asym.value; 3331 switch (esym.asym.sc) 3332 { 3333 default: 3334 case scNil: 3335 case scRegister: 3336 case scCdbLocal: 3337 case scBits: 3338 case scCdbSystem: 3339 case scRegImage: 3340 case scInfo: 3341 case scUserStruct: 3342 case scVar: 3343 case scVarRegister: 3344 case scVariant: 3345 case scBasedVar: 3346 case scXData: 3347 case scPData: 3348 section = NULL; 3349 break; 3350 case scText: 3351 section = bfd_make_section_old_way (abfd, _TEXT); 3352 value -= section->vma; 3353 break; 3354 case scData: 3355 section = bfd_make_section_old_way (abfd, _DATA); 3356 value -= section->vma; 3357 break; 3358 case scBss: 3359 section = bfd_make_section_old_way (abfd, _BSS); 3360 value -= section->vma; 3361 break; 3362 case scAbs: 3363 section = bfd_abs_section_ptr; 3364 break; 3365 case scUndefined: 3366 section = bfd_und_section_ptr; 3367 break; 3368 case scSData: 3369 section = bfd_make_section_old_way (abfd, _SDATA); 3370 value -= section->vma; 3371 break; 3372 case scSBss: 3373 section = bfd_make_section_old_way (abfd, _SBSS); 3374 value -= section->vma; 3375 break; 3376 case scRData: 3377 section = bfd_make_section_old_way (abfd, _RDATA); 3378 value -= section->vma; 3379 break; 3380 case scCommon: 3381 if (value > ecoff_data (abfd)->gp_size) 3382 { 3383 section = bfd_com_section_ptr; 3384 break; 3385 } 3386 /* Fall through. */ 3387 case scSCommon: 3388 if (ecoff_scom_section.name == NULL) 3389 { 3390 /* Initialize the small common section. */ 3391 ecoff_scom_section.name = SCOMMON; 3392 ecoff_scom_section.flags = SEC_IS_COMMON; 3393 ecoff_scom_section.output_section = &ecoff_scom_section; 3394 ecoff_scom_section.symbol = &ecoff_scom_symbol; 3395 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr; 3396 ecoff_scom_symbol.name = SCOMMON; 3397 ecoff_scom_symbol.flags = BSF_SECTION_SYM; 3398 ecoff_scom_symbol.section = &ecoff_scom_section; 3399 ecoff_scom_symbol_ptr = &ecoff_scom_symbol; 3400 } 3401 section = &ecoff_scom_section; 3402 break; 3403 case scSUndefined: 3404 section = bfd_und_section_ptr; 3405 break; 3406 case scInit: 3407 section = bfd_make_section_old_way (abfd, _INIT); 3408 value -= section->vma; 3409 break; 3410 case scFini: 3411 section = bfd_make_section_old_way (abfd, _FINI); 3412 value -= section->vma; 3413 break; 3414 case scRConst: 3415 section = bfd_make_section_old_way (abfd, _RCONST); 3416 value -= section->vma; 3417 break; 3418 } 3419 3420 if (section == NULL) 3421 continue; 3422 3423 name = ssext + esym.asym.iss; 3424 3425 if (! (_bfd_generic_link_add_one_symbol 3426 (info, abfd, name, 3427 (flagword) (esym.weakext ? BSF_WEAK : BSF_GLOBAL), 3428 section, value, NULL, TRUE, TRUE, sym_hash))) 3429 return FALSE; 3430 3431 h = (struct ecoff_link_hash_entry *) *sym_hash; 3432 3433 /* If we are building an ECOFF hash table, save the external 3434 symbol information. */ 3435 if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd)) 3436 { 3437 if (h->abfd == NULL 3438 || (! bfd_is_und_section (section) 3439 && (! bfd_is_com_section (section) 3440 || (h->root.type != bfd_link_hash_defined 3441 && h->root.type != bfd_link_hash_defweak)))) 3442 { 3443 h->abfd = abfd; 3444 h->esym = esym; 3445 } 3446 3447 /* Remember whether this symbol was small undefined. */ 3448 if (esym.asym.sc == scSUndefined) 3449 h->small = 1; 3450 3451 /* If this symbol was ever small undefined, it needs to wind 3452 up in a GP relative section. We can't control the 3453 section of a defined symbol, but we can control the 3454 section of a common symbol. This case is actually needed 3455 on Ultrix 4.2 to handle the symbol cred in -lckrb. */ 3456 if (h->small 3457 && h->root.type == bfd_link_hash_common 3458 && streq (h->root.u.c.p->section->name, SCOMMON)) 3459 { 3460 h->root.u.c.p->section = bfd_make_section_old_way (abfd, 3461 SCOMMON); 3462 h->root.u.c.p->section->flags = SEC_ALLOC; 3463 if (h->esym.asym.sc == scCommon) 3464 h->esym.asym.sc = scSCommon; 3465 } 3466 } 3467 } 3468 3469 return TRUE; 3470 } 3471 3472 /* Add symbols from an ECOFF object file to the global linker hash 3473 table. */ 3474 3475 static bfd_boolean 3476 ecoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) 3477 { 3478 HDRR *symhdr; 3479 bfd_size_type external_ext_size; 3480 void * external_ext = NULL; 3481 bfd_size_type esize; 3482 char *ssext = NULL; 3483 bfd_boolean result; 3484 3485 if (! ecoff_slurp_symbolic_header (abfd)) 3486 return FALSE; 3487 3488 /* If there are no symbols, we don't want it. */ 3489 if (bfd_get_symcount (abfd) == 0) 3490 return TRUE; 3491 3492 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header; 3493 3494 /* Read in the external symbols and external strings. */ 3495 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size; 3496 esize = symhdr->iextMax * external_ext_size; 3497 external_ext = bfd_malloc (esize); 3498 if (external_ext == NULL && esize != 0) 3499 goto error_return; 3500 3501 if (bfd_seek (abfd, (file_ptr) symhdr->cbExtOffset, SEEK_SET) != 0 3502 || bfd_bread (external_ext, esize, abfd) != esize) 3503 goto error_return; 3504 3505 ssext = (char *) bfd_malloc ((bfd_size_type) symhdr->issExtMax); 3506 if (ssext == NULL && symhdr->issExtMax != 0) 3507 goto error_return; 3508 3509 if (bfd_seek (abfd, (file_ptr) symhdr->cbSsExtOffset, SEEK_SET) != 0 3510 || (bfd_bread (ssext, (bfd_size_type) symhdr->issExtMax, abfd) 3511 != (bfd_size_type) symhdr->issExtMax)) 3512 goto error_return; 3513 3514 result = ecoff_link_add_externals (abfd, info, external_ext, ssext); 3515 3516 if (ssext != NULL) 3517 free (ssext); 3518 if (external_ext != NULL) 3519 free (external_ext); 3520 return result; 3521 3522 error_return: 3523 if (ssext != NULL) 3524 free (ssext); 3525 if (external_ext != NULL) 3526 free (external_ext); 3527 return FALSE; 3528 } 3529 3530 /* This is called if we used _bfd_generic_link_add_archive_symbols 3531 because we were not dealing with an ECOFF archive. */ 3532 3533 static bfd_boolean 3534 ecoff_link_check_archive_element (bfd *abfd, 3535 struct bfd_link_info *info, 3536 struct bfd_link_hash_entry *h, 3537 const char *name, 3538 bfd_boolean *pneeded) 3539 { 3540 *pneeded = FALSE; 3541 3542 /* Unlike the generic linker, we do not pull in elements because 3543 of common symbols. */ 3544 if (h->type != bfd_link_hash_undefined) 3545 return TRUE; 3546 3547 /* Include this element? */ 3548 if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd)) 3549 return TRUE; 3550 *pneeded = TRUE; 3551 3552 return ecoff_link_add_object_symbols (abfd, info); 3553 } 3554 3555 /* Add the symbols from an archive file to the global hash table. 3556 This looks through the undefined symbols, looks each one up in the 3557 archive hash table, and adds any associated object file. We do not 3558 use _bfd_generic_link_add_archive_symbols because ECOFF archives 3559 already have a hash table, so there is no reason to construct 3560 another one. */ 3561 3562 static bfd_boolean 3563 ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) 3564 { 3565 const struct ecoff_backend_data * const backend = ecoff_backend (abfd); 3566 const bfd_byte *raw_armap; 3567 struct bfd_link_hash_entry **pundef; 3568 unsigned int armap_count; 3569 unsigned int armap_log; 3570 unsigned int i; 3571 const bfd_byte *hashtable; 3572 const char *stringbase; 3573 3574 if (! bfd_has_map (abfd)) 3575 { 3576 /* An empty archive is a special case. */ 3577 if (bfd_openr_next_archived_file (abfd, NULL) == NULL) 3578 return TRUE; 3579 bfd_set_error (bfd_error_no_armap); 3580 return FALSE; 3581 } 3582 3583 /* If we don't have any raw data for this archive, as can happen on 3584 Irix 4.0.5F, we call the generic routine. 3585 FIXME: We should be more clever about this, since someday tdata 3586 may get to something for a generic archive. */ 3587 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata; 3588 if (raw_armap == NULL) 3589 return (_bfd_generic_link_add_archive_symbols 3590 (abfd, info, ecoff_link_check_archive_element)); 3591 3592 armap_count = H_GET_32 (abfd, raw_armap); 3593 3594 armap_log = 0; 3595 for (i = 1; i < armap_count; i <<= 1) 3596 armap_log++; 3597 BFD_ASSERT (i == armap_count); 3598 3599 hashtable = raw_armap + 4; 3600 stringbase = (const char *) raw_armap + armap_count * 8 + 8; 3601 3602 /* Look through the list of undefined symbols. */ 3603 pundef = &info->hash->undefs; 3604 while (*pundef != NULL) 3605 { 3606 struct bfd_link_hash_entry *h; 3607 unsigned int hash, rehash = 0; 3608 unsigned int file_offset; 3609 const char *name; 3610 bfd *element; 3611 3612 h = *pundef; 3613 3614 /* When a symbol is defined, it is not necessarily removed from 3615 the list. */ 3616 if (h->type != bfd_link_hash_undefined 3617 && h->type != bfd_link_hash_common) 3618 { 3619 /* Remove this entry from the list, for general cleanliness 3620 and because we are going to look through the list again 3621 if we search any more libraries. We can't remove the 3622 entry if it is the tail, because that would lose any 3623 entries we add to the list later on. */ 3624 if (*pundef != info->hash->undefs_tail) 3625 *pundef = (*pundef)->u.undef.next; 3626 else 3627 pundef = &(*pundef)->u.undef.next; 3628 continue; 3629 } 3630 3631 /* Native ECOFF linkers do not pull in archive elements merely 3632 to satisfy common definitions, so neither do we. We leave 3633 them on the list, though, in case we are linking against some 3634 other object format. */ 3635 if (h->type != bfd_link_hash_undefined) 3636 { 3637 pundef = &(*pundef)->u.undef.next; 3638 continue; 3639 } 3640 3641 /* Look for this symbol in the archive hash table. */ 3642 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count, 3643 armap_log); 3644 3645 file_offset = H_GET_32 (abfd, hashtable + (hash * 8) + 4); 3646 if (file_offset == 0) 3647 { 3648 /* Nothing in this slot. */ 3649 pundef = &(*pundef)->u.undef.next; 3650 continue; 3651 } 3652 3653 name = stringbase + H_GET_32 (abfd, hashtable + (hash * 8)); 3654 if (name[0] != h->root.string[0] 3655 || ! streq (name, h->root.string)) 3656 { 3657 unsigned int srch; 3658 bfd_boolean found; 3659 3660 /* That was the wrong symbol. Try rehashing. */ 3661 found = FALSE; 3662 for (srch = (hash + rehash) & (armap_count - 1); 3663 srch != hash; 3664 srch = (srch + rehash) & (armap_count - 1)) 3665 { 3666 file_offset = H_GET_32 (abfd, hashtable + (srch * 8) + 4); 3667 if (file_offset == 0) 3668 break; 3669 name = stringbase + H_GET_32 (abfd, hashtable + (srch * 8)); 3670 if (name[0] == h->root.string[0] 3671 && streq (name, h->root.string)) 3672 { 3673 found = TRUE; 3674 break; 3675 } 3676 } 3677 3678 if (! found) 3679 { 3680 pundef = &(*pundef)->u.undef.next; 3681 continue; 3682 } 3683 3684 hash = srch; 3685 } 3686 3687 element = (*backend->get_elt_at_filepos) (abfd, (file_ptr) file_offset); 3688 if (element == NULL) 3689 return FALSE; 3690 3691 if (! bfd_check_format (element, bfd_object)) 3692 return FALSE; 3693 3694 /* Unlike the generic linker, we know that this element provides 3695 a definition for an undefined symbol and we know that we want 3696 to include it. We don't need to check anything. */ 3697 if (!(*info->callbacks 3698 ->add_archive_element) (info, element, name, &element)) 3699 return FALSE; 3700 if (! ecoff_link_add_object_symbols (element, info)) 3701 return FALSE; 3702 3703 pundef = &(*pundef)->u.undef.next; 3704 } 3705 3706 return TRUE; 3707 } 3708 3709 /* Given an ECOFF BFD, add symbols to the global hash table as 3710 appropriate. */ 3711 3712 bfd_boolean 3713 _bfd_ecoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info) 3714 { 3715 switch (bfd_get_format (abfd)) 3716 { 3717 case bfd_object: 3718 return ecoff_link_add_object_symbols (abfd, info); 3719 case bfd_archive: 3720 return ecoff_link_add_archive_symbols (abfd, info); 3721 default: 3722 bfd_set_error (bfd_error_wrong_format); 3723 return FALSE; 3724 } 3725 } 3726 3727 3728 /* ECOFF final link routines. */ 3729 3730 /* Structure used to pass information to ecoff_link_write_external. */ 3731 3732 struct extsym_info 3733 { 3734 bfd *abfd; 3735 struct bfd_link_info *info; 3736 }; 3737 3738 /* Accumulate the debugging information for an input BFD into the 3739 output BFD. This must read in the symbolic information of the 3740 input BFD. */ 3741 3742 static bfd_boolean 3743 ecoff_final_link_debug_accumulate (bfd *output_bfd, 3744 bfd *input_bfd, 3745 struct bfd_link_info *info, 3746 void * handle) 3747 { 3748 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info; 3749 const struct ecoff_debug_swap * const swap = 3750 &ecoff_backend (input_bfd)->debug_swap; 3751 HDRR *symhdr = &debug->symbolic_header; 3752 bfd_boolean ret; 3753 3754 #define READ(ptr, offset, count, size, type) \ 3755 if (symhdr->count == 0) \ 3756 debug->ptr = NULL; \ 3757 else \ 3758 { \ 3759 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \ 3760 debug->ptr = (type) bfd_malloc (amt); \ 3761 if (debug->ptr == NULL) \ 3762 { \ 3763 ret = FALSE; \ 3764 goto return_something; \ 3765 } \ 3766 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \ 3767 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \ 3768 { \ 3769 ret = FALSE; \ 3770 goto return_something; \ 3771 } \ 3772 } 3773 3774 /* If raw_syments is not NULL, then the data was already by read by 3775 _bfd_ecoff_slurp_symbolic_info. */ 3776 if (ecoff_data (input_bfd)->raw_syments == NULL) 3777 { 3778 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), 3779 unsigned char *); 3780 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *); 3781 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *); 3782 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *); 3783 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *); 3784 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext), 3785 union aux_ext *); 3786 READ (ss, cbSsOffset, issMax, sizeof (char), char *); 3787 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *); 3788 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *); 3789 } 3790 #undef READ 3791 3792 /* We do not read the external strings or the external symbols. */ 3793 3794 ret = (bfd_ecoff_debug_accumulate 3795 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info, 3796 &ecoff_backend (output_bfd)->debug_swap, 3797 input_bfd, debug, swap, info)); 3798 3799 return_something: 3800 if (ecoff_data (input_bfd)->raw_syments == NULL) 3801 { 3802 if (debug->line != NULL) 3803 free (debug->line); 3804 if (debug->external_dnr != NULL) 3805 free (debug->external_dnr); 3806 if (debug->external_pdr != NULL) 3807 free (debug->external_pdr); 3808 if (debug->external_sym != NULL) 3809 free (debug->external_sym); 3810 if (debug->external_opt != NULL) 3811 free (debug->external_opt); 3812 if (debug->external_aux != NULL) 3813 free (debug->external_aux); 3814 if (debug->ss != NULL) 3815 free (debug->ss); 3816 if (debug->external_fdr != NULL) 3817 free (debug->external_fdr); 3818 if (debug->external_rfd != NULL) 3819 free (debug->external_rfd); 3820 3821 /* Make sure we don't accidentally follow one of these pointers 3822 into freed memory. */ 3823 debug->line = NULL; 3824 debug->external_dnr = NULL; 3825 debug->external_pdr = NULL; 3826 debug->external_sym = NULL; 3827 debug->external_opt = NULL; 3828 debug->external_aux = NULL; 3829 debug->ss = NULL; 3830 debug->external_fdr = NULL; 3831 debug->external_rfd = NULL; 3832 } 3833 3834 return ret; 3835 } 3836 3837 /* Relocate and write an ECOFF section into an ECOFF output file. */ 3838 3839 static bfd_boolean 3840 ecoff_indirect_link_order (bfd *output_bfd, 3841 struct bfd_link_info *info, 3842 asection *output_section, 3843 struct bfd_link_order *link_order) 3844 { 3845 asection *input_section; 3846 bfd *input_bfd; 3847 bfd_byte *contents = NULL; 3848 bfd_size_type external_reloc_size; 3849 bfd_size_type external_relocs_size; 3850 void * external_relocs = NULL; 3851 3852 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0); 3853 3854 input_section = link_order->u.indirect.section; 3855 input_bfd = input_section->owner; 3856 if (input_section->size == 0) 3857 return TRUE; 3858 3859 BFD_ASSERT (input_section->output_section == output_section); 3860 BFD_ASSERT (input_section->output_offset == link_order->offset); 3861 BFD_ASSERT (input_section->size == link_order->size); 3862 3863 /* Get the section contents. */ 3864 if (!bfd_malloc_and_get_section (input_bfd, input_section, &contents)) 3865 goto error_return; 3866 3867 /* Get the relocs. If we are relaxing MIPS code, they will already 3868 have been read in. Otherwise, we read them in now. */ 3869 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size; 3870 external_relocs_size = external_reloc_size * input_section->reloc_count; 3871 3872 external_relocs = bfd_malloc (external_relocs_size); 3873 if (external_relocs == NULL && external_relocs_size != 0) 3874 goto error_return; 3875 3876 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0 3877 || (bfd_bread (external_relocs, external_relocs_size, input_bfd) 3878 != external_relocs_size)) 3879 goto error_return; 3880 3881 /* Relocate the section contents. */ 3882 if (! ((*ecoff_backend (input_bfd)->relocate_section) 3883 (output_bfd, info, input_bfd, input_section, contents, 3884 external_relocs))) 3885 goto error_return; 3886 3887 /* Write out the relocated section. */ 3888 if (! bfd_set_section_contents (output_bfd, 3889 output_section, 3890 contents, 3891 input_section->output_offset, 3892 input_section->size)) 3893 goto error_return; 3894 3895 /* If we are producing relocatable output, the relocs were 3896 modified, and we write them out now. We use the reloc_count 3897 field of output_section to keep track of the number of relocs we 3898 have output so far. */ 3899 if (bfd_link_relocatable (info)) 3900 { 3901 file_ptr pos = (output_section->rel_filepos 3902 + output_section->reloc_count * external_reloc_size); 3903 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0 3904 || (bfd_bwrite (external_relocs, external_relocs_size, output_bfd) 3905 != external_relocs_size)) 3906 goto error_return; 3907 output_section->reloc_count += input_section->reloc_count; 3908 } 3909 3910 if (contents != NULL) 3911 free (contents); 3912 if (external_relocs != NULL) 3913 free (external_relocs); 3914 return TRUE; 3915 3916 error_return: 3917 if (contents != NULL) 3918 free (contents); 3919 if (external_relocs != NULL) 3920 free (external_relocs); 3921 return FALSE; 3922 } 3923 3924 /* Generate a reloc when linking an ECOFF file. This is a reloc 3925 requested by the linker, and does come from any input file. This 3926 is used to build constructor and destructor tables when linking 3927 with -Ur. */ 3928 3929 static bfd_boolean 3930 ecoff_reloc_link_order (bfd *output_bfd, 3931 struct bfd_link_info *info, 3932 asection *output_section, 3933 struct bfd_link_order *link_order) 3934 { 3935 enum bfd_link_order_type type; 3936 asection *section; 3937 bfd_vma addend; 3938 arelent rel; 3939 struct internal_reloc in; 3940 bfd_size_type external_reloc_size; 3941 bfd_byte *rbuf; 3942 bfd_boolean ok; 3943 file_ptr pos; 3944 3945 type = link_order->type; 3946 section = NULL; 3947 addend = link_order->u.reloc.p->addend; 3948 3949 /* We set up an arelent to pass to the backend adjust_reloc_out 3950 routine. */ 3951 rel.address = link_order->offset; 3952 3953 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc); 3954 if (rel.howto == 0) 3955 { 3956 bfd_set_error (bfd_error_bad_value); 3957 return FALSE; 3958 } 3959 3960 if (type == bfd_section_reloc_link_order) 3961 { 3962 section = link_order->u.reloc.p->u.section; 3963 rel.sym_ptr_ptr = section->symbol_ptr_ptr; 3964 } 3965 else 3966 { 3967 struct bfd_link_hash_entry *h; 3968 3969 /* Treat a reloc against a defined symbol as though it were 3970 actually against the section. */ 3971 h = bfd_wrapped_link_hash_lookup (output_bfd, info, 3972 link_order->u.reloc.p->u.name, 3973 FALSE, FALSE, FALSE); 3974 if (h != NULL 3975 && (h->type == bfd_link_hash_defined 3976 || h->type == bfd_link_hash_defweak)) 3977 { 3978 type = bfd_section_reloc_link_order; 3979 section = h->u.def.section->output_section; 3980 /* It seems that we ought to add the symbol value to the 3981 addend here, but in practice it has already been added 3982 because it was passed to constructor_callback. */ 3983 addend += section->vma + h->u.def.section->output_offset; 3984 } 3985 else 3986 { 3987 /* We can't set up a reloc against a symbol correctly, 3988 because we have no asymbol structure. Currently no 3989 adjust_reloc_out routine cares. */ 3990 rel.sym_ptr_ptr = NULL; 3991 } 3992 } 3993 3994 /* All ECOFF relocs are in-place. Put the addend into the object 3995 file. */ 3996 3997 BFD_ASSERT (rel.howto->partial_inplace); 3998 if (addend != 0) 3999 { 4000 bfd_size_type size; 4001 bfd_reloc_status_type rstat; 4002 bfd_byte *buf; 4003 4004 size = bfd_get_reloc_size (rel.howto); 4005 buf = (bfd_byte *) bfd_zmalloc (size); 4006 if (buf == NULL && size != 0) 4007 return FALSE; 4008 rstat = _bfd_relocate_contents (rel.howto, output_bfd, 4009 (bfd_vma) addend, buf); 4010 switch (rstat) 4011 { 4012 case bfd_reloc_ok: 4013 break; 4014 default: 4015 case bfd_reloc_outofrange: 4016 abort (); 4017 case bfd_reloc_overflow: 4018 (*info->callbacks->reloc_overflow) 4019 (info, NULL, 4020 (link_order->type == bfd_section_reloc_link_order 4021 ? bfd_section_name (output_bfd, section) 4022 : link_order->u.reloc.p->u.name), 4023 rel.howto->name, addend, NULL, NULL, (bfd_vma) 0); 4024 break; 4025 } 4026 ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf, 4027 (file_ptr) link_order->offset, size); 4028 free (buf); 4029 if (! ok) 4030 return FALSE; 4031 } 4032 4033 rel.addend = 0; 4034 4035 /* Move the information into an internal_reloc structure. */ 4036 in.r_vaddr = (rel.address 4037 + bfd_get_section_vma (output_bfd, output_section)); 4038 in.r_type = rel.howto->type; 4039 4040 if (type == bfd_symbol_reloc_link_order) 4041 { 4042 struct ecoff_link_hash_entry *h; 4043 4044 h = ((struct ecoff_link_hash_entry *) 4045 bfd_wrapped_link_hash_lookup (output_bfd, info, 4046 link_order->u.reloc.p->u.name, 4047 FALSE, FALSE, TRUE)); 4048 if (h != NULL 4049 && h->indx != -1) 4050 in.r_symndx = h->indx; 4051 else 4052 { 4053 (*info->callbacks->unattached_reloc) 4054 (info, link_order->u.reloc.p->u.name, NULL, NULL, (bfd_vma) 0); 4055 in.r_symndx = 0; 4056 } 4057 in.r_extern = 1; 4058 } 4059 else 4060 { 4061 const char *name; 4062 unsigned int i; 4063 static struct 4064 { 4065 const char * name; 4066 long r_symndx; 4067 } 4068 section_symndx [] = 4069 { 4070 { _TEXT, RELOC_SECTION_TEXT }, 4071 { _RDATA, RELOC_SECTION_RDATA }, 4072 { _DATA, RELOC_SECTION_DATA }, 4073 { _SDATA, RELOC_SECTION_SDATA }, 4074 { _SBSS, RELOC_SECTION_SBSS }, 4075 { _BSS, RELOC_SECTION_BSS }, 4076 { _INIT, RELOC_SECTION_INIT }, 4077 { _LIT8, RELOC_SECTION_LIT8 }, 4078 { _LIT4, RELOC_SECTION_LIT4 }, 4079 { _XDATA, RELOC_SECTION_XDATA }, 4080 { _PDATA, RELOC_SECTION_PDATA }, 4081 { _FINI, RELOC_SECTION_FINI }, 4082 { _LITA, RELOC_SECTION_LITA }, 4083 { "*ABS*", RELOC_SECTION_ABS }, 4084 { _RCONST, RELOC_SECTION_RCONST } 4085 }; 4086 4087 name = bfd_get_section_name (output_bfd, section); 4088 4089 for (i = 0; i < ARRAY_SIZE (section_symndx); i++) 4090 if (streq (name, section_symndx[i].name)) 4091 { 4092 in.r_symndx = section_symndx[i].r_symndx; 4093 break; 4094 } 4095 4096 if (i == ARRAY_SIZE (section_symndx)) 4097 abort (); 4098 4099 in.r_extern = 0; 4100 } 4101 4102 /* Let the BFD backend adjust the reloc. */ 4103 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in); 4104 4105 /* Get some memory and swap out the reloc. */ 4106 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size; 4107 rbuf = (bfd_byte *) bfd_malloc (external_reloc_size); 4108 if (rbuf == NULL) 4109 return FALSE; 4110 4111 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (void *) rbuf); 4112 4113 pos = (output_section->rel_filepos 4114 + output_section->reloc_count * external_reloc_size); 4115 ok = (bfd_seek (output_bfd, pos, SEEK_SET) == 0 4116 && (bfd_bwrite ((void *) rbuf, external_reloc_size, output_bfd) 4117 == external_reloc_size)); 4118 4119 if (ok) 4120 ++output_section->reloc_count; 4121 4122 free (rbuf); 4123 4124 return ok; 4125 } 4126 4127 /* Put out information for an external symbol. These come only from 4128 the hash table. */ 4129 4130 static bfd_boolean 4131 ecoff_link_write_external (struct bfd_hash_entry *bh, void * data) 4132 { 4133 struct ecoff_link_hash_entry *h = (struct ecoff_link_hash_entry *) bh; 4134 struct extsym_info *einfo = (struct extsym_info *) data; 4135 bfd *output_bfd = einfo->abfd; 4136 bfd_boolean strip; 4137 4138 if (h->root.type == bfd_link_hash_warning) 4139 { 4140 h = (struct ecoff_link_hash_entry *) h->root.u.i.link; 4141 if (h->root.type == bfd_link_hash_new) 4142 return TRUE; 4143 } 4144 4145 /* We need to check if this symbol is being stripped. */ 4146 if (h->root.type == bfd_link_hash_undefined 4147 || h->root.type == bfd_link_hash_undefweak) 4148 strip = FALSE; 4149 else if (einfo->info->strip == strip_all 4150 || (einfo->info->strip == strip_some 4151 && bfd_hash_lookup (einfo->info->keep_hash, 4152 h->root.root.string, 4153 FALSE, FALSE) == NULL)) 4154 strip = TRUE; 4155 else 4156 strip = FALSE; 4157 4158 if (strip || h->written) 4159 return TRUE; 4160 4161 if (h->abfd == NULL) 4162 { 4163 h->esym.jmptbl = 0; 4164 h->esym.cobol_main = 0; 4165 h->esym.weakext = 0; 4166 h->esym.reserved = 0; 4167 h->esym.ifd = ifdNil; 4168 h->esym.asym.value = 0; 4169 h->esym.asym.st = stGlobal; 4170 4171 if (h->root.type != bfd_link_hash_defined 4172 && h->root.type != bfd_link_hash_defweak) 4173 h->esym.asym.sc = scAbs; 4174 else 4175 { 4176 asection *output_section; 4177 const char *name; 4178 unsigned int i; 4179 static struct 4180 { 4181 const char * name; 4182 int sc; 4183 } 4184 section_storage_classes [] = 4185 { 4186 { _TEXT, scText }, 4187 { _DATA, scData }, 4188 { _SDATA, scSData }, 4189 { _RDATA, scRData }, 4190 { _BSS, scBss }, 4191 { _SBSS, scSBss }, 4192 { _INIT, scInit }, 4193 { _FINI, scFini }, 4194 { _PDATA, scPData }, 4195 { _XDATA, scXData }, 4196 { _RCONST, scRConst } 4197 }; 4198 4199 output_section = h->root.u.def.section->output_section; 4200 name = bfd_section_name (output_section->owner, output_section); 4201 4202 for (i = 0; i < ARRAY_SIZE (section_storage_classes); i++) 4203 if (streq (name, section_storage_classes[i].name)) 4204 { 4205 h->esym.asym.sc = section_storage_classes[i].sc; 4206 break; 4207 } 4208 4209 if (i == ARRAY_SIZE (section_storage_classes)) 4210 h->esym.asym.sc = scAbs; 4211 } 4212 4213 h->esym.asym.reserved = 0; 4214 h->esym.asym.index = indexNil; 4215 } 4216 else if (h->esym.ifd != -1) 4217 { 4218 struct ecoff_debug_info *debug; 4219 4220 /* Adjust the FDR index for the symbol by that used for the 4221 input BFD. */ 4222 debug = &ecoff_data (h->abfd)->debug_info; 4223 BFD_ASSERT (h->esym.ifd >= 0 4224 && h->esym.ifd < debug->symbolic_header.ifdMax); 4225 h->esym.ifd = debug->ifdmap[h->esym.ifd]; 4226 } 4227 4228 switch (h->root.type) 4229 { 4230 default: 4231 case bfd_link_hash_warning: 4232 case bfd_link_hash_new: 4233 abort (); 4234 case bfd_link_hash_undefined: 4235 case bfd_link_hash_undefweak: 4236 if (h->esym.asym.sc != scUndefined 4237 && h->esym.asym.sc != scSUndefined) 4238 h->esym.asym.sc = scUndefined; 4239 break; 4240 case bfd_link_hash_defined: 4241 case bfd_link_hash_defweak: 4242 if (h->esym.asym.sc == scUndefined 4243 || h->esym.asym.sc == scSUndefined) 4244 h->esym.asym.sc = scAbs; 4245 else if (h->esym.asym.sc == scCommon) 4246 h->esym.asym.sc = scBss; 4247 else if (h->esym.asym.sc == scSCommon) 4248 h->esym.asym.sc = scSBss; 4249 h->esym.asym.value = (h->root.u.def.value 4250 + h->root.u.def.section->output_section->vma 4251 + h->root.u.def.section->output_offset); 4252 break; 4253 case bfd_link_hash_common: 4254 if (h->esym.asym.sc != scCommon 4255 && h->esym.asym.sc != scSCommon) 4256 h->esym.asym.sc = scCommon; 4257 h->esym.asym.value = h->root.u.c.size; 4258 break; 4259 case bfd_link_hash_indirect: 4260 /* We ignore these symbols, since the indirected symbol is 4261 already in the hash table. */ 4262 return TRUE; 4263 } 4264 4265 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the 4266 symbol number. */ 4267 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax; 4268 h->written = 1; 4269 4270 return (bfd_ecoff_debug_one_external 4271 (output_bfd, &ecoff_data (output_bfd)->debug_info, 4272 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string, 4273 &h->esym)); 4274 } 4275 4276 /* ECOFF final link routine. This looks through all the input BFDs 4277 and gathers together all the debugging information, and then 4278 processes all the link order information. This may cause it to 4279 close and reopen some input BFDs; I'll see how bad this is. */ 4280 4281 bfd_boolean 4282 _bfd_ecoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info) 4283 { 4284 const struct ecoff_backend_data * const backend = ecoff_backend (abfd); 4285 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info; 4286 HDRR *symhdr; 4287 void * handle; 4288 bfd *input_bfd; 4289 asection *o; 4290 struct bfd_link_order *p; 4291 struct extsym_info einfo; 4292 4293 /* We accumulate the debugging information counts in the symbolic 4294 header. */ 4295 symhdr = &debug->symbolic_header; 4296 symhdr->vstamp = 0; 4297 symhdr->ilineMax = 0; 4298 symhdr->cbLine = 0; 4299 symhdr->idnMax = 0; 4300 symhdr->ipdMax = 0; 4301 symhdr->isymMax = 0; 4302 symhdr->ioptMax = 0; 4303 symhdr->iauxMax = 0; 4304 symhdr->issMax = 0; 4305 symhdr->issExtMax = 0; 4306 symhdr->ifdMax = 0; 4307 symhdr->crfd = 0; 4308 symhdr->iextMax = 0; 4309 4310 /* We accumulate the debugging information itself in the debug_info 4311 structure. */ 4312 debug->line = NULL; 4313 debug->external_dnr = NULL; 4314 debug->external_pdr = NULL; 4315 debug->external_sym = NULL; 4316 debug->external_opt = NULL; 4317 debug->external_aux = NULL; 4318 debug->ss = NULL; 4319 debug->ssext = debug->ssext_end = NULL; 4320 debug->external_fdr = NULL; 4321 debug->external_rfd = NULL; 4322 debug->external_ext = debug->external_ext_end = NULL; 4323 4324 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info); 4325 if (handle == NULL) 4326 return FALSE; 4327 4328 /* Accumulate the debugging symbols from each input BFD. */ 4329 for (input_bfd = info->input_bfds; 4330 input_bfd != NULL; 4331 input_bfd = input_bfd->link.next) 4332 { 4333 bfd_boolean ret; 4334 4335 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour) 4336 { 4337 /* Arbitrarily set the symbolic header vstamp to the vstamp 4338 of the first object file in the link. */ 4339 if (symhdr->vstamp == 0) 4340 symhdr->vstamp 4341 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp; 4342 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info, 4343 handle); 4344 } 4345 else 4346 ret = bfd_ecoff_debug_accumulate_other (handle, abfd, 4347 debug, &backend->debug_swap, 4348 input_bfd, info); 4349 if (! ret) 4350 return FALSE; 4351 4352 /* Combine the register masks. */ 4353 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask; 4354 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask; 4355 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0]; 4356 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1]; 4357 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2]; 4358 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3]; 4359 } 4360 4361 /* Write out the external symbols. */ 4362 einfo.abfd = abfd; 4363 einfo.info = info; 4364 bfd_hash_traverse (&info->hash->table, ecoff_link_write_external, &einfo); 4365 4366 if (bfd_link_relocatable (info)) 4367 { 4368 /* We need to make a pass over the link_orders to count up the 4369 number of relocations we will need to output, so that we know 4370 how much space they will take up. */ 4371 for (o = abfd->sections; o != NULL; o = o->next) 4372 { 4373 o->reloc_count = 0; 4374 for (p = o->map_head.link_order; 4375 p != NULL; 4376 p = p->next) 4377 if (p->type == bfd_indirect_link_order) 4378 o->reloc_count += p->u.indirect.section->reloc_count; 4379 else if (p->type == bfd_section_reloc_link_order 4380 || p->type == bfd_symbol_reloc_link_order) 4381 ++o->reloc_count; 4382 } 4383 } 4384 4385 /* Compute the reloc and symbol file positions. */ 4386 ecoff_compute_reloc_file_positions (abfd); 4387 4388 /* Write out the debugging information. */ 4389 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug, 4390 &backend->debug_swap, info, 4391 ecoff_data (abfd)->sym_filepos)) 4392 return FALSE; 4393 4394 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info); 4395 4396 if (bfd_link_relocatable (info)) 4397 { 4398 /* Now reset the reloc_count field of the sections in the output 4399 BFD to 0, so that we can use them to keep track of how many 4400 relocs we have output thus far. */ 4401 for (o = abfd->sections; o != NULL; o = o->next) 4402 o->reloc_count = 0; 4403 } 4404 4405 /* Get a value for the GP register. */ 4406 if (ecoff_data (abfd)->gp == 0) 4407 { 4408 struct bfd_link_hash_entry *h; 4409 4410 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE); 4411 if (h != NULL 4412 && h->type == bfd_link_hash_defined) 4413 ecoff_data (abfd)->gp = (h->u.def.value 4414 + h->u.def.section->output_section->vma 4415 + h->u.def.section->output_offset); 4416 else if (bfd_link_relocatable (info)) 4417 { 4418 bfd_vma lo; 4419 4420 /* Make up a value. */ 4421 lo = (bfd_vma) -1; 4422 for (o = abfd->sections; o != NULL; o = o->next) 4423 { 4424 if (o->vma < lo 4425 && (streq (o->name, _SBSS) 4426 || streq (o->name, _SDATA) 4427 || streq (o->name, _LIT4) 4428 || streq (o->name, _LIT8) 4429 || streq (o->name, _LITA))) 4430 lo = o->vma; 4431 } 4432 ecoff_data (abfd)->gp = lo + 0x8000; 4433 } 4434 else 4435 { 4436 /* If the relocate_section function needs to do a reloc 4437 involving the GP value, it should make a reloc_dangerous 4438 callback to warn that GP is not defined. */ 4439 } 4440 } 4441 4442 for (o = abfd->sections; o != NULL; o = o->next) 4443 { 4444 for (p = o->map_head.link_order; 4445 p != NULL; 4446 p = p->next) 4447 { 4448 if (p->type == bfd_indirect_link_order 4449 && (bfd_get_flavour (p->u.indirect.section->owner) 4450 == bfd_target_ecoff_flavour)) 4451 { 4452 if (! ecoff_indirect_link_order (abfd, info, o, p)) 4453 return FALSE; 4454 } 4455 else if (p->type == bfd_section_reloc_link_order 4456 || p->type == bfd_symbol_reloc_link_order) 4457 { 4458 if (! ecoff_reloc_link_order (abfd, info, o, p)) 4459 return FALSE; 4460 } 4461 else 4462 { 4463 if (! _bfd_default_link_order (abfd, info, o, p)) 4464 return FALSE; 4465 } 4466 } 4467 } 4468 4469 bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax; 4470 4471 ecoff_data (abfd)->linker = TRUE; 4472 4473 return TRUE; 4474 } 4475