PR ld/12161
authorNick Clifton <nickc@redhat.com>
Thu, 5 Jan 2012 09:57:18 +0000 (09:57 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 5 Jan 2012 09:57:18 +0000 (09:57 +0000)
* elf32-avr.c (elf32_avr_relax_delete_bytes): Read in relocs if
necessary.

bfd/ChangeLog
bfd/elf32-avr.c

index eeef5a6c177ad5284bf037d8194f490ab3de2a2d..e5444993ed6b78511f2284b16fe79f63188ce049 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-05  Nick Clifton  <nickc@redhat.com>
+
+       PR ld/12161
+       * elf32-avr.c (elf32_avr_relax_delete_bytes): Read in relocs if
+       necessary.
+
 2012-01-05  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix zero registers core files when built by gcc-4.7.
index 6d20aefdc21904479b9eaddf0a836f41ca9fa915..a7f92174136773dbe88b67be0eb649fc5e057c4f 100644 (file)
@@ -1503,11 +1503,18 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
        bfd_vma symval;
        bfd_vma shrinked_insn_address;
 
+       if (isec->reloc_count == 0)
+        continue;
+
        shrinked_insn_address = (sec->output_section->vma
                                 + sec->output_offset + addr - count);
 
-       irelend = elf_section_data (isec)->relocs + isec->reloc_count;
-       for (irel = elf_section_data (isec)->relocs;
+       irel = elf_section_data (isec)->relocs;
+       /* PR 12161: Read in the relocs for this section if necessary.  */
+       if (irel == NULL)
+        irel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, FALSE);
+
+       for (irelend = irel + isec->reloc_count;
             irel < irelend;
             irel++)
          {
@@ -1564,6 +1571,9 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
           /* else...Reference symbol is extern.  No need for adjusting
              the addend.  */
         }
+
+       if (elf_section_data (isec)->relocs == NULL)
+        free (irelend - isec->reloc_count);
      }
   }