summaryrefslogtreecommitdiffstats
path: root/contrib/binutils/bfd/reloc16.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/binutils/bfd/reloc16.c')
-rw-r--r--contrib/binutils/bfd/reloc16.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/contrib/binutils/bfd/reloc16.c b/contrib/binutils/bfd/reloc16.c
index 7e7952e..0e7c18a 100644
--- a/contrib/binutils/bfd/reloc16.c
+++ b/contrib/binutils/bfd/reloc16.c
@@ -81,7 +81,8 @@ bfd_coff_reloc16_get_value (reloc, link_info, input_section)
{
if (! ((*link_info->callbacks->undefined_symbol)
(link_info, bfd_asymbol_name (symbol),
- input_section->owner, input_section, reloc->address)))
+ input_section->owner, input_section, reloc->address,
+ true)))
abort ();
value = 0;
}
@@ -194,9 +195,10 @@ bfd_coff_reloc16_relax_section (abfd, i, link_info, again)
{
int another_pass = 0;
- /* Allocate and initialize the shrinks array for this section. */
- shrinks = (int *) bfd_malloc (reloc_count * sizeof (int));
- memset (shrinks, 0, reloc_count * sizeof (int));
+ /* Allocate and initialize the shrinks array for this section.
+ The last element is used as an accumlator of shrinks. */
+ shrinks = (int *) bfd_malloc ((reloc_count + 1) * sizeof (int));
+ memset (shrinks, 0, (reloc_count + 1) * sizeof (int));
/* Loop until nothing changes in this section. */
do {
@@ -218,13 +220,14 @@ bfd_coff_reloc16_relax_section (abfd, i, link_info, again)
if (shrink != shrinks[i])
{
another_pass = 1;
- for (j = i + 1; j < reloc_count; j++)
+ for (j = i + 1; j <= reloc_count; j++)
shrinks[j] += shrink - shrinks[i];
}
}
} while (another_pass);
+ shrink = shrinks[reloc_count];
free((char *)shrinks);
}
OpenPOWER on IntegriCloud