diff options
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf-m10300.c | 37 |
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, |