2004-01-07 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-ia64.c (elfNN_ia64_relax_section): Don't install trampoline if it is known out of range.
This commit is contained in:
parent
73f209588f
commit
de0d9f330b
2 changed files with 22 additions and 4 deletions
|
@ -1,3 +1,8 @@
|
|||
2004-01-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elfxx-ia64.c (elfNN_ia64_relax_section): Don't install
|
||||
trampoline if it is known out of range.
|
||||
|
||||
2004-01-06 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
2003-12-17 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
|
|
@ -876,6 +876,8 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
|
|||
|
||||
if (is_branch)
|
||||
{
|
||||
bfd_signed_vma offset;
|
||||
|
||||
reladdr = (sec->output_section->vma
|
||||
+ sec->output_offset
|
||||
+ roff) & (bfd_vma) -4;
|
||||
|
@ -911,6 +913,13 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
|
|||
|
||||
/* Resize the current section to make room for the new branch. */
|
||||
trampoff = (sec->_cooked_size + 15) & (bfd_vma) -16;
|
||||
|
||||
/* If trampoline is out of range, there is nothing we
|
||||
can do. */
|
||||
offset = trampoff - (roff & (bfd_vma) -4);
|
||||
if (offset < -0x1000000 || offset > 0x0FFFFF0)
|
||||
continue;
|
||||
|
||||
amt = trampoff + size;
|
||||
contents = (bfd_byte *) bfd_realloc (contents, amt);
|
||||
if (contents == NULL)
|
||||
|
@ -957,14 +966,18 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
|
|||
}
|
||||
else
|
||||
{
|
||||
/* If trampoline is out of range, there is nothing we
|
||||
can do. */
|
||||
offset = f->trampoff - (roff & (bfd_vma) -4);
|
||||
if (offset < -0x1000000 || offset > 0x0FFFFF0)
|
||||
continue;
|
||||
|
||||
/* Nop out the reloc, since we're finalizing things here. */
|
||||
irel->r_info = ELFNN_R_INFO (0, R_IA64_NONE);
|
||||
}
|
||||
|
||||
/* Fix up the existing branch to hit the trampoline. Hope like
|
||||
hell this doesn't overflow too. */
|
||||
if (elfNN_ia64_install_value (abfd, contents + roff,
|
||||
f->trampoff - (roff & (bfd_vma) -4),
|
||||
/* Fix up the existing branch to hit the trampoline. */
|
||||
if (elfNN_ia64_install_value (abfd, contents + roff, offset,
|
||||
r_type) != bfd_reloc_ok)
|
||||
goto error_return;
|
||||
|
||||
|
|
Loading…
Reference in a new issue