* 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:
parent
e92babf632
commit
5c3dead3ce
@ -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):
|
||||||
|
@ -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) ();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user