]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/elf32-dlx.c
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / bfd / elf32-dlx.c
index b1f6257641c2db0460946305d797840a90f0a9aa..6995de45fccfeb2a6300629148f15c55d43902a3 100644 (file)
@@ -1,11 +1,11 @@
 /* DLX specific support for 32-bit ELF
-   Copyright 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2002-2020 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "elf/dlx.h"
+#include "elf32-dlx.h"
 
 #define USE_REL 1
 
 #define bfd_elf32_bfd_reloc_type_lookup elf32_dlx_reloc_type_lookup
-#define elf_info_to_howto               elf32_dlx_info_to_howto
-#define elf_info_to_howto_rel           elf32_dlx_info_to_howto_rel
-#define elf_backend_check_relocs        elf32_dlx_check_relocs
+#define bfd_elf32_bfd_reloc_name_lookup elf32_dlx_reloc_name_lookup
+#define elf_info_to_howto              elf32_dlx_info_to_howto
+#define elf_info_to_howto_rel          elf32_dlx_info_to_howto_rel
+#define elf_backend_check_relocs       elf32_dlx_check_relocs
 
 /* The gas default behavior is not to preform the %hi modifier so that the
    GNU assembler can have the lower 16 bits offset placed in the insn, BUT
@@ -39,8 +41,6 @@
 
 static int skip_dlx_elf_hi16_reloc = 0;
 
-extern int set_dlx_skip_hi16_flag (int);
-
 int
 set_dlx_skip_hi16_flag (int flag)
 {
@@ -65,7 +65,7 @@ _bfd_dlx_elf_hi16_reloc (bfd *abfd,
      fixup like mips gld did.   */
   if (skip_dlx_elf_hi16_reloc)
     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
-                          input_section, output_bfd, error_message);
+                         input_section, output_bfd, error_message);
 
   /* If we're relocating, and this an external symbol, we don't want
      to change anything.  */
@@ -93,7 +93,7 @@ _bfd_dlx_elf_hi16_reloc (bfd *abfd,
     return bfd_reloc_outofrange;
 
   bfd_put_16 (abfd, (short)((relocation >> 16) & 0xFFFF),
-              (bfd_byte *)data + reloc_entry->address);
+             (bfd_byte *)data + reloc_entry->address);
 
   return ret;
 }
