1 /* Support for the generic parts of COFF, for BFD. 2 Copyright (C) 1990-2024 Free Software Foundation, Inc. 3 Written by Cygnus Support. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 /* Most of this hacked by Steve Chamberlain, sac@cygnus.com. 23 Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */ 24 25 /* This file contains COFF code that is not dependent on any 26 particular COFF target. There is only one version of this file in 27 libbfd.a, so no target specific code may be put in here. Or, to 28 put it another way, 29 30 ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE ********** 31 32 If you need to add some target specific behaviour, add a new hook 33 function to bfd_coff_backend_data. 34 35 Some of these functions are also called by the ECOFF routines. 36 Those functions may not use any COFF specific information, such as 37 coff_data (abfd). */ 38 39 #include "sysdep.h" 40 #include <limits.h> 41 #include "bfd.h" 42 #include "libbfd.h" 43 #include "coff/internal.h" 44 #include "libcoff.h" 45 #include "hashtab.h" 46 47 /* Extract a long section name at STRINDEX and copy it to the bfd objstack. 48 Return NULL in case of error. */ 49 50 static char * 51 extract_long_section_name(bfd *abfd, unsigned long strindex) 52 { 53 const char *strings; 54 char *name; 55 56 strings = _bfd_coff_read_string_table (abfd); 57 if (strings == NULL) 58 return NULL; 59 if ((bfd_size_type)(strindex + 2) >= obj_coff_strings_len (abfd)) 60 return NULL; 61 strings += strindex; 62 name = (char *) bfd_alloc (abfd, (bfd_size_type) strlen (strings) + 1); 63 if (name == NULL) 64 return NULL; 65 strcpy (name, strings); 66 67 return name; 68 } 69 70 /* Decode a base 64 coded string at STR of length LEN, and write the result 71 to RES. Return true on success. 72 Return false in case of invalid character or overflow. */ 73 74 static bool 75 decode_base64 (const char *str, unsigned len, uint32_t *res) 76 { 77 unsigned i; 78 uint32_t val; 79 80 val = 0; 81 for (i = 0; i < len; i++) 82 { 83 char c = str[i]; 84 unsigned d; 85 86 if (c >= 'A' && c <= 'Z') 87 d = c - 'A'; 88 else if (c >= 'a' && c <= 'z') 89 d = c - 'a' + 26; 90 else if (c >= '0' && c <= '9') 91 d = c - '0' + 52; 92 else if (c == '+') 93 d = 62; 94 else if (c == '/') 95 d = 63; 96 else 97 return false; 98 99 /* Check for overflow. */ 100 if ((val >> 26) != 0) 101 return false; 102 103 val = (val << 6) + d; 104 } 105 106 *res = val; 107 return true; 108 } 109 110 /* Take a section header read from a coff file (in HOST byte order), 111 and make a BFD "section" out of it. This is used by ECOFF. */ 112 113 static bool 114 make_a_section_from_file (bfd *abfd, 115 struct internal_scnhdr *hdr, 116 unsigned int target_index) 117 { 118 asection *newsect; 119 char *name; 120 bool result = true; 121 flagword flags; 122 123 name = NULL; 124 125 /* Handle long section names as in PE. On reading, we want to 126 accept long names if the format permits them at all, regardless 127 of the current state of the flag that dictates if we would generate 128 them in outputs; this construct checks if that is the case by 129 attempting to set the flag, without changing its state; the call 130 will fail for formats that do not support long names at all. */ 131 if (bfd_coff_set_long_section_names (abfd, bfd_coff_long_section_names (abfd)) 132 && hdr->s_name[0] == '/') 133 { 134 /* Flag that this BFD uses long names, even though the format might 135 expect them to be off by default. This won't directly affect the 136 format of any output BFD created from this one, but the information 137 can be used to decide what to do. */ 138 bfd_coff_set_long_section_names (abfd, true); 139 140 if (hdr->s_name[1] == '/') 141 { 142 /* LLVM extension: the '/' is followed by another '/' and then by 143 the index in the strtab encoded in base64 without NUL at the 144 end. */ 145 uint32_t strindex; 146 147 /* Decode the index. No overflow is expected as the string table 148 length is at most 2^32 - 1 (the length is written on the first 149 four bytes). 150 Also, contrary to RFC 4648, all the characters must be decoded, 151 there is no padding. */ 152 if (!decode_base64 (hdr->s_name + 2, SCNNMLEN - 2, &strindex)) 153 return false; 154 155 name = extract_long_section_name (abfd, strindex); 156 if (name == NULL) 157 return false; 158 } 159 else 160 { 161 /* PE classic long section name. The '/' is followed by the index 162 in the strtab. The index is formatted as a decimal string. */ 163 char buf[SCNNMLEN]; 164 long strindex; 165 char *p; 166 167 memcpy (buf, hdr->s_name + 1, SCNNMLEN - 1); 168 buf[SCNNMLEN - 1] = '\0'; 169 strindex = strtol (buf, &p, 10); 170 if (*p == '\0' && strindex >= 0) 171 { 172 name = extract_long_section_name (abfd, strindex); 173 if (name == NULL) 174 return false; 175 } 176 } 177 } 178 179 if (name == NULL) 180 { 181 /* Assorted wastage to null-terminate the name, thanks AT&T! */ 182 name = (char *) bfd_alloc (abfd, 183 (bfd_size_type) sizeof (hdr->s_name) + 1 + 1); 184 if (name == NULL) 185 return false; 186 strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name)); 187 name[sizeof (hdr->s_name)] = 0; 188 } 189 190 newsect = bfd_make_section_anyway (abfd, name); 191 if (newsect == NULL) 192 return false; 193 194 newsect->vma = hdr->s_vaddr; 195 newsect->lma = hdr->s_paddr; 196 newsect->size = hdr->s_size; 197 newsect->filepos = hdr->s_scnptr; 198 newsect->rel_filepos = hdr->s_relptr; 199 newsect->reloc_count = hdr->s_nreloc; 200 201 bfd_coff_set_alignment_hook (abfd, newsect, hdr); 202 203 newsect->line_filepos = hdr->s_lnnoptr; 204 205 newsect->lineno_count = hdr->s_nlnno; 206 newsect->userdata = NULL; 207 newsect->next = NULL; 208 newsect->target_index = target_index; 209 210 if (!bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name, newsect, &flags)) 211 result = false; 212 213 /* At least on i386-coff, the line number count for a shared library 214 section must be ignored. */ 215 if ((flags & SEC_COFF_SHARED_LIBRARY) != 0) 216 newsect->lineno_count = 0; 217 218 if (hdr->s_nreloc != 0) 219 flags |= SEC_RELOC; 220 /* FIXME: should this check 'hdr->s_size > 0'. */ 221 if (hdr->s_scnptr != 0) 222 flags |= SEC_HAS_CONTENTS; 223 224 newsect->flags = flags; 225 226 /* Compress/decompress DWARF debug sections. */ 227 if ((flags & SEC_DEBUGGING) != 0 228 && (flags & SEC_HAS_CONTENTS) != 0 229 && (startswith (name, ".debug_") 230 || startswith (name, ".zdebug_") 231 || startswith (name, ".gnu.debuglto_.debug_") 232 || startswith (name, ".gnu.linkonce.wi."))) 233 { 234 enum { nothing, compress, decompress } action = nothing; 235 236 if (bfd_is_section_compressed (abfd, newsect)) 237 { 238 /* Compressed section. Check if we should decompress. */ 239 if ((abfd->flags & BFD_DECOMPRESS)) 240 action = decompress; 241 } 242 else 243 { 244 /* Normal section. Check if we should compress. */ 245 if ((abfd->flags & BFD_COMPRESS) && newsect->size != 0) 246 action = compress; 247 } 248 249 if (action == compress) 250 { 251 if (!bfd_init_section_compress_status (abfd, newsect)) 252 { 253 _bfd_error_handler 254 /* xgettext:c-format */ 255 (_("%pB: unable to compress section %s"), abfd, name); 256 return false; 257 } 258 } 259 else if (action == decompress) 260 { 261 if (!bfd_init_section_decompress_status (abfd, newsect)) 262 { 263 _bfd_error_handler 264 /* xgettext:c-format */ 265 (_("%pB: unable to decompress section %s"), abfd, name); 266 return false; 267 } 268 if (abfd->is_linker_input 269 && name[1] == 'z') 270 { 271 /* Rename section from .zdebug_* to .debug_* so that ld 272 scripts will see this section as a debug section. */ 273 char *new_name = bfd_zdebug_name_to_debug (abfd, name); 274 if (new_name == NULL) 275 return false; 276 bfd_rename_section (newsect, new_name); 277 } 278 } 279 } 280 281 return result; 282 } 283 284 void 285 coff_object_cleanup (bfd *abfd) 286 { 287 struct coff_tdata *td = coff_data (abfd); 288 if (td != NULL) 289 { 290 if (td->section_by_index) 291 htab_delete (td->section_by_index); 292 if (td->section_by_target_index) 293 htab_delete (td->section_by_target_index); 294 if (obj_pe (abfd) && pe_data (abfd)->comdat_hash) 295 htab_delete (pe_data (abfd)->comdat_hash); 296 } 297 } 298 299 /* Read in a COFF object and make it into a BFD. This is used by 300 ECOFF as well. */ 301 bfd_cleanup 302 coff_real_object_p (bfd *abfd, 303 unsigned nscns, 304 struct internal_filehdr *internal_f, 305 struct internal_aouthdr *internal_a) 306 { 307 flagword oflags = abfd->flags; 308 bfd_vma ostart = bfd_get_start_address (abfd); 309 void * tdata; 310 void * tdata_save; 311 bfd_size_type readsize; /* Length of file_info. */ 312 unsigned int scnhsz; 313 char *external_sections; 314 315 if (!(internal_f->f_flags & F_RELFLG)) 316 abfd->flags |= HAS_RELOC; 317 if ((internal_f->f_flags & F_EXEC)) 318 abfd->flags |= EXEC_P; 319 if (!(internal_f->f_flags & F_LNNO)) 320 abfd->flags |= HAS_LINENO; 321 if (!(internal_f->f_flags & F_LSYMS)) 322 abfd->flags |= HAS_LOCALS; 323 324 /* FIXME: How can we set D_PAGED correctly? */ 325 if ((internal_f->f_flags & F_EXEC) != 0) 326 abfd->flags |= D_PAGED; 327 328 abfd->symcount = internal_f->f_nsyms; 329 if (internal_f->f_nsyms) 330 abfd->flags |= HAS_SYMS; 331 332 if (internal_a != (struct internal_aouthdr *) NULL) 333 abfd->start_address = internal_a->entry; 334 else 335 abfd->start_address = 0; 336 337 /* Set up the tdata area. ECOFF uses its own routine, and overrides 338 abfd->flags. */ 339 tdata_save = abfd->tdata.any; 340 tdata = bfd_coff_mkobject_hook (abfd, (void *) internal_f, (void *) internal_a); 341 if (tdata == NULL) 342 goto fail2; 343 344 scnhsz = bfd_coff_scnhsz (abfd); 345 readsize = (bfd_size_type) nscns * scnhsz; 346 external_sections = (char *) _bfd_alloc_and_read (abfd, readsize, readsize); 347 if (!external_sections) 348 goto fail; 349 350 /* Set the arch/mach *before* swapping in sections; section header swapping 351 may depend on arch/mach info. */ 352 if (! bfd_coff_set_arch_mach_hook (abfd, (void *) internal_f)) 353 goto fail; 354 355 /* Now copy data as required; construct all asections etc. */ 356 if (nscns != 0) 357 { 358 unsigned int i; 359 for (i = 0; i < nscns; i++) 360 { 361 struct internal_scnhdr tmp; 362 bfd_coff_swap_scnhdr_in (abfd, 363 (void *) (external_sections + i * scnhsz), 364 (void *) & tmp); 365 if (! make_a_section_from_file (abfd, &tmp, i + 1)) 366 goto fail; 367 } 368 } 369 370 _bfd_coff_free_symbols (abfd); 371 return coff_object_cleanup; 372 373 fail: 374 coff_object_cleanup (abfd); 375 _bfd_coff_free_symbols (abfd); 376 bfd_release (abfd, tdata); 377 fail2: 378 abfd->tdata.any = tdata_save; 379 abfd->flags = oflags; 380 abfd->start_address = ostart; 381 return NULL; 382 } 383 384 /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is 385 not a COFF file. This is also used by ECOFF. */ 386 387 bfd_cleanup 388 coff_object_p (bfd *abfd) 389 { 390 bfd_size_type filhsz; 391 bfd_size_type aoutsz; 392 unsigned int nscns; 393 void * filehdr; 394 struct internal_filehdr internal_f; 395 struct internal_aouthdr internal_a; 396 397 /* Figure out how much to read. */ 398 filhsz = bfd_coff_filhsz (abfd); 399 aoutsz = bfd_coff_aoutsz (abfd); 400 401 filehdr = _bfd_alloc_and_read (abfd, filhsz, filhsz); 402 if (filehdr == NULL) 403 { 404 if (bfd_get_error () != bfd_error_system_call) 405 bfd_set_error (bfd_error_wrong_format); 406 return NULL; 407 } 408 bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f); 409 bfd_release (abfd, filehdr); 410 411 /* The XCOFF format has two sizes for the f_opthdr. SMALL_AOUTSZ 412 (less than aoutsz) used in object files and AOUTSZ (equal to 413 aoutsz) in executables. The bfd_coff_swap_aouthdr_in function 414 expects this header to be aoutsz bytes in length, so we use that 415 value in the call to bfd_alloc below. But we must be careful to 416 only read in f_opthdr bytes in the call to bfd_read. We should 417 also attempt to catch corrupt or non-COFF binaries with a strange 418 value for f_opthdr. */ 419 if (! bfd_coff_bad_format_hook (abfd, &internal_f) 420 || internal_f.f_opthdr > aoutsz) 421 { 422 bfd_set_error (bfd_error_wrong_format); 423 return NULL; 424 } 425 nscns = internal_f.f_nscns; 426 427 if (internal_f.f_opthdr) 428 { 429 void * opthdr; 430 431 opthdr = _bfd_alloc_and_read (abfd, aoutsz, internal_f.f_opthdr); 432 if (opthdr == NULL) 433 return NULL; 434 /* PR 17512: file: 11056-1136-0.004. */ 435 if (internal_f.f_opthdr < aoutsz) 436 memset (((char *) opthdr) + internal_f.f_opthdr, 0, 437 aoutsz - internal_f.f_opthdr); 438 439 bfd_coff_swap_aouthdr_in (abfd, opthdr, (void *) &internal_a); 440 bfd_release (abfd, opthdr); 441 } 442 443 return coff_real_object_p (abfd, nscns, &internal_f, 444 (internal_f.f_opthdr != 0 445 ? &internal_a 446 : (struct internal_aouthdr *) NULL)); 447 } 448 449 static hashval_t 450 htab_hash_section_target_index (const void * entry) 451 { 452 const struct bfd_section * sec = entry; 453 return sec->target_index; 454 } 455 456 static int 457 htab_eq_section_target_index (const void * e1, const void * e2) 458 { 459 const struct bfd_section * sec1 = e1; 460 const struct bfd_section * sec2 = e2; 461 return sec1->target_index == sec2->target_index; 462 } 463 464 /* Get the BFD section from a COFF symbol section number. */ 465 466 asection * 467 coff_section_from_bfd_index (bfd *abfd, int section_index) 468 { 469 if (section_index == N_ABS) 470 return bfd_abs_section_ptr; 471 if (section_index == N_UNDEF) 472 return bfd_und_section_ptr; 473 if (section_index == N_DEBUG) 474 return bfd_abs_section_ptr; 475 476 struct bfd_section *answer; 477 htab_t table = coff_data (abfd)->section_by_target_index; 478 479 if (!table) 480 { 481 table = htab_create (10, htab_hash_section_target_index, 482 htab_eq_section_target_index, NULL); 483 if (table == NULL) 484 return bfd_und_section_ptr; 485 coff_data (abfd)->section_by_target_index = table; 486 } 487 488 if (htab_elements (table) == 0) 489 { 490 for (answer = abfd->sections; answer; answer = answer->next) 491 { 492 void **slot = htab_find_slot (table, answer, INSERT); 493 if (slot == NULL) 494 return bfd_und_section_ptr; 495 *slot = answer; 496 } 497 } 498 499 struct bfd_section needle; 500 needle.target_index = section_index; 501 502 answer = htab_find (table, &needle); 503 if (answer != NULL) 504 return answer; 505 506 /* Cover the unlikely case of sections added after the first call to 507 this function. */ 508 for (answer = abfd->sections; answer; answer = answer->next) 509 if (answer->target_index == section_index) 510 { 511 void **slot = htab_find_slot (table, answer, INSERT); 512 if (slot != NULL) 513 *slot = answer; 514 return answer; 515 } 516 517 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a 518 has a bad symbol table in biglitpow.o. */ 519 return bfd_und_section_ptr; 520 } 521 522 /* Get the upper bound of a COFF symbol table. */ 523 524 long 525 coff_get_symtab_upper_bound (bfd *abfd) 526 { 527 if (!bfd_coff_slurp_symbol_table (abfd)) 528 return -1; 529 530 return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *)); 531 } 532 533 /* Canonicalize a COFF symbol table. */ 534 535 long 536 coff_canonicalize_symtab (bfd *abfd, asymbol **alocation) 537 { 538 unsigned int counter; 539 coff_symbol_type *symbase; 540 coff_symbol_type **location = (coff_symbol_type **) alocation; 541 542 if (!bfd_coff_slurp_symbol_table (abfd)) 543 return -1; 544 545 symbase = obj_symbols (abfd); 546 counter = bfd_get_symcount (abfd); 547 while (counter-- > 0) 548 *location++ = symbase++; 549 550 *location = NULL; 551 552 return bfd_get_symcount (abfd); 553 } 554 555 /* Get the name of a symbol. The caller must pass in a buffer of size 556 >= SYMNMLEN + 1. */ 557 558 const char * 559 _bfd_coff_internal_syment_name (bfd *abfd, 560 const struct internal_syment *sym, 561 char *buf) 562 { 563 /* FIXME: It's not clear this will work correctly if sizeof 564 (_n_zeroes) != 4. */ 565 if (sym->_n._n_n._n_zeroes != 0 566 || sym->_n._n_n._n_offset == 0) 567 { 568 memcpy (buf, sym->_n._n_name, SYMNMLEN); 569 buf[SYMNMLEN] = '\0'; 570 return buf; 571 } 572 else 573 { 574 const char *strings; 575 576 BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE); 577 strings = obj_coff_strings (abfd); 578 if (strings == NULL) 579 { 580 strings = _bfd_coff_read_string_table (abfd); 581 if (strings == NULL) 582 return NULL; 583 } 584 if (sym->_n._n_n._n_offset >= obj_coff_strings_len (abfd)) 585 return NULL; 586 return strings + sym->_n._n_n._n_offset; 587 } 588 } 589 590 /* Read in and swap the relocs. This returns a buffer holding the 591 relocs for section SEC in file ABFD. If CACHE is TRUE and 592 INTERNAL_RELOCS is NULL, the relocs read in will be saved in case 593 the function is called again. If EXTERNAL_RELOCS is not NULL, it 594 is a buffer large enough to hold the unswapped relocs. If 595 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold 596 the swapped relocs. If REQUIRE_INTERNAL is TRUE, then the return 597 value must be INTERNAL_RELOCS. The function returns NULL on error. */ 598 599 struct internal_reloc * 600 _bfd_coff_read_internal_relocs (bfd *abfd, 601 asection *sec, 602 bool cache, 603 bfd_byte *external_relocs, 604 bool require_internal, 605 struct internal_reloc *internal_relocs) 606 { 607 bfd_size_type relsz; 608 bfd_byte *free_external = NULL; 609 struct internal_reloc *free_internal = NULL; 610 bfd_byte *erel; 611 bfd_byte *erel_end; 612 struct internal_reloc *irel; 613 bfd_size_type amt; 614 615 if (sec->reloc_count == 0) 616 return internal_relocs; /* Nothing to do. */ 617 618 if (coff_section_data (abfd, sec) != NULL 619 && coff_section_data (abfd, sec)->relocs != NULL) 620 { 621 if (! require_internal) 622 return coff_section_data (abfd, sec)->relocs; 623 memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs, 624 sec->reloc_count * sizeof (struct internal_reloc)); 625 return internal_relocs; 626 } 627 628 relsz = bfd_coff_relsz (abfd); 629 630 amt = sec->reloc_count * relsz; 631 if (external_relocs == NULL) 632 { 633 free_external = (bfd_byte *) bfd_malloc (amt); 634 if (free_external == NULL) 635 goto error_return; 636 external_relocs = free_external; 637 } 638 639 if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0 640 || bfd_read (external_relocs, amt, abfd) != amt) 641 goto error_return; 642 643 if (internal_relocs == NULL) 644 { 645 amt = sec->reloc_count; 646 amt *= sizeof (struct internal_reloc); 647 free_internal = (struct internal_reloc *) bfd_malloc (amt); 648 if (free_internal == NULL) 649 goto error_return; 650 internal_relocs = free_internal; 651 } 652 653 /* Swap in the relocs. */ 654 erel = external_relocs; 655 erel_end = erel + relsz * sec->reloc_count; 656 irel = internal_relocs; 657 for (; erel < erel_end; erel += relsz, irel++) 658 bfd_coff_swap_reloc_in (abfd, (void *) erel, (void *) irel); 659 660 free (free_external); 661 free_external = NULL; 662 663 if (cache && free_internal != NULL) 664 { 665 if (coff_section_data (abfd, sec) == NULL) 666 { 667 amt = sizeof (struct coff_section_tdata); 668 sec->used_by_bfd = bfd_zalloc (abfd, amt); 669 if (sec->used_by_bfd == NULL) 670 goto error_return; 671 coff_section_data (abfd, sec)->contents = NULL; 672 } 673 coff_section_data (abfd, sec)->relocs = free_internal; 674 } 675 676 return internal_relocs; 677 678 error_return: 679 free (free_external); 680 free (free_internal); 681 return NULL; 682 } 683 684 /* Set lineno_count for the output sections of a COFF file. */ 685 686 int 687 coff_count_linenumbers (bfd *abfd) 688 { 689 unsigned int limit = bfd_get_symcount (abfd); 690 unsigned int i; 691 int total = 0; 692 asymbol **p; 693 asection *s; 694 695 if (limit == 0) 696 { 697 /* This may be from the backend linker, in which case the 698 lineno_count in the sections is correct. */ 699 for (s = abfd->sections; s != NULL; s = s->next) 700 total += s->lineno_count; 701 return total; 702 } 703 704 for (s = abfd->sections; s != NULL; s = s->next) 705 BFD_ASSERT (s->lineno_count == 0); 706 707 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) 708 { 709 asymbol *q_maybe = *p; 710 711 if (bfd_asymbol_bfd (q_maybe) != NULL 712 && bfd_family_coff (bfd_asymbol_bfd (q_maybe))) 713 { 714 coff_symbol_type *q = coffsymbol (q_maybe); 715 716 /* The AIX 4.1 compiler can sometimes generate line numbers 717 attached to debugging symbols. We try to simply ignore 718 those here. */ 719 if (q->lineno != NULL 720 && q->symbol.section->owner != NULL) 721 { 722 /* This symbol has line numbers. Increment the owning 723 section's linenumber count. */ 724 alent *l = q->lineno; 725 726 do 727 { 728 asection * sec = q->symbol.section->output_section; 729 730 /* Do not try to update fields in read-only sections. */ 731 if (! bfd_is_const_section (sec)) 732 sec->lineno_count ++; 733 734 ++total; 735 ++l; 736 } 737 while (l->line_number != 0); 738 } 739 } 740 } 741 742 return total; 743 } 744 745 static void 746 fixup_symbol_value (bfd *abfd, 747 coff_symbol_type *coff_symbol_ptr, 748 struct internal_syment *syment) 749 { 750 /* Normalize the symbol flags. */ 751 if (coff_symbol_ptr->symbol.section 752 && bfd_is_com_section (coff_symbol_ptr->symbol.section)) 753 { 754 /* A common symbol is undefined with a value. */ 755 syment->n_scnum = N_UNDEF; 756 syment->n_value = coff_symbol_ptr->symbol.value; 757 } 758 else if ((coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) != 0 759 && (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING_RELOC) == 0) 760 { 761 syment->n_value = coff_symbol_ptr->symbol.value; 762 } 763 else if (bfd_is_und_section (coff_symbol_ptr->symbol.section)) 764 { 765 syment->n_scnum = N_UNDEF; 766 syment->n_value = 0; 767 } 768 /* FIXME: Do we need to handle the absolute section here? */ 769 else 770 { 771 if (coff_symbol_ptr->symbol.section) 772 { 773 syment->n_scnum = 774 coff_symbol_ptr->symbol.section->output_section->target_index; 775 776 syment->n_value = (coff_symbol_ptr->symbol.value 777 + coff_symbol_ptr->symbol.section->output_offset); 778 if (! obj_pe (abfd)) 779 { 780 syment->n_value += (syment->n_sclass == C_STATLAB) 781 ? coff_symbol_ptr->symbol.section->output_section->lma 782 : coff_symbol_ptr->symbol.section->output_section->vma; 783 } 784 } 785 else 786 { 787 BFD_ASSERT (0); 788 /* This can happen, but I don't know why yet (steve@cygnus.com) */ 789 syment->n_scnum = N_ABS; 790 syment->n_value = coff_symbol_ptr->symbol.value; 791 } 792 } 793 } 794 795 /* Run through all the symbols in the symbol table and work out what 796 their indexes into the symbol table will be when output. 797 798 Coff requires that each C_FILE symbol points to the next one in the 799 chain, and that the last one points to the first external symbol. We 800 do that here too. */ 801 802 bool 803 coff_renumber_symbols (bfd *bfd_ptr, int *first_undef) 804 { 805 unsigned int symbol_count = bfd_get_symcount (bfd_ptr); 806 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols; 807 unsigned int native_index = 0; 808 struct internal_syment *last_file = NULL; 809 unsigned int symbol_index; 810 811 /* COFF demands that undefined symbols come after all other symbols. 812 Since we don't need to impose this extra knowledge on all our 813 client programs, deal with that here. Sort the symbol table; 814 just move the undefined symbols to the end, leaving the rest 815 alone. The O'Reilly book says that defined global symbols come 816 at the end before the undefined symbols, so we do that here as 817 well. */ 818 /* @@ Do we have some condition we could test for, so we don't always 819 have to do this? I don't think relocatability is quite right, but 820 I'm not certain. [raeburn:19920508.1711EST] */ 821 { 822 asymbol **newsyms; 823 unsigned int i; 824 bfd_size_type amt; 825 826 amt = sizeof (asymbol *) * ((bfd_size_type) symbol_count + 1); 827 newsyms = (asymbol **) bfd_alloc (bfd_ptr, amt); 828 if (!newsyms) 829 return false; 830 bfd_ptr->outsymbols = newsyms; 831 for (i = 0; i < symbol_count; i++) 832 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0 833 || (!bfd_is_und_section (symbol_ptr_ptr[i]->section) 834 && !bfd_is_com_section (symbol_ptr_ptr[i]->section) 835 && ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) != 0 836 || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK)) 837 == 0)))) 838 *newsyms++ = symbol_ptr_ptr[i]; 839 840 for (i = 0; i < symbol_count; i++) 841 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0 842 && !bfd_is_und_section (symbol_ptr_ptr[i]->section) 843 && (bfd_is_com_section (symbol_ptr_ptr[i]->section) 844 || ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) == 0 845 && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK)) 846 != 0)))) 847 *newsyms++ = symbol_ptr_ptr[i]; 848 849 *first_undef = newsyms - bfd_ptr->outsymbols; 850 851 for (i = 0; i < symbol_count; i++) 852 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0 853 && bfd_is_und_section (symbol_ptr_ptr[i]->section)) 854 *newsyms++ = symbol_ptr_ptr[i]; 855 *newsyms = (asymbol *) NULL; 856 symbol_ptr_ptr = bfd_ptr->outsymbols; 857 } 858 859 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++) 860 { 861 coff_symbol_type *coff_symbol_ptr; 862 863 coff_symbol_ptr = coff_symbol_from (symbol_ptr_ptr[symbol_index]); 864 symbol_ptr_ptr[symbol_index]->udata.i = symbol_index; 865 if (coff_symbol_ptr && coff_symbol_ptr->native) 866 { 867 combined_entry_type *s = coff_symbol_ptr->native; 868 int i; 869 870 BFD_ASSERT (s->is_sym); 871 if (s->u.syment.n_sclass == C_FILE) 872 { 873 if (last_file != NULL) 874 last_file->n_value = native_index; 875 last_file = &(s->u.syment); 876 } 877 else 878 /* Modify the symbol values according to their section and 879 type. */ 880 fixup_symbol_value (bfd_ptr, coff_symbol_ptr, &(s->u.syment)); 881 882 for (i = 0; i < s->u.syment.n_numaux + 1; i++) 883 s[i].offset = native_index++; 884 } 885 else 886 native_index++; 887 } 888 889 obj_conv_table_size (bfd_ptr) = native_index; 890 891 return true; 892 } 893 894 /* Run thorough the symbol table again, and fix it so that all 895 pointers to entries are changed to the entries' index in the output 896 symbol table. */ 897 898 void 899 coff_mangle_symbols (bfd *bfd_ptr) 900 { 901 unsigned int symbol_count = bfd_get_symcount (bfd_ptr); 902 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols; 903 unsigned int symbol_index; 904 905 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++) 906 { 907 coff_symbol_type *coff_symbol_ptr; 908 909 coff_symbol_ptr = coff_symbol_from (symbol_ptr_ptr[symbol_index]); 910 if (coff_symbol_ptr && coff_symbol_ptr->native) 911 { 912 int i; 913 combined_entry_type *s = coff_symbol_ptr->native; 914 915 BFD_ASSERT (s->is_sym); 916 if (s->fix_value) 917 { 918 /* FIXME: We should use a union here. */ 919 s->u.syment.n_value = 920 (uintptr_t) ((combined_entry_type *) 921 (uintptr_t) s->u.syment.n_value)->offset; 922 s->fix_value = 0; 923 } 924 if (s->fix_line) 925 { 926 /* The value is the offset into the line number entries 927 for the symbol's section. On output, the symbol's 928 section should be N_DEBUG. */ 929 s->u.syment.n_value = 930 (coff_symbol_ptr->symbol.section->output_section->line_filepos 931 + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr)); 932 coff_symbol_ptr->symbol.section = 933 coff_section_from_bfd_index (bfd_ptr, N_DEBUG); 934 BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING); 935 } 936 for (i = 0; i < s->u.syment.n_numaux; i++) 937 { 938 combined_entry_type *a = s + i + 1; 939 940 BFD_ASSERT (! a->is_sym); 941 if (a->fix_tag) 942 { 943 a->u.auxent.x_sym.x_tagndx.u32 = 944 a->u.auxent.x_sym.x_tagndx.p->offset; 945 a->fix_tag = 0; 946 } 947 if (a->fix_end) 948 { 949 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32 = 950 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset; 951 a->fix_end = 0; 952 } 953 if (a->fix_scnlen) 954 { 955 a->u.auxent.x_csect.x_scnlen.u64 = 956 a->u.auxent.x_csect.x_scnlen.p->offset; 957 a->fix_scnlen = 0; 958 } 959 } 960 } 961 } 962 } 963 964 static bool 965 coff_write_auxent_fname (bfd *abfd, 966 char *str, 967 union internal_auxent *auxent, 968 struct bfd_strtab_hash *strtab, 969 bool hash) 970 { 971 unsigned int str_length = strlen (str); 972 unsigned int filnmlen = bfd_coff_filnmlen (abfd); 973 974 if (bfd_coff_long_filenames (abfd)) 975 { 976 if (str_length <= filnmlen) 977 strncpy (auxent->x_file.x_n.x_fname, str, filnmlen); 978 else 979 { 980 bfd_size_type indx = _bfd_stringtab_add (strtab, str, hash, false); 981 982 if (indx == (bfd_size_type) -1) 983 return false; 984 985 auxent->x_file.x_n.x_n.x_offset = STRING_SIZE_SIZE + indx; 986 auxent->x_file.x_n.x_n.x_zeroes = 0; 987 } 988 } 989 else 990 { 991 strncpy (auxent->x_file.x_n.x_fname, str, filnmlen); 992 if (str_length > filnmlen) 993 str[filnmlen] = '\0'; 994 } 995 996 return true; 997 } 998 999 static bool 1000 coff_fix_symbol_name (bfd *abfd, 1001 asymbol *symbol, 1002 combined_entry_type *native, 1003 struct bfd_strtab_hash *strtab, 1004 bool hash, 1005 asection **debug_string_section_p, 1006 bfd_size_type *debug_string_size_p) 1007 { 1008 unsigned int name_length; 1009 char *name = (char *) (symbol->name); 1010 bfd_size_type indx; 1011 1012 if (name == NULL) 1013 { 1014 /* COFF symbols always have names, so we'll make one up. */ 1015 symbol->name = "strange"; 1016 name = (char *) symbol->name; 1017 } 1018 name_length = strlen (name); 1019 1020 BFD_ASSERT (native->is_sym); 1021 if (native->u.syment.n_sclass == C_FILE 1022 && native->u.syment.n_numaux > 0) 1023 { 1024 if (bfd_coff_force_symnames_in_strings (abfd)) 1025 { 1026 indx = _bfd_stringtab_add (strtab, ".file", hash, false); 1027 if (indx == (bfd_size_type) -1) 1028 return false; 1029 1030 native->u.syment._n._n_n._n_offset = STRING_SIZE_SIZE + indx; 1031 native->u.syment._n._n_n._n_zeroes = 0; 1032 } 1033 else 1034 strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN); 1035 1036 BFD_ASSERT (! (native + 1)->is_sym); 1037 if (!coff_write_auxent_fname (abfd, name, &(native + 1)->u.auxent, 1038 strtab, hash)) 1039 return false; 1040 } 1041 else 1042 { 1043 if (name_length <= SYMNMLEN && !bfd_coff_force_symnames_in_strings (abfd)) 1044 /* This name will fit into the symbol neatly. */ 1045 strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN); 1046 1047 else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment)) 1048 { 1049 indx = _bfd_stringtab_add (strtab, name, hash, false); 1050 if (indx == (bfd_size_type) -1) 1051 return false; 1052 1053 native->u.syment._n._n_n._n_offset = STRING_SIZE_SIZE + indx; 1054 native->u.syment._n._n_n._n_zeroes = 0; 1055 } 1056 else 1057 { 1058 file_ptr filepos; 1059 bfd_byte buf[4]; 1060 int prefix_len = bfd_coff_debug_string_prefix_length (abfd); 1061 1062 /* This name should be written into the .debug section. For 1063 some reason each name is preceded by a two byte length 1064 and also followed by a null byte. FIXME: We assume that 1065 the .debug section has already been created, and that it 1066 is large enough. */ 1067 if (*debug_string_section_p == (asection *) NULL) 1068 *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug"); 1069 filepos = bfd_tell (abfd); 1070 if (prefix_len == 4) 1071 bfd_put_32 (abfd, (bfd_vma) (name_length + 1), buf); 1072 else 1073 bfd_put_16 (abfd, (bfd_vma) (name_length + 1), buf); 1074 1075 if (!bfd_set_section_contents (abfd, 1076 *debug_string_section_p, 1077 (void *) buf, 1078 (file_ptr) *debug_string_size_p, 1079 (bfd_size_type) prefix_len) 1080 || !bfd_set_section_contents (abfd, 1081 *debug_string_section_p, 1082 (void *) symbol->name, 1083 (file_ptr) (*debug_string_size_p 1084 + prefix_len), 1085 (bfd_size_type) name_length + 1)) 1086 abort (); 1087 if (bfd_seek (abfd, filepos, SEEK_SET) != 0) 1088 abort (); 1089 native->u.syment._n._n_n._n_offset = 1090 *debug_string_size_p + prefix_len; 1091 native->u.syment._n._n_n._n_zeroes = 0; 1092 *debug_string_size_p += name_length + 1 + prefix_len; 1093 } 1094 } 1095 1096 return true; 1097 } 1098 1099 /* We need to keep track of the symbol index so that when we write out 1100 the relocs we can get the index for a symbol. This method is a 1101 hack. FIXME. */ 1102 1103 #define set_index(symbol, idx) ((symbol)->udata.i = (idx)) 1104 1105 /* Write a symbol out to a COFF file. */ 1106 1107 static bool 1108 coff_write_symbol (bfd *abfd, 1109 asymbol *symbol, 1110 combined_entry_type *native, 1111 bfd_vma *written, 1112 struct bfd_strtab_hash *strtab, 1113 bool hash, 1114 asection **debug_string_section_p, 1115 bfd_size_type *debug_string_size_p) 1116 { 1117 unsigned int numaux = native->u.syment.n_numaux; 1118 int type = native->u.syment.n_type; 1119 int n_sclass = (int) native->u.syment.n_sclass; 1120 asection *output_section = symbol->section->output_section 1121 ? symbol->section->output_section 1122 : symbol->section; 1123 void * buf; 1124 bfd_size_type symesz; 1125 1126 BFD_ASSERT (native->is_sym); 1127 1128 if (native->u.syment.n_sclass == C_FILE) 1129 symbol->flags |= BSF_DEBUGGING; 1130 1131 if (symbol->flags & BSF_DEBUGGING 1132 && bfd_is_abs_section (symbol->section)) 1133 native->u.syment.n_scnum = N_DEBUG; 1134 1135 else if (bfd_is_abs_section (symbol->section)) 1136 native->u.syment.n_scnum = N_ABS; 1137 1138 else if (bfd_is_und_section (symbol->section)) 1139 native->u.syment.n_scnum = N_UNDEF; 1140 1141 else 1142 native->u.syment.n_scnum = 1143 output_section->target_index; 1144 1145 if (!coff_fix_symbol_name (abfd, symbol, native, strtab, hash, 1146 debug_string_section_p, debug_string_size_p)) 1147 return false; 1148 1149 symesz = bfd_coff_symesz (abfd); 1150 buf = bfd_alloc (abfd, symesz); 1151 if (!buf) 1152 return false; 1153 bfd_coff_swap_sym_out (abfd, &native->u.syment, buf); 1154 if (bfd_write (buf, symesz, abfd) != symesz) 1155 return false; 1156 bfd_release (abfd, buf); 1157 1158 if (native->u.syment.n_numaux > 0) 1159 { 1160 bfd_size_type auxesz; 1161 unsigned int j; 1162 1163 auxesz = bfd_coff_auxesz (abfd); 1164 buf = bfd_alloc (abfd, auxesz); 1165 if (!buf) 1166 return false; 1167 for (j = 0; j < native->u.syment.n_numaux; j++) 1168 { 1169 BFD_ASSERT (! (native + j + 1)->is_sym); 1170 1171 /* Adjust auxent only if this isn't the filename 1172 auxiliary entry. */ 1173 if (native->u.syment.n_sclass == C_FILE 1174 && (native + j + 1)->u.auxent.x_file.x_ftype 1175 && (native + j + 1)->extrap) 1176 coff_write_auxent_fname (abfd, (char *) (native + j + 1)->extrap, 1177 &(native + j + 1)->u.auxent, strtab, hash); 1178 1179 bfd_coff_swap_aux_out (abfd, 1180 &((native + j + 1)->u.auxent), 1181 type, n_sclass, (int) j, 1182 native->u.syment.n_numaux, 1183 buf); 1184 if (bfd_write (buf, auxesz, abfd) != auxesz) 1185 return false; 1186 } 1187 bfd_release (abfd, buf); 1188 } 1189 1190 /* Store the index for use when we write out the relocs. */ 1191 set_index (symbol, *written); 1192 1193 *written += numaux + 1; 1194 return true; 1195 } 1196 1197 /* Write out a symbol to a COFF file that does not come from a COFF 1198 file originally. This symbol may have been created by the linker, 1199 or we may be linking a non COFF file to a COFF file. */ 1200 1201 bool 1202 coff_write_alien_symbol (bfd *abfd, 1203 asymbol *symbol, 1204 struct internal_syment *isym, 1205 bfd_vma *written, 1206 struct bfd_strtab_hash *strtab, 1207 bool hash, 1208 asection **debug_string_section_p, 1209 bfd_size_type *debug_string_size_p) 1210 { 1211 combined_entry_type *native; 1212 combined_entry_type dummy[2]; 1213 asection *output_section = symbol->section->output_section 1214 ? symbol->section->output_section 1215 : symbol->section; 1216 struct bfd_link_info *link_info = coff_data (abfd)->link_info; 1217 bool ret; 1218 1219 if ((!link_info || link_info->strip_discarded) 1220 && !bfd_is_abs_section (symbol->section) 1221 && symbol->section->output_section == bfd_abs_section_ptr) 1222 { 1223 symbol->name = ""; 1224 if (isym != NULL) 1225 memset (isym, 0, sizeof (*isym)); 1226 return true; 1227 } 1228 memset (dummy, 0, sizeof dummy); 1229 native = dummy; 1230 native->is_sym = true; 1231 native[1].is_sym = false; 1232 native->u.syment.n_type = T_NULL; 1233 native->u.syment.n_flags = 0; 1234 native->u.syment.n_numaux = 0; 1235 if (bfd_is_und_section (symbol->section)) 1236 { 1237 native->u.syment.n_scnum = N_UNDEF; 1238 native->u.syment.n_value = symbol->value; 1239 } 1240 else if (bfd_is_com_section (symbol->section)) 1241 { 1242 native->u.syment.n_scnum = N_UNDEF; 1243 native->u.syment.n_value = symbol->value; 1244 } 1245 else if (symbol->flags & BSF_FILE) 1246 { 1247 native->u.syment.n_scnum = N_DEBUG; 1248 native->u.syment.n_numaux = 1; 1249 } 1250 else if (symbol->flags & BSF_DEBUGGING) 1251 { 1252 /* There isn't much point to writing out a debugging symbol 1253 unless we are prepared to convert it into COFF debugging 1254 format. So, we just ignore them. We must clobber the symbol 1255 name to keep it from being put in the string table. */ 1256 symbol->name = ""; 1257 if (isym != NULL) 1258 memset (isym, 0, sizeof (*isym)); 1259 return true; 1260 } 1261 else 1262 { 1263 native->u.syment.n_scnum = output_section->target_index; 1264 native->u.syment.n_value = (symbol->value 1265 + symbol->section->output_offset); 1266 if (! obj_pe (abfd)) 1267 native->u.syment.n_value += output_section->vma; 1268 1269 /* Copy the any flags from the file header into the symbol. 1270 FIXME: Why? */ 1271 { 1272 coff_symbol_type *c = coff_symbol_from (symbol); 1273 if (c != (coff_symbol_type *) NULL) 1274 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags; 1275 } 1276 } 1277 1278 native->u.syment.n_type = 0; 1279 if (symbol->flags & BSF_FILE) 1280 native->u.syment.n_sclass = C_FILE; 1281 else if (symbol->flags & BSF_LOCAL) 1282 native->u.syment.n_sclass = C_STAT; 1283 else if (symbol->flags & BSF_WEAK) 1284 native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT; 1285 else 1286 native->u.syment.n_sclass = C_EXT; 1287 1288 ret = coff_write_symbol (abfd, symbol, native, written, strtab, hash, 1289 debug_string_section_p, debug_string_size_p); 1290 if (isym != NULL) 1291 *isym = native->u.syment; 1292 return ret; 1293 } 1294 1295 /* Write a native symbol to a COFF file. */ 1296 1297 static bool 1298 coff_write_native_symbol (bfd *abfd, 1299 coff_symbol_type *symbol, 1300 bfd_vma *written, 1301 struct bfd_strtab_hash *strtab, 1302 asection **debug_string_section_p, 1303 bfd_size_type *debug_string_size_p) 1304 { 1305 combined_entry_type *native = symbol->native; 1306 alent *lineno = symbol->lineno; 1307 struct bfd_link_info *link_info = coff_data (abfd)->link_info; 1308 1309 if ((!link_info || link_info->strip_discarded) 1310 && !bfd_is_abs_section (symbol->symbol.section) 1311 && symbol->symbol.section->output_section == bfd_abs_section_ptr) 1312 { 1313 symbol->symbol.name = ""; 1314 return true; 1315 } 1316 1317 BFD_ASSERT (native->is_sym); 1318 /* If this symbol has an associated line number, we must store the 1319 symbol index in the line number field. We also tag the auxent to 1320 point to the right place in the lineno table. */ 1321 if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL) 1322 { 1323 unsigned int count = 0; 1324 1325 lineno[count].u.offset = *written; 1326 if (native->u.syment.n_numaux) 1327 { 1328 union internal_auxent *a = &((native + 1)->u.auxent); 1329 1330 a->x_sym.x_fcnary.x_fcn.x_lnnoptr = 1331 symbol->symbol.section->output_section->moving_line_filepos; 1332 } 1333 1334 /* Count and relocate all other linenumbers. */ 1335 count++; 1336 while (lineno[count].line_number != 0) 1337 { 1338 lineno[count].u.offset += 1339 (symbol->symbol.section->output_section->vma 1340 + symbol->symbol.section->output_offset); 1341 count++; 1342 } 1343 symbol->done_lineno = true; 1344 1345 if (! bfd_is_const_section (symbol->symbol.section->output_section)) 1346 symbol->symbol.section->output_section->moving_line_filepos += 1347 count * bfd_coff_linesz (abfd); 1348 } 1349 1350 return coff_write_symbol (abfd, &(symbol->symbol), native, written, 1351 strtab, true, debug_string_section_p, 1352 debug_string_size_p); 1353 } 1354 1355 static void 1356 null_error_handler (const char *fmt ATTRIBUTE_UNUSED, 1357 va_list ap ATTRIBUTE_UNUSED) 1358 { 1359 } 1360 1361 /* Write out the COFF symbols. */ 1362 1363 bool 1364 coff_write_symbols (bfd *abfd) 1365 { 1366 struct bfd_strtab_hash *strtab; 1367 asection *debug_string_section; 1368 bfd_size_type debug_string_size; 1369 unsigned int i; 1370 unsigned int limit = bfd_get_symcount (abfd); 1371 bfd_vma written = 0; 1372 asymbol **p; 1373 1374 debug_string_section = NULL; 1375 debug_string_size = 0; 1376 1377 strtab = _bfd_stringtab_init (); 1378 if (strtab == NULL) 1379 return false; 1380 1381 /* If this target supports long section names, they must be put into 1382 the string table. This is supported by PE. This code must 1383 handle section names just as they are handled in 1384 coff_write_object_contents. This is why we pass hash as FALSE below. */ 1385 if (bfd_coff_long_section_names (abfd)) 1386 { 1387 asection *o; 1388 1389 for (o = abfd->sections; o != NULL; o = o->next) 1390 if (strlen (o->name) > SCNNMLEN 1391 && _bfd_stringtab_add (strtab, o->name, false, false) 1392 == (bfd_size_type) -1) 1393 return false; 1394 } 1395 1396 /* Seek to the right place. */ 1397 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0) 1398 return false; 1399 1400 /* Output all the symbols we have. */ 1401 written = 0; 1402 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) 1403 { 1404 asymbol *symbol = *p; 1405 coff_symbol_type *c_symbol = coff_symbol_from (symbol); 1406 1407 if (c_symbol == (coff_symbol_type *) NULL 1408 || c_symbol->native == (combined_entry_type *) NULL) 1409 { 1410 if (!coff_write_alien_symbol (abfd, symbol, NULL, &written, 1411 strtab, true, &debug_string_section, 1412 &debug_string_size)) 1413 return false; 1414 } 1415 else 1416 { 1417 if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL) 1418 { 1419 bfd_error_handler_type current_error_handler; 1420 enum coff_symbol_classification sym_class; 1421 unsigned char *n_sclass; 1422 1423 /* Suppress error reporting by bfd_coff_classify_symbol. 1424 Error messages can be generated when we are processing a local 1425 symbol which has no associated section and we do not have to 1426 worry about this, all we need to know is that it is local. */ 1427 current_error_handler = bfd_set_error_handler (null_error_handler); 1428 BFD_ASSERT (c_symbol->native->is_sym); 1429 sym_class = bfd_coff_classify_symbol (abfd, 1430 &c_symbol->native->u.syment); 1431 (void) bfd_set_error_handler (current_error_handler); 1432 1433 n_sclass = &c_symbol->native->u.syment.n_sclass; 1434 1435 /* If the symbol class has been changed (eg objcopy/ld script/etc) 1436 we cannot retain the existing sclass from the original symbol. 1437 Weak symbols only have one valid sclass, so just set it always. 1438 If it is not local class and should be, set it C_STAT. 1439 If it is global and not classified as global, or if it is 1440 weak (which is also classified as global), set it C_EXT. */ 1441 1442 if (symbol->flags & BSF_WEAK) 1443 *n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT; 1444 else if (symbol->flags & BSF_LOCAL && sym_class != COFF_SYMBOL_LOCAL) 1445 *n_sclass = C_STAT; 1446 else if (symbol->flags & BSF_GLOBAL 1447 && (sym_class != COFF_SYMBOL_GLOBAL 1448 #ifdef COFF_WITH_PE 1449 || *n_sclass == C_NT_WEAK 1450 #endif 1451 || *n_sclass == C_WEAKEXT)) 1452 c_symbol->native->u.syment.n_sclass = C_EXT; 1453 } 1454 1455 if (!coff_write_native_symbol (abfd, c_symbol, &written, 1456 strtab, &debug_string_section, 1457 &debug_string_size)) 1458 return false; 1459 } 1460 } 1461 1462 obj_raw_syment_count (abfd) = written; 1463 1464 /* Now write out strings. 1465 1466 We would normally not write anything here if there are no strings, but 1467 we'll write out 4 so that any stupid coff reader which tries to read the 1468 string table even when there isn't one won't croak. */ 1469 { 1470 bfd_byte buffer[STRING_SIZE_SIZE]; 1471 1472 #if STRING_SIZE_SIZE == 4 1473 H_PUT_32 (abfd, _bfd_stringtab_size (strtab) + STRING_SIZE_SIZE, buffer); 1474 #else 1475 #error Change H_PUT_32 1476 #endif 1477 if (bfd_write (buffer, sizeof (buffer), abfd) != sizeof (buffer)) 1478 return false; 1479 1480 if (! _bfd_stringtab_emit (abfd, strtab)) 1481 return false; 1482 } 1483 1484 _bfd_stringtab_free (strtab); 1485 1486 /* Make sure the .debug section was created to be the correct size. 1487 We should create it ourselves on the fly, but we don't because 1488 BFD won't let us write to any section until we know how large all 1489 the sections are. We could still do it by making another pass 1490 over the symbols. FIXME. */ 1491 BFD_ASSERT (debug_string_size == 0 1492 || (debug_string_section != (asection *) NULL 1493 && (BFD_ALIGN (debug_string_size, 1494 1 << debug_string_section->alignment_power) 1495 == debug_string_section->size))); 1496 1497 return true; 1498 } 1499 1500 bool 1501 coff_write_linenumbers (bfd *abfd) 1502 { 1503 asection *s; 1504 bfd_size_type linesz; 1505 void * buff; 1506 1507 linesz = bfd_coff_linesz (abfd); 1508 buff = bfd_alloc (abfd, linesz); 1509 if (!buff) 1510 return false; 1511 for (s = abfd->sections; s != (asection *) NULL; s = s->next) 1512 { 1513 if (s->lineno_count) 1514 { 1515 asymbol **q = abfd->outsymbols; 1516 if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0) 1517 return false; 1518 /* Find all the linenumbers in this section. */ 1519 while (*q) 1520 { 1521 asymbol *p = *q; 1522 if (p->section->output_section == s) 1523 { 1524 alent *l = 1525 BFD_SEND (bfd_asymbol_bfd (p), _get_lineno, 1526 (bfd_asymbol_bfd (p), p)); 1527 if (l) 1528 { 1529 /* Found a linenumber entry, output. */ 1530 struct internal_lineno out; 1531 1532 memset ((void *) & out, 0, sizeof (out)); 1533 out.l_lnno = 0; 1534 out.l_addr.l_symndx = l->u.offset; 1535 bfd_coff_swap_lineno_out (abfd, &out, buff); 1536 if (bfd_write (buff, linesz, abfd) != linesz) 1537 return false; 1538 l++; 1539 while (l->line_number) 1540 { 1541 out.l_lnno = l->line_number; 1542 out.l_addr.l_symndx = l->u.offset; 1543 bfd_coff_swap_lineno_out (abfd, &out, buff); 1544 if (bfd_write (buff, linesz, abfd) != linesz) 1545 return false; 1546 l++; 1547 } 1548 } 1549 } 1550 q++; 1551 } 1552 } 1553 } 1554 bfd_release (abfd, buff); 1555 return true; 1556 } 1557 1558 alent * 1559 coff_get_lineno (bfd *ignore_abfd ATTRIBUTE_UNUSED, asymbol *symbol) 1560 { 1561 return coffsymbol (symbol)->lineno; 1562 } 1563 1564 /* This function transforms the offsets into the symbol table into 1565 pointers to syments. */ 1566 1567 static void 1568 coff_pointerize_aux (bfd *abfd, 1569 combined_entry_type *table_base, 1570 combined_entry_type *symbol, 1571 unsigned int indaux, 1572 combined_entry_type *auxent) 1573 { 1574 unsigned int type = symbol->u.syment.n_type; 1575 unsigned int n_sclass = symbol->u.syment.n_sclass; 1576 1577 BFD_ASSERT (symbol->is_sym); 1578 if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook) 1579 { 1580 if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook) 1581 (abfd, table_base, symbol, indaux, auxent)) 1582 return; 1583 } 1584 1585 /* Don't bother if this is a file or a section. */ 1586 if (n_sclass == C_STAT && type == T_NULL) 1587 return; 1588 if (n_sclass == C_FILE) 1589 return; 1590 if (n_sclass == C_DWARF) 1591 return; 1592 1593 BFD_ASSERT (! auxent->is_sym); 1594 /* Otherwise patch up. */ 1595 #define N_TMASK coff_data (abfd)->local_n_tmask 1596 #define N_BTSHFT coff_data (abfd)->local_n_btshft 1597 1598 if ((ISFCN (type) || ISTAG (n_sclass) || n_sclass == C_BLOCK 1599 || n_sclass == C_FCN) 1600 && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32 > 0 1601 && (auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32 1602 < obj_raw_syment_count (abfd))) 1603 { 1604 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = 1605 table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32; 1606 auxent->fix_end = 1; 1607 } 1608 1609 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can 1610 generate one, so we must be careful to ignore it. */ 1611 if (auxent->u.auxent.x_sym.x_tagndx.u32 < obj_raw_syment_count (abfd)) 1612 { 1613 auxent->u.auxent.x_sym.x_tagndx.p = 1614 table_base + auxent->u.auxent.x_sym.x_tagndx.u32; 1615 auxent->fix_tag = 1; 1616 } 1617 } 1618 1619 /* Allocate space for the ".debug" section, and read it. 1620 We did not read the debug section until now, because 1621 we didn't want to go to the trouble until someone needed it. */ 1622 1623 static char * 1624 build_debug_section (bfd *abfd, asection ** sect_return) 1625 { 1626 char *debug_section; 1627 file_ptr position; 1628 bfd_size_type sec_size; 1629 1630 asection *sect = bfd_get_section_by_name (abfd, ".debug"); 1631 1632 if (!sect) 1633 { 1634 bfd_set_error (bfd_error_no_debug_section); 1635 return NULL; 1636 } 1637 1638 /* Seek to the beginning of the `.debug' section and read it. 1639 Save the current position first; it is needed by our caller. 1640 Then read debug section and reset the file pointer. */ 1641 1642 position = bfd_tell (abfd); 1643 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0) 1644 return NULL; 1645 1646 sec_size = sect->size; 1647 debug_section = (char *) _bfd_alloc_and_read (abfd, sec_size + 1, sec_size); 1648 if (debug_section == NULL) 1649 return NULL; 1650 debug_section[sec_size] = 0; 1651 1652 if (bfd_seek (abfd, position, SEEK_SET) != 0) 1653 return NULL; 1654 1655 * sect_return = sect; 1656 return debug_section; 1657 } 1658 1659 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be 1660 \0-terminated, but will not exceed 'maxlen' characters. The copy *will* 1661 be \0-terminated. */ 1662 1663 static char * 1664 copy_name (bfd *abfd, char *name, size_t maxlen) 1665 { 1666 size_t len; 1667 char *newname; 1668 1669 for (len = 0; len < maxlen; ++len) 1670 if (name[len] == '\0') 1671 break; 1672 1673 if ((newname = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1)) == NULL) 1674 return NULL; 1675 1676 strncpy (newname, name, len); 1677 newname[len] = '\0'; 1678 return newname; 1679 } 1680 1681 /* Read in the external symbols. */ 1682 1683 bool 1684 _bfd_coff_get_external_symbols (bfd *abfd) 1685 { 1686 size_t symesz; 1687 size_t size; 1688 void * syms; 1689 ufile_ptr filesize; 1690 1691 if (obj_coff_external_syms (abfd) != NULL) 1692 return true; 1693 1694 symesz = bfd_coff_symesz (abfd); 1695 if (_bfd_mul_overflow (obj_raw_syment_count (abfd), symesz, &size)) 1696 { 1697 bfd_set_error (bfd_error_file_truncated); 1698 return false; 1699 } 1700 1701 if (size == 0) 1702 return true; 1703 1704 filesize = bfd_get_file_size (abfd); 1705 if (filesize != 0 1706 && ((ufile_ptr) obj_sym_filepos (abfd) > filesize 1707 || size > filesize - obj_sym_filepos (abfd))) 1708 { 1709 bfd_set_error (bfd_error_file_truncated); 1710 return false; 1711 } 1712 1713 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0) 1714 return false; 1715 syms = _bfd_malloc_and_read (abfd, size, size); 1716 obj_coff_external_syms (abfd) = syms; 1717 return syms != NULL; 1718 } 1719 1720 /* Read in the external strings. The strings are not loaded until 1721 they are needed. This is because we have no simple way of 1722 detecting a missing string table in an archive. If the strings 1723 are loaded then the STRINGS and STRINGS_LEN fields in the 1724 coff_tdata structure will be set. */ 1725 1726 const char * 1727 _bfd_coff_read_string_table (bfd *abfd) 1728 { 1729 char extstrsize[STRING_SIZE_SIZE]; 1730 bfd_size_type strsize; 1731 char *strings; 1732 ufile_ptr pos; 1733 ufile_ptr filesize; 1734 size_t symesz; 1735 size_t size; 1736 1737 if (obj_coff_strings (abfd) != NULL) 1738 return obj_coff_strings (abfd); 1739 1740 if (obj_sym_filepos (abfd) == 0) 1741 { 1742 bfd_set_error (bfd_error_no_symbols); 1743 return NULL; 1744 } 1745 1746 symesz = bfd_coff_symesz (abfd); 1747 pos = obj_sym_filepos (abfd); 1748 if (_bfd_mul_overflow (obj_raw_syment_count (abfd), symesz, &size) 1749 || pos + size < pos) 1750 { 1751 bfd_set_error (bfd_error_file_truncated); 1752 return NULL; 1753 } 1754 1755 if (bfd_seek (abfd, pos + size, SEEK_SET) != 0) 1756 return NULL; 1757 1758 if (bfd_read (extstrsize, sizeof extstrsize, abfd) != sizeof extstrsize) 1759 { 1760 if (bfd_get_error () != bfd_error_file_truncated) 1761 return NULL; 1762 1763 /* There is no string table. */ 1764 strsize = STRING_SIZE_SIZE; 1765 } 1766 else 1767 { 1768 #if STRING_SIZE_SIZE == 4 1769 strsize = H_GET_32 (abfd, extstrsize); 1770 #else 1771 #error Change H_GET_32 1772 #endif 1773 } 1774 1775 filesize = bfd_get_file_size (abfd); 1776 if (strsize < STRING_SIZE_SIZE 1777 || (filesize != 0 && strsize > filesize)) 1778 { 1779 _bfd_error_handler 1780 /* xgettext: c-format */ 1781 (_("%pB: bad string table size %" PRIu64), abfd, (uint64_t) strsize); 1782 bfd_set_error (bfd_error_bad_value); 1783 return NULL; 1784 } 1785 1786 strings = (char *) bfd_malloc (strsize + 1); 1787 if (strings == NULL) 1788 return NULL; 1789 1790 /* PR 17521 file: 079-54929-0.004. 1791 A corrupt file could contain an index that points into the first 1792 STRING_SIZE_SIZE bytes of the string table, so make sure that 1793 they are zero. */ 1794 memset (strings, 0, STRING_SIZE_SIZE); 1795 1796 if (bfd_read (strings + STRING_SIZE_SIZE, strsize - STRING_SIZE_SIZE, abfd) 1797 != strsize - STRING_SIZE_SIZE) 1798 { 1799 free (strings); 1800 return NULL; 1801 } 1802 1803 obj_coff_strings (abfd) = strings; 1804 obj_coff_strings_len (abfd) = strsize; 1805 /* Terminate the string table, just in case. */ 1806 strings[strsize] = 0; 1807 return strings; 1808 } 1809 1810 /* Free up the external symbols and strings read from a COFF file. */ 1811 1812 bool 1813 _bfd_coff_free_symbols (bfd *abfd) 1814 { 1815 if (! bfd_family_coff (abfd)) 1816 return false; 1817 1818 if (obj_coff_external_syms (abfd) != NULL 1819 && ! obj_coff_keep_syms (abfd)) 1820 { 1821 free (obj_coff_external_syms (abfd)); 1822 obj_coff_external_syms (abfd) = NULL; 1823 } 1824 1825 if (obj_coff_strings (abfd) != NULL 1826 && ! obj_coff_keep_strings (abfd)) 1827 { 1828 free (obj_coff_strings (abfd)); 1829 obj_coff_strings (abfd) = NULL; 1830 obj_coff_strings_len (abfd) = 0; 1831 } 1832 1833 return true; 1834 } 1835 1836 /* Read a symbol table into freshly bfd_allocated memory, swap it, and 1837 knit the symbol names into a normalized form. By normalized here I 1838 mean that all symbols have an n_offset pointer that points to a null- 1839 terminated string. */ 1840 1841 combined_entry_type * 1842 coff_get_normalized_symtab (bfd *abfd) 1843 { 1844 combined_entry_type *internal; 1845 combined_entry_type *internal_ptr; 1846 size_t symesz; 1847 char *raw_src; 1848 char *raw_end; 1849 const char *string_table = NULL; 1850 asection * debug_sec = NULL; 1851 char *debug_sec_data = NULL; 1852 bfd_size_type size; 1853 1854 if (obj_raw_syments (abfd) != NULL) 1855 return obj_raw_syments (abfd); 1856 1857 if (! _bfd_coff_get_external_symbols (abfd)) 1858 return NULL; 1859 1860 size = obj_raw_syment_count (abfd); 1861 /* Check for integer overflow. */ 1862 if (size > (bfd_size_type) -1 / sizeof (combined_entry_type)) 1863 return NULL; 1864 size *= sizeof (combined_entry_type); 1865 internal = (combined_entry_type *) bfd_zalloc (abfd, size); 1866 if (internal == NULL && size != 0) 1867 return NULL; 1868 1869 raw_src = (char *) obj_coff_external_syms (abfd); 1870 1871 /* Mark the end of the symbols. */ 1872 symesz = bfd_coff_symesz (abfd); 1873 raw_end = PTR_ADD (raw_src, obj_raw_syment_count (abfd) * symesz); 1874 1875 /* FIXME SOMEDAY. A string table size of zero is very weird, but 1876 probably possible. If one shows up, it will probably kill us. */ 1877 1878 /* Swap all the raw entries. */ 1879 for (internal_ptr = internal; 1880 raw_src < raw_end; 1881 raw_src += symesz, internal_ptr++) 1882 { 1883 unsigned int i; 1884 1885 bfd_coff_swap_sym_in (abfd, (void *) raw_src, 1886 (void *) & internal_ptr->u.syment); 1887 internal_ptr->is_sym = true; 1888 combined_entry_type *sym = internal_ptr; 1889 1890 /* PR 17512: Prevent buffer overrun. */ 1891 if (sym->u.syment.n_numaux > ((raw_end - 1) - raw_src) / symesz) 1892 return NULL; 1893 1894 for (i = 0; i < sym->u.syment.n_numaux; i++) 1895 { 1896 internal_ptr++; 1897 raw_src += symesz; 1898 1899 bfd_coff_swap_aux_in (abfd, (void *) raw_src, 1900 sym->u.syment.n_type, 1901 sym->u.syment.n_sclass, 1902 (int) i, sym->u.syment.n_numaux, 1903 &(internal_ptr->u.auxent)); 1904 1905 internal_ptr->is_sym = false; 1906 coff_pointerize_aux (abfd, internal, sym, i, internal_ptr); 1907 } 1908 1909 if (sym->u.syment.n_sclass == C_FILE 1910 && sym->u.syment.n_numaux > 0) 1911 { 1912 combined_entry_type * aux = sym + 1; 1913 1914 /* Make a file symbol point to the name in the auxent, since 1915 the text ".file" is redundant. */ 1916 BFD_ASSERT (! aux->is_sym); 1917 1918 if (aux->u.auxent.x_file.x_n.x_n.x_zeroes == 0) 1919 { 1920 /* The filename is a long one, point into the string table. */ 1921 if (string_table == NULL) 1922 { 1923 string_table = _bfd_coff_read_string_table (abfd); 1924 if (string_table == NULL) 1925 return NULL; 1926 } 1927 1928 if ((bfd_size_type) aux->u.auxent.x_file.x_n.x_n.x_offset 1929 >= obj_coff_strings_len (abfd)) 1930 sym->u.syment._n._n_n._n_offset = 1931 (uintptr_t) _("<corrupt>"); 1932 else 1933 sym->u.syment._n._n_n._n_offset = 1934 (uintptr_t) (string_table 1935 + aux->u.auxent.x_file.x_n.x_n.x_offset); 1936 } 1937 else 1938 { 1939 /* Ordinary short filename, put into memory anyway. The 1940 Microsoft PE tools sometimes store a filename in 1941 multiple AUX entries. */ 1942 size_t len; 1943 char *src; 1944 if (sym->u.syment.n_numaux > 1 && obj_pe (abfd)) 1945 { 1946 len = sym->u.syment.n_numaux * symesz; 1947 src = raw_src - (len - symesz); 1948 } 1949 else 1950 { 1951 len = bfd_coff_filnmlen (abfd); 1952 src = aux->u.auxent.x_file.x_n.x_fname; 1953 } 1954 sym->u.syment._n._n_n._n_offset = 1955 (uintptr_t) copy_name (abfd, src, len); 1956 } 1957 1958 /* Normalize other strings available in C_FILE aux entries. */ 1959 if (!obj_pe (abfd)) 1960 for (int numaux = 1; 1961 numaux < sym->u.syment.n_numaux; 1962 numaux++) 1963 { 1964 aux = sym + numaux + 1; 1965 BFD_ASSERT (! aux->is_sym); 1966 1967 if (aux->u.auxent.x_file.x_n.x_n.x_zeroes == 0) 1968 { 1969 /* The string information is a long one, point 1970 into the string table. */ 1971 if (string_table == NULL) 1972 { 1973 string_table = _bfd_coff_read_string_table (abfd); 1974 if (string_table == NULL) 1975 return NULL; 1976 } 1977 1978 if ((bfd_size_type) aux->u.auxent.x_file.x_n.x_n.x_offset 1979 >= obj_coff_strings_len (abfd)) 1980 aux->u.auxent.x_file.x_n.x_n.x_offset = 1981 (uintptr_t) _("<corrupt>"); 1982 else 1983 aux->u.auxent.x_file.x_n.x_n.x_offset = 1984 (uintptr_t) (string_table 1985 + aux->u.auxent.x_file.x_n.x_n.x_offset); 1986 } 1987 else 1988 aux->u.auxent.x_file.x_n.x_n.x_offset = 1989 ((uintptr_t) 1990 copy_name (abfd, 1991 aux->u.auxent.x_file.x_n.x_fname, 1992 bfd_coff_filnmlen (abfd))); 1993 } 1994 1995 } 1996 else 1997 { 1998 if (sym->u.syment._n._n_n._n_zeroes != 0) 1999 { 2000 /* This is a "short" name. Make it long. */ 2001 char *newstring; 2002 2003 /* Find the length of this string without walking into memory 2004 that isn't ours. */ 2005 for (i = 0; i < SYMNMLEN; ++i) 2006 if (sym->u.syment._n._n_name[i] == '\0') 2007 break; 2008 2009 newstring = bfd_alloc (abfd, i + 1); 2010 if (newstring == NULL) 2011 return NULL; 2012 memcpy (newstring, sym->u.syment._n._n_name, i); 2013 newstring[i] = 0; 2014 sym->u.syment._n._n_n._n_offset = (uintptr_t) newstring; 2015 sym->u.syment._n._n_n._n_zeroes = 0; 2016 } 2017 else if (sym->u.syment._n._n_n._n_offset == 0) 2018 sym->u.syment._n._n_n._n_offset = (uintptr_t) ""; 2019 else if (!bfd_coff_symname_in_debug (abfd, &sym->u.syment)) 2020 { 2021 /* Long name already. Point symbol at the string in the 2022 table. */ 2023 if (string_table == NULL) 2024 { 2025 string_table = _bfd_coff_read_string_table (abfd); 2026 if (string_table == NULL) 2027 return NULL; 2028 } 2029 if (sym->u.syment._n._n_n._n_offset >= obj_coff_strings_len (abfd)) 2030 sym->u.syment._n._n_n._n_offset = 2031 (uintptr_t) _("<corrupt>"); 2032 else 2033 sym->u.syment._n._n_n._n_offset = 2034 (uintptr_t) (string_table 2035 + sym->u.syment._n._n_n._n_offset); 2036 } 2037 else 2038 { 2039 /* Long name in debug section. Very similar. */ 2040 if (debug_sec_data == NULL) 2041 { 2042 debug_sec_data = build_debug_section (abfd, &debug_sec); 2043 if (debug_sec_data == NULL) 2044 return NULL; 2045 } 2046 /* PR binutils/17512: Catch out of range offsets into 2047 the debug data. */ 2048 if (sym->u.syment._n._n_n._n_offset >= debug_sec->size) 2049 sym->u.syment._n._n_n._n_offset = 2050 (uintptr_t) _("<corrupt>"); 2051 else 2052 sym->u.syment._n._n_n._n_offset = 2053 (uintptr_t) (debug_sec_data 2054 + sym->u.syment._n._n_n._n_offset); 2055 } 2056 } 2057 } 2058 2059 /* Free the raw symbols. */ 2060 if (obj_coff_external_syms (abfd) != NULL 2061 && ! obj_coff_keep_syms (abfd)) 2062 { 2063 free (obj_coff_external_syms (abfd)); 2064 obj_coff_external_syms (abfd) = NULL; 2065 } 2066 2067 obj_raw_syments (abfd) = internal; 2068 BFD_ASSERT (obj_raw_syment_count (abfd) 2069 == (size_t) (internal_ptr - internal)); 2070 2071 return internal; 2072 } 2073 2074 long 2075 coff_get_reloc_upper_bound (bfd *abfd, sec_ptr asect) 2076 { 2077 size_t count, raw; 2078 2079 count = asect->reloc_count; 2080 if (count >= LONG_MAX / sizeof (arelent *) 2081 || _bfd_mul_overflow (count, bfd_coff_relsz (abfd), &raw)) 2082 { 2083 bfd_set_error (bfd_error_file_too_big); 2084 return -1; 2085 } 2086 if (!bfd_write_p (abfd)) 2087 { 2088 ufile_ptr filesize = bfd_get_file_size (abfd); 2089 if (filesize != 0 && raw > filesize) 2090 { 2091 bfd_set_error (bfd_error_file_truncated); 2092 return -1; 2093 } 2094 } 2095 return (count + 1) * sizeof (arelent *); 2096 } 2097 2098 asymbol * 2099 coff_make_empty_symbol (bfd *abfd) 2100 { 2101 size_t amt = sizeof (coff_symbol_type); 2102 coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_zalloc (abfd, amt); 2103 2104 if (new_symbol == NULL) 2105 return NULL; 2106 new_symbol->symbol.section = 0; 2107 new_symbol->native = NULL; 2108 new_symbol->lineno = NULL; 2109 new_symbol->done_lineno = false; 2110 new_symbol->symbol.the_bfd = abfd; 2111 2112 return & new_symbol->symbol; 2113 } 2114 2115 /* Make a debugging symbol. */ 2116 2117 asymbol * 2118 coff_bfd_make_debug_symbol (bfd *abfd) 2119 { 2120 size_t amt = sizeof (coff_symbol_type); 2121 coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_alloc (abfd, amt); 2122 2123 if (new_symbol == NULL) 2124 return NULL; 2125 /* @@ The 10 is a guess at a plausible maximum number of aux entries 2126 (but shouldn't be a constant). */ 2127 amt = sizeof (combined_entry_type) * 10; 2128 new_symbol->native = (combined_entry_type *) bfd_zalloc (abfd, amt); 2129 if (!new_symbol->native) 2130 return NULL; 2131 new_symbol->native->is_sym = true; 2132 new_symbol->symbol.section = bfd_abs_section_ptr; 2133 new_symbol->symbol.flags = BSF_DEBUGGING; 2134 new_symbol->lineno = NULL; 2135 new_symbol->done_lineno = false; 2136 new_symbol->symbol.the_bfd = abfd; 2137 2138 return & new_symbol->symbol; 2139 } 2140 2141 void 2142 coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret) 2143 { 2144 bfd_symbol_info (symbol, ret); 2145 2146 if (coffsymbol (symbol)->native != NULL 2147 && coffsymbol (symbol)->native->fix_value 2148 && coffsymbol (symbol)->native->is_sym) 2149 ret->value 2150 = (((uintptr_t) coffsymbol (symbol)->native->u.syment.n_value 2151 - (uintptr_t) obj_raw_syments (abfd)) 2152 / sizeof (combined_entry_type)); 2153 } 2154 2155 /* Print out information about COFF symbol. */ 2156 2157 void 2158 coff_print_symbol (bfd *abfd, 2159 void * filep, 2160 asymbol *symbol, 2161 bfd_print_symbol_type how) 2162 { 2163 FILE * file = (FILE *) filep; 2164 2165 switch (how) 2166 { 2167 case bfd_print_symbol_name: 2168 fprintf (file, "%s", symbol->name); 2169 break; 2170 2171 case bfd_print_symbol_more: 2172 fprintf (file, "coff %s %s", 2173 coffsymbol (symbol)->native ? "n" : "g", 2174 coffsymbol (symbol)->lineno ? "l" : " "); 2175 break; 2176 2177 case bfd_print_symbol_all: 2178 if (coffsymbol (symbol)->native) 2179 { 2180 bfd_vma val; 2181 unsigned int aux; 2182 combined_entry_type *combined = coffsymbol (symbol)->native; 2183 combined_entry_type *root = obj_raw_syments (abfd); 2184 struct lineno_cache_entry *l = coffsymbol (symbol)->lineno; 2185 2186 fprintf (file, "[%3ld]", (long) (combined - root)); 2187 2188 /* PR 17512: file: 079-33786-0.001:0.1. */ 2189 if (combined < obj_raw_syments (abfd) 2190 || combined >= obj_raw_syments (abfd) + obj_raw_syment_count (abfd)) 2191 { 2192 fprintf (file, _("<corrupt info> %s"), symbol->name); 2193 break; 2194 } 2195 2196 BFD_ASSERT (combined->is_sym); 2197 if (! combined->fix_value) 2198 val = (bfd_vma) combined->u.syment.n_value; 2199 else 2200 val = (((uintptr_t) combined->u.syment.n_value - (uintptr_t) root) 2201 / sizeof (combined_entry_type)); 2202 2203 fprintf (file, "(sec %2d)(fl 0x%02x)(ty %4x)(scl %3d) (nx %d) 0x", 2204 combined->u.syment.n_scnum, 2205 combined->u.syment.n_flags, 2206 combined->u.syment.n_type, 2207 combined->u.syment.n_sclass, 2208 combined->u.syment.n_numaux); 2209 bfd_fprintf_vma (abfd, file, val); 2210 fprintf (file, " %s", symbol->name); 2211 2212 for (aux = 0; aux < combined->u.syment.n_numaux; aux++) 2213 { 2214 combined_entry_type *auxp = combined + aux + 1; 2215 long tagndx; 2216 2217 BFD_ASSERT (! auxp->is_sym); 2218 if (auxp->fix_tag) 2219 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root; 2220 else 2221 tagndx = auxp->u.auxent.x_sym.x_tagndx.u32; 2222 2223 fprintf (file, "\n"); 2224 2225 if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux)) 2226 continue; 2227 2228 switch (combined->u.syment.n_sclass) 2229 { 2230 case C_FILE: 2231 fprintf (file, "File "); 2232 /* Add additional information if this isn't the filename 2233 auxiliary entry. */ 2234 if (auxp->u.auxent.x_file.x_ftype) 2235 fprintf (file, "ftype %d fname \"%s\"", 2236 auxp->u.auxent.x_file.x_ftype, 2237 (char *) auxp->u.auxent.x_file.x_n.x_n.x_offset); 2238 break; 2239 2240 case C_DWARF: 2241 fprintf (file, "AUX scnlen %#" PRIx64 " nreloc %" PRId64, 2242 auxp->u.auxent.x_sect.x_scnlen, 2243 auxp->u.auxent.x_sect.x_nreloc); 2244 break; 2245 2246 case C_STAT: 2247 if (combined->u.syment.n_type == T_NULL) 2248 /* Probably a section symbol ? */ 2249 { 2250 fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d", 2251 (unsigned long) auxp->u.auxent.x_scn.x_scnlen, 2252 auxp->u.auxent.x_scn.x_nreloc, 2253 auxp->u.auxent.x_scn.x_nlinno); 2254 if (auxp->u.auxent.x_scn.x_checksum != 0 2255 || auxp->u.auxent.x_scn.x_associated != 0 2256 || auxp->u.auxent.x_scn.x_comdat != 0) 2257 fprintf (file, " checksum 0x%x assoc %d comdat %d", 2258 auxp->u.auxent.x_scn.x_checksum, 2259 auxp->u.auxent.x_scn.x_associated, 2260 auxp->u.auxent.x_scn.x_comdat); 2261 break; 2262 } 2263 /* Fall through. */ 2264 case C_EXT: 2265 case C_AIX_WEAKEXT: 2266 if (ISFCN (combined->u.syment.n_type)) 2267 { 2268 long next, llnos; 2269 2270 if (auxp->fix_end) 2271 next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p 2272 - root); 2273 else 2274 next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.u32; 2275 llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr; 2276 fprintf (file, 2277 "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld", 2278 tagndx, 2279 (unsigned long) auxp->u.auxent.x_sym.x_misc.x_fsize, 2280 llnos, next); 2281 break; 2282 } 2283 /* Fall through. */ 2284 default: 2285 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld", 2286 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno, 2287 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size, 2288 tagndx); 2289 if (auxp->fix_end) 2290 fprintf (file, " endndx %ld", 2291 ((long) 2292 (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p 2293 - root))); 2294 break; 2295 } 2296 } 2297 2298 if (l) 2299 { 2300 fprintf (file, "\n%s :", l->u.sym->name); 2301 l++; 2302 while (l->line_number) 2303 { 2304 if (l->line_number > 0) 2305 { 2306 fprintf (file, "\n%4d : ", l->line_number); 2307 bfd_fprintf_vma (abfd, file, l->u.offset + symbol->section->vma); 2308 } 2309 l++; 2310 } 2311 } 2312 } 2313 else 2314 { 2315 bfd_print_symbol_vandf (abfd, (void *) file, symbol); 2316 fprintf (file, " %-5s %s %s %s", 2317 symbol->section->name, 2318 coffsymbol (symbol)->native ? "n" : "g", 2319 coffsymbol (symbol)->lineno ? "l" : " ", 2320 symbol->name); 2321 } 2322 } 2323 } 2324 2325 /* Return whether a symbol name implies a local symbol. In COFF, 2326 local symbols generally start with ``.L''. Most targets use this 2327 function for the is_local_label_name entry point, but some may 2328 override it. */ 2329 2330 bool 2331 _bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, 2332 const char *name) 2333 { 2334 return name[0] == '.' && name[1] == 'L'; 2335 } 2336 2337 /* Provided a BFD, a section and an offset (in bytes, not octets) into the 2338 section, calculate and return the name of the source file and the line 2339 nearest to the wanted location. */ 2340 2341 bool 2342 coff_find_nearest_line_with_names (bfd *abfd, 2343 asymbol **symbols, 2344 asection *section, 2345 bfd_vma offset, 2346 const char **filename_ptr, 2347 const char **functionname_ptr, 2348 unsigned int *line_ptr, 2349 const struct dwarf_debug_section *debug_sections) 2350 { 2351 bool found; 2352 unsigned int i; 2353 unsigned int line_base; 2354 coff_data_type *cof = coff_data (abfd); 2355 /* Run through the raw syments if available. */ 2356 combined_entry_type *p; 2357 combined_entry_type *pend; 2358 alent *l; 2359 struct coff_section_tdata *sec_data; 2360 size_t amt; 2361 2362 /* Before looking through the symbol table, try to use a .stab 2363 section to find the information. */ 2364 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, 2365 &found, filename_ptr, 2366 functionname_ptr, line_ptr, 2367 &coff_data(abfd)->line_info)) 2368 return false; 2369 2370 if (found) 2371 return true; 2372 2373 /* Also try examining DWARF2 debugging information. */ 2374 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset, 2375 filename_ptr, functionname_ptr, 2376 line_ptr, NULL, debug_sections, 2377 &coff_data(abfd)->dwarf2_find_line_info)) 2378 return true; 2379 2380 sec_data = coff_section_data (abfd, section); 2381 2382 /* If the DWARF lookup failed, but there is DWARF information available 2383 then the problem might be that the file has been rebased. This tool 2384 changes the VMAs of all the sections, but it does not update the DWARF 2385 information. So try again, using a bias against the address sought. */ 2386 if (coff_data (abfd)->dwarf2_find_line_info != NULL) 2387 { 2388 bfd_signed_vma bias = 0; 2389 2390 /* Create a cache of the result for the next call. */ 2391 if (sec_data == NULL && section->owner == abfd) 2392 { 2393 amt = sizeof (struct coff_section_tdata); 2394 section->used_by_bfd = bfd_zalloc (abfd, amt); 2395 sec_data = (struct coff_section_tdata *) section->used_by_bfd; 2396 } 2397 2398 if (sec_data != NULL && sec_data->saved_bias) 2399 bias = sec_data->bias; 2400 else if (symbols) 2401 { 2402 bias = _bfd_dwarf2_find_symbol_bias (symbols, 2403 & coff_data (abfd)->dwarf2_find_line_info); 2404 2405 if (sec_data) 2406 { 2407 sec_data->saved_bias = true; 2408 sec_data->bias = bias; 2409 } 2410 } 2411 2412 if (bias 2413 && _bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, 2414 offset + bias, 2415 filename_ptr, functionname_ptr, 2416 line_ptr, NULL, debug_sections, 2417 &coff_data(abfd)->dwarf2_find_line_info)) 2418 return true; 2419 } 2420 2421 *filename_ptr = 0; 2422 *functionname_ptr = 0; 2423 *line_ptr = 0; 2424 2425 /* Don't try and find line numbers in a non coff file. */ 2426 if (!bfd_family_coff (abfd)) 2427 return false; 2428 2429 if (cof == NULL) 2430 return false; 2431 2432 /* Find the first C_FILE symbol. */ 2433 p = cof->raw_syments; 2434 if (!p) 2435 return false; 2436 2437 pend = p + cof->raw_syment_count; 2438 while (p < pend) 2439 { 2440 BFD_ASSERT (p->is_sym); 2441 if (p->u.syment.n_sclass == C_FILE) 2442 break; 2443 p += 1 + p->u.syment.n_numaux; 2444 } 2445 2446 if (p < pend) 2447 { 2448 bfd_vma sec_vma; 2449 bfd_vma maxdiff; 2450 2451 /* Look through the C_FILE symbols to find the best one. */ 2452 sec_vma = bfd_section_vma (section); 2453 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset; 2454 maxdiff = (bfd_vma) 0 - (bfd_vma) 1; 2455 while (1) 2456 { 2457 bfd_vma file_addr; 2458 combined_entry_type *p2; 2459 2460 for (p2 = p + 1 + p->u.syment.n_numaux; 2461 p2 < pend; 2462 p2 += 1 + p2->u.syment.n_numaux) 2463 { 2464 BFD_ASSERT (p2->is_sym); 2465 if (p2->u.syment.n_scnum > 0 2466 && (section 2467 == coff_section_from_bfd_index (abfd, 2468 p2->u.syment.n_scnum))) 2469 break; 2470 if (p2->u.syment.n_sclass == C_FILE) 2471 { 2472 p2 = pend; 2473 break; 2474 } 2475 } 2476 if (p2 >= pend) 2477 break; 2478 2479 file_addr = (bfd_vma) p2->u.syment.n_value; 2480 /* PR 11512: Include the section address of the function name symbol. */ 2481 if (p2->u.syment.n_scnum > 0) 2482 file_addr += coff_section_from_bfd_index (abfd, 2483 p2->u.syment.n_scnum)->vma; 2484 /* We use <= MAXDIFF here so that if we get a zero length 2485 file, we actually use the next file entry. */ 2486 if (p2 < pend 2487 && offset + sec_vma >= file_addr 2488 && offset + sec_vma - file_addr <= maxdiff) 2489 { 2490 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset; 2491 maxdiff = offset + sec_vma - p2->u.syment.n_value; 2492 } 2493 2494 if (p->u.syment.n_value >= cof->raw_syment_count) 2495 break; 2496 2497 /* Avoid endless loops on erroneous files by ensuring that 2498 we always move forward in the file. */ 2499 if (p >= cof->raw_syments + p->u.syment.n_value) 2500 break; 2501 2502 p = cof->raw_syments + p->u.syment.n_value; 2503 if (!p->is_sym || p->u.syment.n_sclass != C_FILE) 2504 break; 2505 } 2506 } 2507 2508 if (section->lineno_count == 0) 2509 { 2510 *functionname_ptr = NULL; 2511 *line_ptr = 0; 2512 return true; 2513 } 2514 2515 /* Now wander though the raw linenumbers of the section. 2516 If we have been called on this section before, and the offset 2517 we want is further down then we can prime the lookup loop. */ 2518 if (sec_data != NULL 2519 && sec_data->i > 0 2520 && offset >= sec_data->offset) 2521 { 2522 i = sec_data->i; 2523 *functionname_ptr = sec_data->function; 2524 line_base = sec_data->line_base; 2525 } 2526 else 2527 { 2528 i = 0; 2529 line_base = 0; 2530 } 2531 2532 if (section->lineno != NULL) 2533 { 2534 bfd_vma last_value = 0; 2535 2536 l = §ion->lineno[i]; 2537 2538 for (; i < section->lineno_count; i++) 2539 { 2540 if (l->line_number == 0) 2541 { 2542 /* Get the symbol this line number points at. */ 2543 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym); 2544 if (coff->symbol.value > offset) 2545 break; 2546 2547 *functionname_ptr = coff->symbol.name; 2548 last_value = coff->symbol.value; 2549 if (coff->native) 2550 { 2551 combined_entry_type *s = coff->native; 2552 2553 BFD_ASSERT (s->is_sym); 2554 s = s + 1 + s->u.syment.n_numaux; 2555 2556 /* In XCOFF a debugging symbol can follow the 2557 function symbol. */ 2558 if (((size_t) ((char *) s - (char *) obj_raw_syments (abfd)) 2559 < obj_raw_syment_count (abfd) * sizeof (*s)) 2560 && s->u.syment.n_scnum == N_DEBUG) 2561 s = s + 1 + s->u.syment.n_numaux; 2562 2563 /* S should now point to the .bf of the function. */ 2564 if (((size_t) ((char *) s - (char *) obj_raw_syments (abfd)) 2565 < obj_raw_syment_count (abfd) * sizeof (*s)) 2566 && s->u.syment.n_numaux) 2567 { 2568 /* The linenumber is stored in the auxent. */ 2569 union internal_auxent *a = &((s + 1)->u.auxent); 2570 2571 line_base = a->x_sym.x_misc.x_lnsz.x_lnno; 2572 *line_ptr = line_base; 2573 } 2574 } 2575 } 2576 else 2577 { 2578 if (l->u.offset > offset) 2579 break; 2580 *line_ptr = l->line_number + line_base - 1; 2581 } 2582 l++; 2583 } 2584 2585 /* If we fell off the end of the loop, then assume that this 2586 symbol has no line number info. Otherwise, symbols with no 2587 line number info get reported with the line number of the 2588 last line of the last symbol which does have line number 2589 info. We use 0x100 as a slop to account for cases where the 2590 last line has executable code. */ 2591 if (i >= section->lineno_count 2592 && last_value != 0 2593 && offset - last_value > 0x100) 2594 { 2595 *functionname_ptr = NULL; 2596 *line_ptr = 0; 2597 } 2598 } 2599 2600 /* Cache the results for the next call. */ 2601 if (sec_data == NULL && section->owner == abfd) 2602 { 2603 amt = sizeof (struct coff_section_tdata); 2604 section->used_by_bfd = bfd_zalloc (abfd, amt); 2605 sec_data = (struct coff_section_tdata *) section->used_by_bfd; 2606 } 2607 2608 if (sec_data != NULL) 2609 { 2610 sec_data->offset = offset; 2611 sec_data->i = i - 1; 2612 sec_data->function = *functionname_ptr; 2613 sec_data->line_base = line_base; 2614 } 2615 2616 return true; 2617 } 2618 2619 bool 2620 coff_find_nearest_line (bfd *abfd, 2621 asymbol **symbols, 2622 asection *section, 2623 bfd_vma offset, 2624 const char **filename_ptr, 2625 const char **functionname_ptr, 2626 unsigned int *line_ptr, 2627 unsigned int *discriminator_ptr) 2628 { 2629 if (discriminator_ptr) 2630 *discriminator_ptr = 0; 2631 return coff_find_nearest_line_with_names (abfd, symbols, section, offset, 2632 filename_ptr, functionname_ptr, 2633 line_ptr, dwarf_debug_sections); 2634 } 2635 2636 bool 2637 coff_find_inliner_info (bfd *abfd, 2638 const char **filename_ptr, 2639 const char **functionname_ptr, 2640 unsigned int *line_ptr) 2641 { 2642 bool found; 2643 2644 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr, 2645 functionname_ptr, line_ptr, 2646 &coff_data(abfd)->dwarf2_find_line_info); 2647 return (found); 2648 } 2649 2650 int 2651 coff_sizeof_headers (bfd *abfd, struct bfd_link_info *info) 2652 { 2653 size_t size; 2654 2655 if (!bfd_link_relocatable (info)) 2656 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd); 2657 else 2658 size = bfd_coff_filhsz (abfd); 2659 2660 size += abfd->section_count * bfd_coff_scnhsz (abfd); 2661 return size; 2662 } 2663 2664 /* Change the class of a coff symbol held by BFD. */ 2665 2666 bool 2667 bfd_coff_set_symbol_class (bfd * abfd, 2668 asymbol * symbol, 2669 unsigned int symbol_class) 2670 { 2671 coff_symbol_type * csym; 2672 2673 csym = coff_symbol_from (symbol); 2674 if (csym == NULL) 2675 { 2676 bfd_set_error (bfd_error_invalid_operation); 2677 return false; 2678 } 2679 else if (csym->native == NULL) 2680 { 2681 /* This is an alien symbol which no native coff backend data. 2682 We cheat here by creating a fake native entry for it and 2683 then filling in the class. This code is based on that in 2684 coff_write_alien_symbol(). */ 2685 2686 combined_entry_type * native; 2687 size_t amt = sizeof (* native); 2688 2689 native = (combined_entry_type *) bfd_zalloc (abfd, amt); 2690 if (native == NULL) 2691 return false; 2692 2693 native->is_sym = true; 2694 native->u.syment.n_type = T_NULL; 2695 native->u.syment.n_sclass = symbol_class; 2696 2697 if (bfd_is_und_section (symbol->section)) 2698 { 2699 native->u.syment.n_scnum = N_UNDEF; 2700 native->u.syment.n_value = symbol->value; 2701 } 2702 else if (bfd_is_com_section (symbol->section)) 2703 { 2704 native->u.syment.n_scnum = N_UNDEF; 2705 native->u.syment.n_value = symbol->value; 2706 } 2707 else 2708 { 2709 native->u.syment.n_scnum = 2710 symbol->section->output_section->target_index; 2711 native->u.syment.n_value = (symbol->value 2712 + symbol->section->output_offset); 2713 if (! obj_pe (abfd)) 2714 native->u.syment.n_value += symbol->section->output_section->vma; 2715 2716 /* Copy the any flags from the file header into the symbol. 2717 FIXME: Why? */ 2718 native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags; 2719 } 2720 2721 csym->native = native; 2722 } 2723 else 2724 csym->native->u.syment.n_sclass = symbol_class; 2725 2726 return true; 2727 } 2728 2729 bool 2730 _bfd_coff_section_already_linked (bfd *abfd, 2731 asection *sec, 2732 struct bfd_link_info *info) 2733 { 2734 flagword flags; 2735 const char *name, *key; 2736 struct bfd_section_already_linked *l; 2737 struct bfd_section_already_linked_hash_entry *already_linked_list; 2738 struct coff_comdat_info *s_comdat; 2739 2740 if (sec->output_section == bfd_abs_section_ptr) 2741 return false; 2742 2743 flags = sec->flags; 2744 if ((flags & SEC_LINK_ONCE) == 0) 2745 return false; 2746 2747 /* The COFF backend linker doesn't support group sections. */ 2748 if ((flags & SEC_GROUP) != 0) 2749 return false; 2750 2751 name = bfd_section_name (sec); 2752 s_comdat = bfd_coff_get_comdat_section (abfd, sec); 2753 2754 if (s_comdat != NULL) 2755 key = s_comdat->name; 2756 else 2757 { 2758 if (startswith (name, ".gnu.linkonce.") 2759 && (key = strchr (name + sizeof (".gnu.linkonce.") - 1, '.')) != NULL) 2760 key++; 2761 else 2762 /* FIXME: gcc as of 2011-09 emits sections like .text$<key>, 2763 .xdata$<key> and .pdata$<key> only the first of which has a 2764 comdat key. Should these all match the LTO IR key? */ 2765 key = name; 2766 } 2767 2768 already_linked_list = bfd_section_already_linked_table_lookup (key); 2769 2770 for (l = already_linked_list->entry; l != NULL; l = l->next) 2771 { 2772 struct coff_comdat_info *l_comdat; 2773 2774 l_comdat = bfd_coff_get_comdat_section (l->sec->owner, l->sec); 2775 2776 /* The section names must match, and both sections must be 2777 comdat and have the same comdat name, or both sections must 2778 be non-comdat. LTO IR plugin sections are an exception. They 2779 are always named .gnu.linkonce.t.<key> (<key> is some string) 2780 and match any comdat section with comdat name of <key>, and 2781 any linkonce section with the same suffix, ie. 2782 .gnu.linkonce.*.<key>. */ 2783 if (((s_comdat != NULL) == (l_comdat != NULL) 2784 && strcmp (name, l->sec->name) == 0) 2785 || (l->sec->owner->flags & BFD_PLUGIN) != 0 2786 || (sec->owner->flags & BFD_PLUGIN) != 0) 2787 { 2788 /* The section has already been linked. See if we should 2789 issue a warning. */ 2790 return _bfd_handle_already_linked (sec, l, info); 2791 } 2792 } 2793 2794 /* This is the first section with this name. Record it. */ 2795 if (!bfd_section_already_linked_table_insert (already_linked_list, sec)) 2796 info->callbacks->einfo (_("%F%P: already_linked_table: %E\n")); 2797 return false; 2798 } 2799 2800 /* Initialize COOKIE for input bfd ABFD. */ 2801 2802 static bool 2803 init_reloc_cookie (struct coff_reloc_cookie *cookie, 2804 struct bfd_link_info *info ATTRIBUTE_UNUSED, 2805 bfd *abfd) 2806 { 2807 /* Sometimes the symbol table does not yet have been loaded here. */ 2808 bfd_coff_slurp_symbol_table (abfd); 2809 2810 cookie->abfd = abfd; 2811 cookie->sym_hashes = obj_coff_sym_hashes (abfd); 2812 2813 cookie->symbols = obj_symbols (abfd); 2814 2815 return true; 2816 } 2817 2818 /* Free the memory allocated by init_reloc_cookie, if appropriate. */ 2819 2820 static void 2821 fini_reloc_cookie (struct coff_reloc_cookie *cookie ATTRIBUTE_UNUSED, 2822 bfd *abfd ATTRIBUTE_UNUSED) 2823 { 2824 /* Nothing to do. */ 2825 } 2826 2827 /* Initialize the relocation information in COOKIE for input section SEC 2828 of input bfd ABFD. */ 2829 2830 static bool 2831 init_reloc_cookie_rels (struct coff_reloc_cookie *cookie, 2832 struct bfd_link_info *info ATTRIBUTE_UNUSED, 2833 bfd *abfd, 2834 asection *sec) 2835 { 2836 if (sec->reloc_count == 0) 2837 { 2838 cookie->rels = NULL; 2839 cookie->relend = NULL; 2840 cookie->rel = NULL; 2841 return true; 2842 } 2843 2844 cookie->rels = _bfd_coff_read_internal_relocs (abfd, sec, false, NULL, 2845 0, NULL); 2846 2847 if (cookie->rels == NULL) 2848 return false; 2849 2850 cookie->rel = cookie->rels; 2851 cookie->relend = (cookie->rels + sec->reloc_count); 2852 return true; 2853 } 2854 2855 /* Free the memory allocated by init_reloc_cookie_rels, 2856 if appropriate. */ 2857 2858 static void 2859 fini_reloc_cookie_rels (struct coff_reloc_cookie *cookie, 2860 asection *sec) 2861 { 2862 if (cookie->rels 2863 /* PR 20401. The relocs may not have been cached, so check first. 2864 If the relocs were loaded by init_reloc_cookie_rels() then this 2865 will be the case. FIXME: Would performance be improved if the 2866 relocs *were* cached ? */ 2867 && coff_section_data (NULL, sec) 2868 && coff_section_data (NULL, sec)->relocs != cookie->rels) 2869 free (cookie->rels); 2870 } 2871 2872 /* Initialize the whole of COOKIE for input section SEC. */ 2873 2874 static bool 2875 init_reloc_cookie_for_section (struct coff_reloc_cookie *cookie, 2876 struct bfd_link_info *info, 2877 asection *sec) 2878 { 2879 if (!init_reloc_cookie (cookie, info, sec->owner)) 2880 return false; 2881 2882 if (!init_reloc_cookie_rels (cookie, info, sec->owner, sec)) 2883 { 2884 fini_reloc_cookie (cookie, sec->owner); 2885 return false; 2886 } 2887 return true; 2888 } 2889 2890 /* Free the memory allocated by init_reloc_cookie_for_section, 2891 if appropriate. */ 2892 2893 static void 2894 fini_reloc_cookie_for_section (struct coff_reloc_cookie *cookie, 2895 asection *sec) 2896 { 2897 fini_reloc_cookie_rels (cookie, sec); 2898 fini_reloc_cookie (cookie, sec->owner); 2899 } 2900 2901 static asection * 2902 _bfd_coff_gc_mark_hook (asection *sec, 2903 struct bfd_link_info *info ATTRIBUTE_UNUSED, 2904 struct internal_reloc *rel ATTRIBUTE_UNUSED, 2905 struct coff_link_hash_entry *h, 2906 struct internal_syment *sym) 2907 { 2908 if (h != NULL) 2909 { 2910 switch (h->root.type) 2911 { 2912 case bfd_link_hash_defined: 2913 case bfd_link_hash_defweak: 2914 return h->root.u.def.section; 2915 2916 case bfd_link_hash_common: 2917 return h->root.u.c.p->section; 2918 2919 case bfd_link_hash_undefweak: 2920 if (h->symbol_class == C_NT_WEAK && h->numaux == 1) 2921 { 2922 /* PE weak externals. A weak symbol may include an auxiliary 2923 record indicating that if the weak symbol is not resolved, 2924 another external symbol is used instead. */ 2925 struct coff_link_hash_entry *h2 = 2926 h->auxbfd->tdata.coff_obj_data->sym_hashes 2927 [h->aux->x_sym.x_tagndx.u32]; 2928 2929 if (h2 && h2->root.type != bfd_link_hash_undefined) 2930 return h2->root.u.def.section; 2931 } 2932 break; 2933 2934 case bfd_link_hash_undefined: 2935 default: 2936 break; 2937 } 2938 return NULL; 2939 } 2940 2941 return coff_section_from_bfd_index (sec->owner, sym->n_scnum); 2942 } 2943 2944 /* COOKIE->rel describes a relocation against section SEC, which is 2945 a section we've decided to keep. Return the section that contains 2946 the relocation symbol, or NULL if no section contains it. */ 2947 2948 static asection * 2949 _bfd_coff_gc_mark_rsec (struct bfd_link_info *info, asection *sec, 2950 coff_gc_mark_hook_fn gc_mark_hook, 2951 struct coff_reloc_cookie *cookie) 2952 { 2953 struct coff_link_hash_entry *h; 2954 2955 h = cookie->sym_hashes[cookie->rel->r_symndx]; 2956 if (h != NULL) 2957 { 2958 while (h->root.type == bfd_link_hash_indirect 2959 || h->root.type == bfd_link_hash_warning) 2960 h = (struct coff_link_hash_entry *) h->root.u.i.link; 2961 2962 return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL); 2963 } 2964 2965 return (*gc_mark_hook) (sec, info, cookie->rel, NULL, 2966 &(cookie->symbols 2967 + obj_convert (sec->owner)[cookie->rel->r_symndx])->native->u.syment); 2968 } 2969 2970 static bool _bfd_coff_gc_mark 2971 (struct bfd_link_info *, asection *, coff_gc_mark_hook_fn); 2972 2973 /* COOKIE->rel describes a relocation against section SEC, which is 2974 a section we've decided to keep. Mark the section that contains 2975 the relocation symbol. */ 2976 2977 static bool 2978 _bfd_coff_gc_mark_reloc (struct bfd_link_info *info, 2979 asection *sec, 2980 coff_gc_mark_hook_fn gc_mark_hook, 2981 struct coff_reloc_cookie *cookie) 2982 { 2983 asection *rsec; 2984 2985 rsec = _bfd_coff_gc_mark_rsec (info, sec, gc_mark_hook, cookie); 2986 if (rsec && !rsec->gc_mark) 2987 { 2988 if (bfd_get_flavour (rsec->owner) != bfd_target_coff_flavour) 2989 rsec->gc_mark = 1; 2990 else if (!_bfd_coff_gc_mark (info, rsec, gc_mark_hook)) 2991 return false; 2992 } 2993 return true; 2994 } 2995 2996 /* The mark phase of garbage collection. For a given section, mark 2997 it and any sections in this section's group, and all the sections 2998 which define symbols to which it refers. */ 2999 3000 static bool 3001 _bfd_coff_gc_mark (struct bfd_link_info *info, 3002 asection *sec, 3003 coff_gc_mark_hook_fn gc_mark_hook) 3004 { 3005 bool ret = true; 3006 3007 sec->gc_mark = 1; 3008 3009 /* Look through the section relocs. */ 3010 if ((sec->flags & SEC_RELOC) != 0 3011 && sec->reloc_count > 0) 3012 { 3013 struct coff_reloc_cookie cookie; 3014 3015 if (!init_reloc_cookie_for_section (&cookie, info, sec)) 3016 ret = false; 3017 else 3018 { 3019 for (; cookie.rel < cookie.relend; cookie.rel++) 3020 { 3021 if (!_bfd_coff_gc_mark_reloc (info, sec, gc_mark_hook, &cookie)) 3022 { 3023 ret = false; 3024 break; 3025 } 3026 } 3027 fini_reloc_cookie_for_section (&cookie, sec); 3028 } 3029 } 3030 3031 return ret; 3032 } 3033 3034 static bool 3035 _bfd_coff_gc_mark_extra_sections (struct bfd_link_info *info, 3036 coff_gc_mark_hook_fn mark_hook ATTRIBUTE_UNUSED) 3037 { 3038 bfd *ibfd; 3039 3040 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 3041 { 3042 asection *isec; 3043 bool some_kept; 3044 3045 if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour) 3046 continue; 3047 3048 /* Ensure all linker created sections are kept, and see whether 3049 any other section is already marked. */ 3050 some_kept = false; 3051 for (isec = ibfd->sections; isec != NULL; isec = isec->next) 3052 { 3053 if ((isec->flags & SEC_LINKER_CREATED) != 0) 3054 isec->gc_mark = 1; 3055 else if (isec->gc_mark) 3056 some_kept = true; 3057 } 3058 3059 /* If no section in this file will be kept, then we can 3060 toss out debug sections. */ 3061 if (!some_kept) 3062 continue; 3063 3064 /* Keep debug and special sections like .comment when they are 3065 not part of a group, or when we have single-member groups. */ 3066 for (isec = ibfd->sections; isec != NULL; isec = isec->next) 3067 if ((isec->flags & SEC_DEBUGGING) != 0 3068 || (isec->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0) 3069 isec->gc_mark = 1; 3070 } 3071 return true; 3072 } 3073 3074 /* Sweep symbols in swept sections. Called via coff_link_hash_traverse. */ 3075 3076 static bool 3077 coff_gc_sweep_symbol (struct coff_link_hash_entry *h, 3078 void *data ATTRIBUTE_UNUSED) 3079 { 3080 if (h->root.type == bfd_link_hash_warning) 3081 h = (struct coff_link_hash_entry *) h->root.u.i.link; 3082 3083 if ((h->root.type == bfd_link_hash_defined 3084 || h->root.type == bfd_link_hash_defweak) 3085 && !h->root.u.def.section->gc_mark 3086 && !(h->root.u.def.section->owner->flags & DYNAMIC)) 3087 { 3088 /* Do our best to hide the symbol. */ 3089 h->root.u.def.section = bfd_und_section_ptr; 3090 h->symbol_class = C_HIDDEN; 3091 } 3092 3093 return true; 3094 } 3095 3096 /* The sweep phase of garbage collection. Remove all garbage sections. */ 3097 3098 typedef bool (*gc_sweep_hook_fn) 3099 (bfd *, struct bfd_link_info *, asection *, const struct internal_reloc *); 3100 3101 static bool 3102 coff_gc_sweep (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) 3103 { 3104 bfd *sub; 3105 3106 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next) 3107 { 3108 asection *o; 3109 3110 if (bfd_get_flavour (sub) != bfd_target_coff_flavour) 3111 continue; 3112 3113 for (o = sub->sections; o != NULL; o = o->next) 3114 { 3115 /* Keep debug and special sections. */ 3116 if ((o->flags & (SEC_DEBUGGING | SEC_LINKER_CREATED)) != 0 3117 || (o->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0) 3118 o->gc_mark = 1; 3119 else if (startswith (o->name, ".idata") 3120 || startswith (o->name, ".pdata") 3121 || startswith (o->name, ".xdata") 3122 || startswith (o->name, ".rsrc")) 3123 o->gc_mark = 1; 3124 3125 if (o->gc_mark) 3126 continue; 3127 3128 /* Skip sweeping sections already excluded. */ 3129 if (o->flags & SEC_EXCLUDE) 3130 continue; 3131 3132 /* Since this is early in the link process, it is simple 3133 to remove a section from the output. */ 3134 o->flags |= SEC_EXCLUDE; 3135 3136 if (info->print_gc_sections && o->size != 0) 3137 /* xgettext: c-format */ 3138 _bfd_error_handler (_("removing unused section '%pA' in file '%pB'"), 3139 o, sub); 3140 3141 #if 0 3142 /* But we also have to update some of the relocation 3143 info we collected before. */ 3144 if (gc_sweep_hook 3145 && (o->flags & SEC_RELOC) != 0 3146 && o->reloc_count > 0 3147 && !bfd_is_abs_section (o->output_section)) 3148 { 3149 struct internal_reloc *internal_relocs; 3150 bool r; 3151 3152 internal_relocs 3153 = _bfd_coff_link_read_relocs (o->owner, o, NULL, NULL, 3154 info->keep_memory); 3155 if (internal_relocs == NULL) 3156 return false; 3157 3158 r = (*gc_sweep_hook) (o->owner, info, o, internal_relocs); 3159 3160 if (coff_section_data (o)->relocs != internal_relocs) 3161 free (internal_relocs); 3162 3163 if (!r) 3164 return false; 3165 } 3166 #endif 3167 } 3168 } 3169 3170 /* Remove the symbols that were in the swept sections from the dynamic 3171 symbol table. */ 3172 coff_link_hash_traverse (coff_hash_table (info), coff_gc_sweep_symbol, 3173 NULL); 3174 3175 return true; 3176 } 3177 3178 /* Keep all sections containing symbols undefined on the command-line, 3179 and the section containing the entry symbol. */ 3180 3181 static void 3182 _bfd_coff_gc_keep (struct bfd_link_info *info) 3183 { 3184 struct bfd_sym_chain *sym; 3185 3186 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next) 3187 { 3188 struct coff_link_hash_entry *h; 3189 3190 h = coff_link_hash_lookup (coff_hash_table (info), sym->name, 3191 false, false, false); 3192 3193 if (h != NULL 3194 && (h->root.type == bfd_link_hash_defined 3195 || h->root.type == bfd_link_hash_defweak) 3196 && !bfd_is_abs_section (h->root.u.def.section)) 3197 h->root.u.def.section->flags |= SEC_KEEP; 3198 } 3199 } 3200 3201 /* Do mark and sweep of unused sections. */ 3202 3203 bool 3204 bfd_coff_gc_sections (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) 3205 { 3206 bfd *sub; 3207 3208 /* FIXME: Should we implement this? */ 3209 #if 0 3210 const bfd_coff_backend_data *bed = coff_backend_info (abfd); 3211 3212 if (!bed->can_gc_sections 3213 || !is_coff_hash_table (info->hash)) 3214 { 3215 _bfd_error_handler(_("warning: gc-sections option ignored")); 3216 return true; 3217 } 3218 #endif 3219 3220 _bfd_coff_gc_keep (info); 3221 3222 /* Grovel through relocs to find out who stays ... */ 3223 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next) 3224 { 3225 asection *o; 3226 3227 if (bfd_get_flavour (sub) != bfd_target_coff_flavour) 3228 continue; 3229 3230 for (o = sub->sections; o != NULL; o = o->next) 3231 { 3232 if (((o->flags & (SEC_EXCLUDE | SEC_KEEP)) == SEC_KEEP 3233 || startswith (o->name, ".vectors") 3234 || startswith (o->name, ".ctors") 3235 || startswith (o->name, ".dtors")) 3236 && !o->gc_mark) 3237 { 3238 if (!_bfd_coff_gc_mark (info, o, _bfd_coff_gc_mark_hook)) 3239 return false; 3240 } 3241 } 3242 } 3243 3244 /* Allow the backend to mark additional target specific sections. */ 3245 _bfd_coff_gc_mark_extra_sections (info, _bfd_coff_gc_mark_hook); 3246 3247 /* ... and mark SEC_EXCLUDE for those that go. */ 3248 return coff_gc_sweep (abfd, info); 3249 } 3250 3251 /* Return name used to identify a comdat group. */ 3252 3253 const char * 3254 bfd_coff_group_name (bfd *abfd, const asection *sec) 3255 { 3256 struct coff_comdat_info *ci = bfd_coff_get_comdat_section (abfd, sec); 3257 if (ci != NULL) 3258 return ci->name; 3259 return NULL; 3260 } 3261 3262 bool 3263 _bfd_coff_free_cached_info (bfd *abfd) 3264 { 3265 struct coff_tdata *tdata; 3266 3267 if (bfd_family_coff (abfd) 3268 && (bfd_get_format (abfd) == bfd_object 3269 || bfd_get_format (abfd) == bfd_core) 3270 && (tdata = coff_data (abfd)) != NULL) 3271 { 3272 if (tdata->section_by_index) 3273 { 3274 htab_delete (tdata->section_by_index); 3275 tdata->section_by_index = NULL; 3276 } 3277 3278 if (tdata->section_by_target_index) 3279 { 3280 htab_delete (tdata->section_by_target_index); 3281 tdata->section_by_target_index = NULL; 3282 } 3283 3284 if (obj_pe (abfd) && pe_data (abfd)->comdat_hash) 3285 { 3286 htab_delete (pe_data (abfd)->comdat_hash); 3287 pe_data (abfd)->comdat_hash = NULL; 3288 } 3289 3290 _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info); 3291 _bfd_stab_cleanup (abfd, &tdata->line_info); 3292 3293 /* PR 25447: 3294 Do not clear the keep_syms and keep_strings flags. 3295 These may have been set by pe_ILF_build_a_bfd() indicating 3296 that the syms and strings pointers are not to be freed. */ 3297 if (!_bfd_coff_free_symbols (abfd)) 3298 return false; 3299 } 3300 3301 return _bfd_generic_bfd_free_cached_info (abfd); 3302 } 3303