aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2005-02-15 01:54:58 +0000
committerH.J. Lu <hjl.tools@gmail.com>2005-02-15 01:54:58 +0000
commitc5509b9207b439d78116077e4aff2b4db91bf450 (patch)
tree5f9acc01ca3ce47e859eaaf44c3498e31d785b97
parentfc0f5a301309abaa1c1fbf3acdf301833579833d (diff)
downloadgdb-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.
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/elfxx-ia64.c45
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 <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
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;