X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fstabs.c;h=81ef1deb4a6ad589f0b38e4bacef31a7f955af65;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=56dfb560f3cb91540f1277e2358f9d7c839e4948;hpb=116c20d240af833e0a1f1f959951f57b6e465782;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/stabs.c b/bfd/stabs.c index 56dfb560f3..81ef1deb4a 100644 --- a/bfd/stabs.c +++ b/bfd/stabs.c @@ -1,13 +1,12 @@ /* Stabs in sections linking support. - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright (C) 1996-2020 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. This file is part of BFD, the Binary File Descriptor library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,13 +16,15 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + /* This file contains support for linking stabs in sections, as used on COFF and ELF. */ -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "libbfd.h" #include "aout/stab_gnu.h" #include "safe-ctype.h" @@ -125,8 +126,8 @@ stab_link_includes_newfunc (struct bfd_hash_entry *entry, /* Allocate the structure if it has not already been allocated by a subclass. */ if (ret == NULL) - ret = bfd_hash_allocate (table, - sizeof (struct stab_link_includes_entry)); + ret = (struct stab_link_includes_entry *) + bfd_hash_allocate (table, sizeof (struct stab_link_includes_entry)); if (ret == NULL) return NULL; @@ -175,10 +176,8 @@ _bfd_link_section_stabs (bfd *abfd, prepared to handle them. */ return TRUE; - if ((stabsec->output_section != NULL - && bfd_is_abs_section (stabsec->output_section)) - || (stabstrsec->output_section != NULL - && bfd_is_abs_section (stabstrsec->output_section))) + if (bfd_is_abs_section (stabsec->output_section) + || bfd_is_abs_section (stabstrsec->output_section)) /* At least one of the sections is being discarded from the link, so we should just ignore them. */ return TRUE; @@ -187,6 +186,8 @@ _bfd_link_section_stabs (bfd *abfd, if (sinfo->stabstr == NULL) { + flagword flags; + /* Initialize the stabs information we need to keep track of. */ first = TRUE; sinfo->strings = _bfd_stringtab_init (); @@ -194,15 +195,16 @@ _bfd_link_section_stabs (bfd *abfd, goto error_return; /* Make sure the first byte is zero. */ (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE); - if (! bfd_hash_table_init_n (&sinfo->includes, - stab_link_includes_newfunc, - 251)) + if (! bfd_hash_table_init (&sinfo->includes, + stab_link_includes_newfunc, + sizeof (struct stab_link_includes_entry))) goto error_return; - sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr"); + flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING + | SEC_LINKER_CREATED); + sinfo->stabstr = bfd_make_section_anyway_with_flags (abfd, ".stabstr", + flags); if (sinfo->stabstr == NULL) goto error_return; - sinfo->stabstr->flags |= (SEC_HAS_CONTENTS | SEC_READONLY - | SEC_DEBUGGING | SEC_LINKER_CREATED); } /* Initialize the information we are going to store for this .stab @@ -272,8 +274,9 @@ _bfd_link_section_stabs (bfd *abfd, symstroff = stroff + bfd_get_32 (abfd, sym + STRDXOFF); if (symstroff >= stabstrsec->size) { - (*_bfd_error_handler) - (_("%B(%A+0x%lx): Stabs entry has invalid string index."), + _bfd_error_handler + /* xgettext:c-format */ + (_("%pB(%pA+%#lx): stabs entry has invalid string index"), abfd, stabsec, (long) (sym - stabbuf)); bfd_set_error (bfd_error_bad_value); goto error_return; @@ -334,7 +337,7 @@ _bfd_link_section_stabs (bfd *abfd, if (num_chars >= buf_len) { buf_len += 32 * 1024; - symb = bfd_realloc (symb, buf_len); + symb = (char *) bfd_realloc_or_free (symb, buf_len); if (symb == NULL) goto error_return; symb_rover = symb + num_chars; @@ -372,7 +375,7 @@ _bfd_link_section_stabs (bfd *abfd, /* Record this symbol, so that we can set the value correctly. */ amt = sizeof *ne; - ne = bfd_alloc (abfd, amt); + ne = (struct stab_excl_list *) bfd_alloc (abfd, amt); if (ne == NULL) goto error_return; ne->offset = sym - stabbuf; @@ -385,12 +388,14 @@ _bfd_link_section_stabs (bfd *abfd, { /* This is the first time we have seen this header file with this set of stabs strings. */ - t = bfd_hash_allocate (&sinfo->includes, sizeof *t); + t = (struct stab_link_includes_totals *) + bfd_hash_allocate (&sinfo->includes, sizeof *t); if (t == NULL) goto error_return; t->sum_chars = sum_chars; t->num_chars = num_chars; - t->symb = bfd_realloc (symb, num_chars); /* Trim data down. */ + /* Trim data down. */ + t->symb = symb = (char *) bfd_realloc_or_free (symb, num_chars); t->next = incl_entry->totals; incl_entry->totals = t; } @@ -430,7 +435,7 @@ _bfd_link_section_stabs (bfd *abfd, ++nest; else if (incl_type == (int) N_EXCL) /* Keep existing exclusion marks. */ - continue; + continue; else if (nest == 0) { *incl_pstridx = (bfd_size_type) -1; @@ -455,8 +460,8 @@ _bfd_link_section_stabs (bfd *abfd, for that section. */ stabsec->size = (count - skip) * STABSIZE; if (stabsec->size == 0) - stabsec->flags |= SEC_EXCLUDE; - stabstrsec->flags |= SEC_EXCLUDE; + stabsec->flags |= SEC_EXCLUDE | SEC_KEEP; + stabstrsec->flags |= SEC_EXCLUDE | SEC_KEEP; sinfo->stabstr->size = _bfd_stringtab_size (sinfo->strings); /* Calculate the `cumulative_skips' array now that stabs have been @@ -468,7 +473,7 @@ _bfd_link_section_stabs (bfd *abfd, bfd_size_type *pskips; amt = count * sizeof (bfd_size_type); - secinfo->cumulative_skips = bfd_alloc (abfd, amt); + secinfo->cumulative_skips = (bfd_size_type *) bfd_alloc (abfd, amt); if (secinfo->cumulative_skips == NULL) goto error_return; @@ -489,10 +494,8 @@ _bfd_link_section_stabs (bfd *abfd, return TRUE; error_return: - if (stabbuf != NULL) - free (stabbuf); - if (stabstrbuf != NULL) - free (stabstrbuf); + free (stabbuf); + free (stabstrbuf); return FALSE; } @@ -532,7 +535,7 @@ _bfd_discard_section_stabs (bfd *abfd, link, so we should just ignore them. */ return FALSE; - /* We should have initialized our data in _bfd_link_stab_sections. + /* We should have initialized our data in _bfd_link_section_stabs. If there was some bizarre error reading the string sections, though, we might not have. Bail rather than asserting. */ if (psecinfo == NULL) @@ -608,7 +611,7 @@ _bfd_discard_section_stabs (bfd *abfd, /* Shrink the stabsec as needed. */ stabsec->size -= skip * STABSIZE; if (stabsec->size == 0) - stabsec->flags |= SEC_EXCLUDE; + stabsec->flags |= SEC_EXCLUDE | SEC_KEEP; /* Recalculate the `cumulative_skips' array now that stabs have been deleted for this section. */ @@ -621,7 +624,7 @@ _bfd_discard_section_stabs (bfd *abfd, if (secinfo->cumulative_skips == NULL) { amt = count * sizeof (bfd_size_type); - secinfo->cumulative_skips = bfd_alloc (abfd, amt); + secinfo->cumulative_skips = (bfd_size_type *) bfd_alloc (abfd, amt); if (secinfo->cumulative_skips == NULL) goto error_return; } @@ -643,8 +646,7 @@ _bfd_discard_section_stabs (bfd *abfd, return skip > 0; error_return: - if (stabbuf != NULL) - free (stabbuf); + free (stabbuf); return FALSE; }