From c5509b9207b439d78116077e4aff2b4db91bf450 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 15 Feb 2005 01:54:58 +0000 Subject: [PATCH] 2005-02-14 H.J. Lu * 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. --- bfd/ChangeLog | 9 +++++++++ bfd/elfxx-ia64.c | 45 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 38920f6..42cad6e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2005-02-14 H.J. Lu + + * 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 * elfcore.h (elf_core_file_p): Move the call to diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c index 135a337..1b8da47 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; -- 2.7.4