aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf-m10300.c37
2 files changed, 25 insertions, 17 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6647eae..7543f62 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2007-10-31 Nick Clifton <nickc@redhat.com>
+
+ * elf-m10300.c (mn10300_elf_relax_delete_bytes): Do not look for
+ align relocs when there are no relocs attached to the section.
+
2007-10-31 Alan Modra <amodra@bigpond.net.au>
* elf-bfd.h (bfd_elf_match_symbols_in_sections): Don't declare.
diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c
index db8114e..7c51498 100644
--- a/bfd/elf-m10300.c
+++ b/bfd/elf-m10300.c
@@ -1847,24 +1847,27 @@ mn10300_elf_relax_delete_bytes (bfd *abfd,
irel = elf_section_data (sec)->relocs;
irelend = irel + sec->reloc_count;
- /* If there is an align reloc at the end of the section ignore it.
- GAS creates these relocs for reasons of its own, and they just
- serve to keep the section artifically inflated. */
- if (ELF32_R_TYPE ((irelend - 1)->r_info) == (int) R_MN10300_ALIGN)
- --irelend;
+ if (sec->reloc_count > 0)
+ {
+ /* If there is an align reloc at the end of the section ignore it.
+ GAS creates these relocs for reasons of its own, and they just
+ serve to keep the section artifically inflated. */
+ if (ELF32_R_TYPE ((irelend - 1)->r_info) == (int) R_MN10300_ALIGN)
+ --irelend;
- /* The deletion must stop at the next ALIGN reloc for an aligment
- power larger than the number of bytes we are deleting. */
- for (; irel < irelend; irel++)
- if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN
- && irel->r_offset > addr
- && irel->r_offset < toaddr
- && count < (1 << irel->r_addend))
- {
- irelalign = irel;
- toaddr = irel->r_offset;
- break;
- }
+ /* The deletion must stop at the next ALIGN reloc for an aligment
+ power larger than the number of bytes we are deleting. */
+ for (; irel < irelend; irel++)
+ if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN
+ && irel->r_offset > addr
+ && irel->r_offset < toaddr
+ && count < (1 << irel->r_addend))
+ {
+ irelalign = irel;
+ toaddr = irel->r_offset;
+ break;
+ }
+ }
/* Actually delete the bytes. */
memmove (contents + addr, contents + addr + count,