Do not crash when encountering relocs against the *ABS* section.
authorNick Clifton <nickc@redhat.com>
Wed, 30 Apr 2003 12:03:58 +0000 (12:03 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 30 Apr 2003 12:03:58 +0000 (12:03 +0000)
bfd/ChangeLog
bfd/elf32-h8300.c

index 51c0726..34883f6 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-30  Nick Clifton  <nickc@redhat.com>
+
+       * elf32-h8300.c (elf32_h8_relax_section): Do not crash when
+       encountering relocs against the *ABS* section.
+
 2003-04-28  H.J. Lu <hjl@gnu.org>
 
        * elfxx-ia64.c (elfNN_ia64_relax_section): Relax ldxmov during
index 6008d5d..e43ed9d 100644 (file)
@@ -778,9 +778,12 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
 
          isym = isymbuf + ELF32_R_SYM (irel->r_info);
          sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-         symval = (isym->st_value
-                   + sym_sec->output_section->vma
-                   + sym_sec->output_offset);
+         symval = isym->st_value;
+         /* If the reloc is absolute, it will not have
+            a symbol or section associated with it.  */
+         if (sym_sec)
+           symval += sym_sec->output_section->vma
+             + sym_sec->output_offset;
        }
       else
        {
@@ -1082,6 +1085,7 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
                    && value >= 0xffff00
                    && value <= 0xffffff))
              {
+               bfd_boolean skip = FALSE;
                unsigned char code;
 
                /* Note that we've changed the relocs, section contents,
@@ -1099,16 +1103,27 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
 
                code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
-               if ((code & 0xf0) == 0x00)
-                 bfd_put_8 (abfd,
-                            (code & 0xf) | 0x20,
-                            contents + irel->r_offset - 2);
-               else if ((code & 0xf0) == 0x80)
-                 bfd_put_8 (abfd,
-                            (code & 0xf) | 0x30,
-                            contents + irel->r_offset - 2);
-               else
-                 abort ();
+               switch (code & 0xf0)
+                 {
+                 case 0x00:
+                   bfd_put_8 (abfd, (code & 0xf) | 0x20,
+                              contents + irel->r_offset - 2);
+                   break;
+                 case 0x80:
+                   bfd_put_8 (abfd, (code & 0xf) | 0x30,
+                              contents + irel->r_offset - 2);
+                   break;
+                 case 0x20:
+                 case 0xa0:
+                   /* Skip 32bit versions.  */
+                   skip = TRUE;
+                   break;
+                 default:
+                   abort ();
+                 }
+
+               if (skip)
+                 break;
 
                /* Fix the relocation's type.  */
                irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),