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>
* 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
got one honking big section and we can't help you. You'll
get an error message later. */
if (tsec == sec)
got one honking big section and we can't help you unless
you are branching backwards. You'll get an error message
later. */
if (tsec == sec && toff > roff)
continue;
/* 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')
name = bfd_section_name (input_bfd, sym_sec);
}
if (!(*info->callbacks->reloc_overflow) (info, &h->root,
name, howto->name,
(bfd_vma) 0,
input_bfd,
input_section,
rel->r_offset))
return FALSE;
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,
input_bfd,
input_section,
rel->r_offset))
return FALSE;
break;
}
ret_val = FALSE;
}
break;