diff options
author | H.J. Lu <hjl@lucon.org> | 2005-02-15 01:54:58 +0000 |
---|---|---|
committer | H.J. Lu <hjl@lucon.org> | 2005-02-15 01:54:58 +0000 |
commit | debc67f75ca059e7bfa72d0087774549b41d457c (patch) | |
tree | b9787b934103219bd6ab631983b44fb398d3c4af /bfd/elfxx-ia64.c | |
parent | 53d1ff05e35545c6efa9545dc553be32dff85a00 (diff) | |
download | binutils-redhat-debc67f75ca059e7bfa72d0087774549b41d457c.tar.gz |
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.
Diffstat (limited to 'bfd/elfxx-ia64.c')
-rw-r--r-- | bfd/elfxx-ia64.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c index 135a337474..1b8da478d4 100644 --- a/bfd/elfxx-ia64.c +++ b/bfd/elfxx-ia64.c @@ -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; |