2005-02-14 H.J. Lu <hongjiu.lu@intel.com>

* elfxx-ia64.c (elfNN_ia64_relax_section): Allow relax
	backward branch in the same section.
	(elfNN_ia64_relocate_section): Inform users that the input
	section is too big to relax br instruction when overflow
	happens to R_IA64_PCREL21B, R_IA64_PCREL21BI, R_IA64_PCREL21M
	and R_IA64_PCREL21F.
This commit is contained in:
H.J. Lu
2005-02-15 01:54:58 +00:00
parent fc0f5a3013
commit c5509b9207
2 changed files with 44 additions and 10 deletions

View File

@ -1,3 +1,12 @@
2005-02-14 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-ia64.c (elfNN_ia64_relax_section): Allow relax
backward branch in the same section.
(elfNN_ia64_relocate_section): Inform users that the input
section is too big to relax br instruction when overflow
happens to R_IA64_PCREL21B, R_IA64_PCREL21BI, R_IA64_PCREL21M
and R_IA64_PCREL21F.
2005-02-14 Orjan Friberg <orjanf@axis.com> 2005-02-14 Orjan Friberg <orjanf@axis.com>
* elfcore.h (elf_core_file_p): Move the call to * elfcore.h (elf_core_file_p): Move the call to

View File

@ -984,9 +984,10 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
} }
/* If the branch and target are in the same section, you've /* If the branch and target are in the same section, you've
got one honking big section and we can't help you. You'll got one honking big section and we can't help you unless
get an error message later. */ you are branching backwards. You'll get an error message
if (tsec == sec) later. */
if (tsec == sec && toff > roff)
continue; continue;
/* Look for an existing fixup to this address. */ /* Look for an existing fixup to this address. */
@ -4504,13 +4505,37 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
if (*name == '\0') if (*name == '\0')
name = bfd_section_name (input_bfd, sym_sec); name = bfd_section_name (input_bfd, sym_sec);
} }
if (!(*info->callbacks->reloc_overflow) (info, &h->root,
name, howto->name, switch (r_type)
{
case R_IA64_PCREL21B:
case R_IA64_PCREL21BI:
case R_IA64_PCREL21M:
case R_IA64_PCREL21F:
if (is_elf_hash_table (info->hash))
{
/* Relaxtion is always performed for ELF output.
Overflow failures for those relocations mean
that the section is too big to relax. */
(*_bfd_error_handler)
(_("%B: Can't relax br (%s) to `%s' at 0x%lx in section `%A' with size 0x%lx (> 0x1000000)."),
input_bfd, input_section, howto->name, name,
rel->r_offset, input_section->size);
break;
}
default:
if (!(*info->callbacks->reloc_overflow) (info,
&h->root,
name,
howto->name,
(bfd_vma) 0, (bfd_vma) 0,
input_bfd, input_bfd,
input_section, input_section,
rel->r_offset)) rel->r_offset))
return FALSE; return FALSE;
break;
}
ret_val = FALSE; ret_val = FALSE;
} }
break; break;