@@ -118,7 +118,7 @@ elf32_dlx_relocate16 (bfd *abfd,
                      char **error_message ATTRIBUTE_UNUSED)
 {
   unsigned long insn, vallo, allignment;
-  int           val;
+  int          val;
 
   /* HACK: I think this first condition is necessary when producing
      relocatable output.  After the end of HACK, the code is identical
@@ -127,7 +127,7 @@ elf32_dlx_relocate16 (bfd *abfd,
 
   if (skip_dlx_elf_hi16_reloc)
     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
-                                 input_section, output_bfd, error_message);
+                                input_section, output_bfd, error_message);
 
   /* Check undefined section and undefined symbols.  */
   if (bfd_is_und_section (symbol->section)
@@ -137,9 +137,9 @@ elf32_dlx_relocate16 (bfd *abfd,
   /* Can not support a long jump to sections other then .text.  */
   if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
     {
-      fprintf (stderr,
-              "BFD Link Error: branch (PC rel16) to section (%s) not supported\n",
-              symbol->section->output_section->name);
+      _bfd_error_handler
+       (_("branch (PC rel16) to section (%s) not supported"),
+        symbol->section->output_section->name);
       return bfd_reloc_undefined;
     }
 
@@ -152,8 +152,8 @@ elf32_dlx_relocate16 (bfd *abfd,
 
   /* vallo points to the vma of next instruction.  */
   vallo += (((unsigned long)(input_section->output_section->vma +
-                           input_section->output_offset) +
-            allignment) & ~allignment);
+                          input_section->output_offset) +
+           allignment) & ~allignment);
 
   /* val is the displacement (PC relative to next instruction).  */
   val =  (symbol->section->output_offset +
@@ -166,7 +166,7 @@ elf32_dlx_relocate16 (bfd *abfd,
   insn  = (insn & 0xFFFF0000) | (val & 0x0000FFFF);
 
   bfd_put_32 (abfd, insn,
-              (bfd_byte *) data + reloc_entry->address);
+             (bfd_byte *) data + reloc_entry->address);
 
   return bfd_reloc_ok;
 }
@@ -181,7 +181,7 @@ elf32_dlx_relocate26 (bfd *abfd,
                      char **error_message ATTRIBUTE_UNUSED)
 {
   unsigned long insn, vallo, allignment;
-  int           val;
+  int          val;
 
   /* HACK: I think this first condition is necessary when producing
      relocatable output.  After the end of HACK, the code is identical
@@ -190,7 +190,7 @@ elf32_dlx_relocate26 (bfd *abfd,
 
   if (skip_dlx_elf_hi16_reloc)
     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
-                                 input_section, output_bfd, error_message);
+                                input_section, output_bfd, error_message);
 
   /* Check undefined section and undefined symbols.  */
   if (bfd_is_und_section (symbol->section)
@@ -200,9 +200,9 @@ elf32_dlx_relocate26 (bfd *abfd,
   /* Can not support a long jump to sections other then .text   */
   if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
     {
-      fprintf (stderr,
-              "BFD Link Error: jump (PC rel26) to section (%s) not supported\n",
-              symbol->section->output_section->name);
+      _bfd_error_handler
+       (_("jump (PC rel26) to section (%s) not supported"),
+        symbol->section->output_section->name);
       return bfd_reloc_undefined;
     }
 
@@ -228,7 +228,7 @@ elf32_dlx_relocate26 (bfd *abfd,
 
   insn  = (insn & 0xFC000000) | (val & 0x03FFFFFF);
   bfd_put_32 (abfd, insn,
-              (bfd_byte *) data + reloc_entry->address);
+             (bfd_byte *) data + reloc_entry->address);
 
   return bfd_reloc_ok;
 }
@@ -236,67 +236,67 @@ elf32_dlx_relocate26 (bfd *abfd,
 static reloc_howto_type dlx_elf_howto_table[]=
 {
   /* No relocation.  */
-  HOWTO (R_DLX_NONE,            /* Type. */
-        0,                     /* Rightshift.  */
-        0,                     /* size (0 = byte, 1 = short, 2 = long).  */
-        0,                     /* Bitsize.  */
-        FALSE,                 /* PC_relative.  */
-        0,                     /* Bitpos.  */
+  HOWTO (R_DLX_NONE,           /* Type. */
+        0,                     /* Rightshift.  */
+        3,                     /* size (0 = byte, 1 = short, 2 = long).  */
+        0,                     /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
         complain_overflow_dont,/* Complain_on_overflow.  */
         bfd_elf_generic_reloc, /* Special_function.  */
-        "R_DLX_NONE",          /* Name.  */
-        FALSE,                 /* Partial_inplace.  */
-        0,                     /* Src_mask.  */
-        0,                     /* Dst_mask.  */
-        FALSE),                /* PCrel_offset.  */
+        "R_DLX_NONE",          /* Name.  */
+        FALSE,                 /* Partial_inplace.  */
+        0,                     /* Src_mask.  */
+        0,                     /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
 
   /* 8 bit relocation.  */
-  HOWTO (R_DLX_RELOC_8,         /* Type. */
-        0,                     /* Rightshift.  */
-        0,                     /* Size (0 = byte, 1 = short, 2 = long).  */
-        8,                     /* Bitsize.  */
-        FALSE,                 /* PC_relative.  */
-        0,                     /* Bitpos.  */
+  HOWTO (R_DLX_RELOC_8,                /* Type. */
+        0,                     /* Rightshift.  */
+        0,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        8,                     /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
         complain_overflow_dont,/* Complain_on_overflow.  */
         bfd_elf_generic_reloc, /* Special_function.  */
-        "R_DLX_RELOC_8",       /* Name.  */
-        TRUE,                  /* Partial_inplace.  */
-        0xff,                  /* Src_mask.  */
-        0xff,                  /* Dst_mask.  */
-        FALSE),                /* PCrel_offset.  */
+        "R_DLX_RELOC_8",       /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xff,                  /* Src_mask.  */
+        0xff,                  /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
 
   /* 16 bit relocation.  */
-  HOWTO (R_DLX_RELOC_16,        /* Type. */
-        0,                     /* Rightshift.  */
-        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
-        16,                    /* Bitsize.  */
-        FALSE,                 /* PC_relative.  */
-        0,                     /* Bitpos.  */
+  HOWTO (R_DLX_RELOC_16,       /* Type. */
+        0,                     /* Rightshift.  */
+        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        16,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
         complain_overflow_dont,/* Complain_on_overflow.  */
         bfd_elf_generic_reloc, /* Special_function.  */
-        "R_DLX_RELOC_16",      /* Name.  */
-        TRUE,                  /* Partial_inplace.  */
-        0xffff,                /* Src_mask.  */
-        0xffff,                /* Dst_mask.  */
-        FALSE),                /* PCrel_offset.  */
+        "R_DLX_RELOC_16",      /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffff,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
 
   /* 32 bit relocation.  */
-  HOWTO (R_DLX_RELOC_32,        /* Type. */
-        0,                     /* Rightshift.  */
-        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
-        32,                    /* Bitsize.  */
-        FALSE,                 /* PC_relative.  */
-        0,                     /* Bitpos.  */
+  HOWTO (R_DLX_RELOC_32,       /* Type. */
+        0,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        32,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
         complain_overflow_dont,/* Complain_on_overflow.  */
         bfd_elf_generic_reloc, /* Special_function.  */
-        "R_DLX_RELOC_32",      /* Name.  */
-        TRUE,                  /* Partial_inplace.  */
-        0xffffffff,            /* Src_mask.  */
-        0xffffffff,            /* Dst_mask.  */
-        FALSE),                /* PCrel_offset.  */
+        "R_DLX_RELOC_32",      /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffffffff,            /* Src_mask.  */
+        0xffffffff,            /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
 
   /* GNU extension to record C++ vtable hierarchy.  */
-  HOWTO (R_DLX_GNU_VTINHERIT,   /* Type. */
+  HOWTO (R_DLX_GNU_VTINHERIT,  /* Type. */
         0,                     /* Rightshift.  */
         2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
         0,                     /* Bitsize.  */
@@ -311,7 +311,7 @@ static reloc_howto_type dlx_elf_howto_table[]=
         FALSE),                /* PCrel_offset.  */
 
   /* GNU extension to record C++ vtable member usage.  */
-  HOWTO (R_DLX_GNU_VTENTRY,     /* Type. */
+  HOWTO (R_DLX_GNU_VTENTRY,    /* Type. */
         0,                     /* Rightshift.  */
         2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
         0,                     /* Bitsize.  */
@@ -320,75 +320,75 @@ static reloc_howto_type dlx_elf_howto_table[]=
         complain_overflow_dont,/* Complain_on_overflow.  */
         _bfd_elf_rel_vtable_reloc_fn,/* Special_function.  */
         "R_DLX_GNU_VTENTRY",   /* Name.  */
-        FALSE,                 /* Partial_inplace.  */
+        FALSE,                 /* Partial_inplace.  */
         0,                     /* Src_mask.  */
         0,                     /* Dst_mask.  */
-        FALSE)                 /* PCrel_offset.  */
+        FALSE)                 /* PCrel_offset.  */
 };
 
 /* 16 bit offset for pc-relative branches.  */
 static reloc_howto_type elf_dlx_gnu_rel16_s2 =
-  HOWTO (R_DLX_RELOC_16_PCREL,  /* Type. */
-        0,                     /* Rightshift.  */
-        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
-        16,                    /* Bitsize.  */
-        TRUE,                  /* PC_relative.  */
-        0,                     /* Bitpos.  */
+  HOWTO (R_DLX_RELOC_16_PCREL, /* Type. */
+        0,                     /* Rightshift.  */
+        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        16,                    /* Bitsize.  */
+        TRUE,                  /* PC_relative.  */
+        0,                     /* Bitpos.  */
         complain_overflow_signed, /* Complain_on_overflow.  */
-        elf32_dlx_relocate16,  /* Special_function.  */
+        elf32_dlx_relocate16,  /* Special_function.  */
         "R_DLX_RELOC_16_PCREL",/* Name.  */
-        TRUE,                  /* Partial_inplace.  */
-        0xffff,                /* Src_mask.  */
-        0xffff,                /* Dst_mask.  */
-        TRUE);                 /* PCrel_offset.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffff,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        TRUE);                 /* PCrel_offset.  */
 
 /* 26 bit offset for pc-relative branches.  */
 static reloc_howto_type elf_dlx_gnu_rel26_s2 =
-  HOWTO (R_DLX_RELOC_26_PCREL,  /* Type. */
-        0,                     /* Rightshift.  */
-        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
-        26,                    /* Bitsize.  */
-        TRUE,                  /* PC_relative.  */
-        0,                     /* Bitpos.  */
+  HOWTO (R_DLX_RELOC_26_PCREL, /* Type. */
+        0,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        26,                    /* Bitsize.  */
+        TRUE,                  /* PC_relative.  */
+        0,                     /* Bitpos.  */
         complain_overflow_dont,/* Complain_on_overflow.  */
-        elf32_dlx_relocate26,  /* Special_function.  */
+        elf32_dlx_relocate26,  /* Special_function.  */
         "R_DLX_RELOC_26_PCREL",/* Name.  */
-        TRUE,                  /* Partial_inplace.  */
-        0xffff,                /* Src_mask.  */
-        0xffff,                /* Dst_mask.  */
-        TRUE);                 /* PCrel_offset.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffff,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        TRUE);                 /* PCrel_offset.  */
 
 /* High 16 bits of symbol value.  */
 static reloc_howto_type elf_dlx_reloc_16_hi =
-  HOWTO (R_DLX_RELOC_16_HI,     /* Type. */
-        16,                    /* Rightshift.  */
-        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
-        32,                    /* Bitsize.  */
-        FALSE,                 /* PC_relative.  */
-        0,                     /* Bitpos.  */
+  HOWTO (R_DLX_RELOC_16_HI,    /* Type. */
+        16,                    /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        32,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
         complain_overflow_dont,/* Complain_on_overflow.  */
         _bfd_dlx_elf_hi16_reloc,/* Special_function.  */
-        "R_DLX_RELOC_16_HI",   /* Name.  */
-        TRUE,                  /* Partial_inplace.  */
-        0xFFFF,                /* Src_mask.  */
-        0xffff,                /* Dst_mask.  */
-        FALSE);                /* PCrel_offset.  */
+        "R_DLX_RELOC_16_HI",   /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xFFFF,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        FALSE);                /* PCrel_offset.  */
 
   /* Low 16 bits of symbol value.  */
 static reloc_howto_type elf_dlx_reloc_16_lo =
-  HOWTO (R_DLX_RELOC_16_LO,     /* Type. */
-        0,                     /* Rightshift.  */
-        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
-        16,                    /* Bitsize.  */
-        FALSE,                 /* PC_relative.  */
-        0,                     /* Bitpos.  */
+  HOWTO (R_DLX_RELOC_16_LO,    /* Type. */
+        0,                     /* Rightshift.  */
+        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        16,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
         complain_overflow_dont,/* Complain_on_overflow.  */
         bfd_elf_generic_reloc, /* Special_function.  */
-        "R_DLX_RELOC_16_LO",   /* Name.  */
-        TRUE,                  /* Partial_inplace.  */
-        0xffff,                /* Src_mask.  */
-        0xffff,                /* Dst_mask.  */
-        FALSE);                /* PCrel_offset.  */
+        "R_DLX_RELOC_16_LO",   /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffff,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        FALSE);                /* PCrel_offset.  */
 
 /* A mapping from BFD reloc types to DLX ELF reloc types.
    Stolen from elf32-mips.c.
@@ -406,11 +406,11 @@ struct elf_reloc_map
 
 static const struct elf_reloc_map dlx_reloc_map[] =
 {
-  { BFD_RELOC_NONE,           R_DLX_NONE },
-  { BFD_RELOC_16,             R_DLX_RELOC_16 },
-  { BFD_RELOC_32,             R_DLX_RELOC_32 },
+  { BFD_RELOC_NONE,          R_DLX_NONE },
+  { BFD_RELOC_16,            R_DLX_RELOC_16 },
+  { BFD_RELOC_32,            R_DLX_RELOC_32 },
   { BFD_RELOC_DLX_HI16_S,     R_DLX_RELOC_16_HI },
-  { BFD_RELOC_DLX_LO16,       R_DLX_RELOC_16_LO },
+  { BFD_RELOC_DLX_LO16,              R_DLX_RELOC_16_LO },
   { BFD_RELOC_VTABLE_INHERIT,  R_DLX_GNU_VTINHERIT },
   { BFD_RELOC_VTABLE_ENTRY,    R_DLX_GNU_VTENTRY }
 };
@@ -426,18 +426,15 @@ elf32_dlx_check_relocs (bfd *abfd,
                        const Elf_Internal_Rela *relocs)
 {
   Elf_Internal_Shdr *symtab_hdr;
-  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
+  struct elf_link_hash_entry **sym_hashes;
   const Elf_Internal_Rela *rel;
   const Elf_Internal_Rela *rel_end;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   sym_hashes = elf_sym_hashes (abfd);
-  sym_hashes_end = sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
-  if (!elf_bad_symtab (abfd))
-    sym_hashes_end -= symtab_hdr->sh_info;
 
   rel_end = relocs + sec->reloc_count;
   for (rel = relocs; rel < rel_end; rel++)
@@ -447,7 +444,7 @@ elf32_dlx_check_relocs (bfd *abfd,
 
       r_symndx = ELF32_R_SYM (rel->r_info);
       if (r_symndx < symtab_hdr->sh_info)
-        h = NULL;
+       h = NULL;
       else
        {
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
@@ -457,21 +454,21 @@ elf32_dlx_check_relocs (bfd *abfd,
        }
 
       switch (ELF32_R_TYPE (rel->r_info))
-        {
-        /* This relocation describes the C++ object vtable hierarchy.
-           Reconstruct it for later use during GC.  */
-        case R_DLX_GNU_VTINHERIT:
-          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
-            return FALSE;
-          break;
-
-        /* This relocation describes which C++ vtable entries are actually
-           used.  Record for later use during GC.  */
-        case R_DLX_GNU_VTENTRY:
-          if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
-            return FALSE;
-          break;
-        }
+       {
+       /* This relocation describes the C++ object vtable hierarchy.
+          Reconstruct it for later use during GC.  */
+       case R_DLX_GNU_VTINHERIT:
+         if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+           return FALSE;
+         break;
+
+       /* This relocation describes which C++ vtable entries are actually
+          used.  Record for later use during GC.  */
+       case R_DLX_GNU_VTENTRY:
+         if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+           return FALSE;
+         break;
+       }
     }
 
   return TRUE;
@@ -506,7 +503,32 @@ elf32_dlx_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 }
 
 static reloc_howto_type *
-dlx_rtype_to_howto (unsigned int r_type)
+elf32_dlx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0;
+       i < sizeof (dlx_elf_howto_table) / sizeof (dlx_elf_howto_table[0]);
+       i++)
+    if (dlx_elf_howto_table[i].name != NULL
+       && strcasecmp (dlx_elf_howto_table[i].name, r_name) == 0)
+      return &dlx_elf_howto_table[i];
+
+  if (strcasecmp (elf_dlx_gnu_rel16_s2.name, r_name) == 0)
+    return &elf_dlx_gnu_rel16_s2;
+  if (strcasecmp (elf_dlx_gnu_rel26_s2.name, r_name) == 0)
+    return &elf_dlx_gnu_rel26_s2;
+  if (strcasecmp (elf_dlx_reloc_16_hi.name, r_name) == 0)
+    return &elf_dlx_reloc_16_hi;
+  if (strcasecmp (elf_dlx_reloc_16_lo.name, r_name) == 0)
+    return &elf_dlx_reloc_16_lo;
+
+  return NULL;
+}
+
+static reloc_howto_type *
+dlx_rtype_to_howto (bfd *abfd, unsigned int r_type)
 {
   switch (r_type)
     {
@@ -519,35 +541,41 @@ dlx_rtype_to_howto (unsigned int r_type)
     case R_DLX_RELOC_16_LO:
       return & elf_dlx_reloc_16_lo;
     default:
-      BFD_ASSERT (r_type < (unsigned int) R_DLX_max);
+      if (r_type >= (unsigned int) R_DLX_max)
+       {
+         _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                             abfd, r_type);
+         bfd_set_error (bfd_error_bad_value);
+         return NULL;
+       }
       return & dlx_elf_howto_table[r_type];
     }
 }
 
-static void
+static bfd_boolean
 elf32_dlx_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED,
                         arelent * cache_ptr ATTRIBUTE_UNUSED,
                         Elf_Internal_Rela * dst ATTRIBUTE_UNUSED)
 {
-  abort ();
+  return FALSE;
 }
 
-static void
-elf32_dlx_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
+static bfd_boolean
+elf32_dlx_info_to_howto_rel (bfd *abfd,
                             arelent *cache_ptr,
                             Elf_Internal_Rela *dst)
 {
   unsigned int r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
-  cache_ptr->howto = dlx_rtype_to_howto (r_type);
-  return;
+  cache_ptr->howto = dlx_rtype_to_howto (abfd, r_type);
+  return cache_ptr->howto != NULL;
 }
 
-#define TARGET_BIG_SYM          bfd_elf32_dlx_big_vec
-#define TARGET_BIG_NAME         "elf32-dlx"
-#define ELF_ARCH                bfd_arch_dlx
-#define ELF_MACHINE_CODE        EM_DLX
-#define ELF_MAXPAGESIZE         1 /* FIXME: This number is wrong,  It should be the page size in bytes.  */
+#define TARGET_BIG_SYM         dlx_elf32_be_vec
+#define TARGET_BIG_NAME                "elf32-dlx"
+#define ELF_ARCH               bfd_arch_dlx
+#define ELF_MACHINE_CODE       EM_DLX
+#define ELF_MAXPAGESIZE                1 /* FIXME: This number is wrong,  It should be the page size in bytes.  */
 
 #include "elf32-target.h"