diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2005-02-15 01:54:58 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2005-02-15 01:54:58 +0000 |
commit | c5509b9207b439d78116077e4aff2b4db91bf450 (patch) | |
tree | 5f9acc01ca3ce47e859eaaf44c3498e31d785b97 /bfd/elfxx-ia64.c | |
parent | fc0f5a301309abaa1c1fbf3acdf301833579833d (diff) | |
download | gdb-c5509b9207b439d78116077e4aff2b4db91bf450.zip gdb-c5509b9207b439d78116077e4aff2b4db91bf450.tar.gz gdb-c5509b9207b439d78116077e4aff2b4db91bf450.tar.bz2 |
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 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; |