* elf64-ppc.c (ppc_build_one_stub): Replace assertion that long

branch offset is in range with an error.  Print full stub name on
	errors.
	(ppc_size_one_stub): Print full stub name on errors.
	(group_sections): Warn if section size exceeds group size.
	(ppc64_elf_size_stubs): Continue relaxing when stub types change.
This commit is contained in:
Alan Modra 2005-09-19 09:35:26 +00:00
parent e92babf632
commit 5c3dead3ce
2 changed files with 36 additions and 12 deletions

View File

@ -1,3 +1,12 @@
2005-09-19 Alan Modra <amodra@bigpond.net.au>
* elf64-ppc.c (ppc_build_one_stub): Replace assertion that long
branch offset is in range with an error. Print full stub name on
errors.
(ppc_size_one_stub): Print full stub name on errors.
(group_sections): Warn if section size exceeds group size.
(ppc64_elf_size_stubs): Continue relaxing when stub types change.
2005-09-09 Kevin Buettner <kevinb@redhat.com> 2005-09-09 Kevin Buettner <kevinb@redhat.com>
* elf32-am33lin.c (bfd.h, sysdep.h, elf-bfd.h, elf/mn10300.h): * elf32-am33lin.c (bfd.h, sysdep.h, elf-bfd.h, elf/mn10300.h):

View File

@ -8015,7 +8015,13 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
} }
bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc); bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
BFD_ASSERT (off + (1 << 25) < (bfd_vma) (1 << 26)); if (off + (1 << 25) >= (bfd_vma) (1 << 26))
{
(*_bfd_error_handler) (_("long branch stub `%s' offset overflow"),
stub_entry->root.string);
htab->stub_error = TRUE;
return FALSE;
}
if (info->emitrelocations) if (info->emitrelocations)
{ {
@ -8087,7 +8093,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
if (br_entry == NULL) if (br_entry == NULL)
{ {
(*_bfd_error_handler) (_("can't find branch stub `%s'"), (*_bfd_error_handler) (_("can't find branch stub `%s'"),
stub_entry->root.string + 9); stub_entry->root.string);
htab->stub_error = TRUE; htab->stub_error = TRUE;
return FALSE; return FALSE;
} }
@ -8331,7 +8337,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
if (br_entry == NULL) if (br_entry == NULL)
{ {
(*_bfd_error_handler) (_("can't build branch stub `%s'"), (*_bfd_error_handler) (_("can't build branch stub `%s'"),
stub_entry->root.string + 9); stub_entry->root.string);
htab->stub_error = TRUE; htab->stub_error = TRUE;
return FALSE; return FALSE;
} }
@ -8752,7 +8758,10 @@ group_sections (struct ppc_link_hash_table *htab,
curr = tail; curr = tail;
total = tail->size; total = tail->size;
big_sec = total >= stub_group_size; big_sec = total > stub_group_size;
if (big_sec)
(*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
tail->owner, tail);
curr_toc = htab->stub_group[tail->id].toc_off; curr_toc = htab->stub_group[tail->id].toc_off;
while ((prev = PREV_SEC (curr)) != NULL while ((prev = PREV_SEC (curr)) != NULL
@ -8854,10 +8863,8 @@ ppc64_elf_size_stubs (bfd *output_bfd,
bfd *input_bfd; bfd *input_bfd;
unsigned int bfd_indx; unsigned int bfd_indx;
asection *stub_sec; asection *stub_sec;
bfd_boolean stub_changed;
htab->stub_iteration += 1; htab->stub_iteration += 1;
stub_changed = FALSE;
for (input_bfd = info->input_bfds, bfd_indx = 0; for (input_bfd = info->input_bfds, bfd_indx = 0;
input_bfd != NULL; input_bfd != NULL;
@ -9106,8 +9113,6 @@ ppc64_elf_size_stubs (bfd *output_bfd,
if (stub_entry->h != NULL) if (stub_entry->h != NULL)
htab->stub_globals += 1; htab->stub_globals += 1;
stub_changed = TRUE;
} }
/* We're done with the internal relocs, free them. */ /* We're done with the internal relocs, free them. */
@ -9125,16 +9130,14 @@ ppc64_elf_size_stubs (bfd *output_bfd,
} }
} }
if (!stub_changed) /* We may have added some stubs. Find out the new size of the
break;
/* OK, we've added some stubs. Find out the new size of the
stub sections. */ stub sections. */
for (stub_sec = htab->stub_bfd->sections; for (stub_sec = htab->stub_bfd->sections;
stub_sec != NULL; stub_sec != NULL;
stub_sec = stub_sec->next) stub_sec = stub_sec->next)
if ((stub_sec->flags & SEC_LINKER_CREATED) == 0) if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
{ {
stub_sec->rawsize = stub_sec->size;
stub_sec->size = 0; stub_sec->size = 0;
stub_sec->reloc_count = 0; stub_sec->reloc_count = 0;
} }
@ -9145,6 +9148,18 @@ ppc64_elf_size_stubs (bfd *output_bfd,
bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info); bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
for (stub_sec = htab->stub_bfd->sections;
stub_sec != NULL;
stub_sec = stub_sec->next)
if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
&& stub_sec->rawsize != stub_sec->size)
break;
/* Exit from this loop when no stubs have been added, and no stubs
have changed size. */
if (stub_sec == NULL)
break;
/* Ask the linker to do its stuff. */ /* Ask the linker to do its stuff. */
(*htab->layout_sections_again) (); (*htab->layout_sections_again) ();
} }