Fixed xgettext invocation in .Sanitize files
[binutils-gdb.git] / bfd / som.c
index 03b487e0aad6cd390a2d577e05810181e5cac418..2a74377c637ca800e6b0d5b9a630ccb30cf2d5c2 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -1,5 +1,5 @@
 /* bfd back-end for HP PA-RISC SOM objects.
-   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995
+   Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 1997
    Free Software Foundation, Inc.
 
    Contributed by the Center for Software Science at the
@@ -174,7 +174,7 @@ static boolean som_bfd_copy_private_section_data PARAMS ((bfd *, asection *,
 static boolean som_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *));
 #define som_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
 #define som_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
-static boolean som_bfd_is_local_label PARAMS ((bfd *, asymbol *));
+static boolean som_bfd_is_local_label_name PARAMS ((bfd *, const char *));
 static boolean som_set_section_contents PARAMS ((bfd *, sec_ptr, PTR,
                                                 file_ptr, bfd_size_type));
 static boolean som_get_section_contents PARAMS ((bfd *, sec_ptr, PTR,
@@ -430,8 +430,9 @@ static const struct fixup_format som_fixup_formats[256] =
   1,    "Lb4*=Mb1+L*=",        /* 0x2b */
   2,    "Lb4*=Md1+4*=",        /* 0x2c */
   3,    "Ld1+=Me1+=",  /* 0x2d */
-  /* R_RESERVED */
+  /* R_SHORT_PCREL_MODE */
   0,           "",             /* 0x2e */
+  /* R_LONG_PCREL_MODE */
   0,           "",             /* 0x2f */
   /* R_PCREL_CALL */
   0,    "L4=RD=Sb=",   /* 0x30 */
@@ -637,14 +638,21 @@ static const struct fixup_format som_fixup_formats[256] =
   1,    "P",           /* 0xd4 */
   2,    "P",           /* 0xd5 */
   3,    "P",           /* 0xd6 */
-  /* R_RESERVED */
+  /* R_SEC_STMT */
   0,   "",             /* 0xd7 */
+  /* R_N0SEL */
   0,   "",             /* 0xd8 */
+  /* R_N1SEL */
   0,   "",             /* 0xd9 */
+  /* R_LINETAB */
   0,   "",             /* 0xda */
+  /* R_LINETAB_ESC */
   0,   "",             /* 0xdb */
+  /* R_LTP_OVERRIDE */
   0,   "",             /* 0xdc */
+  /* R_COMMENT */
   0,   "",             /* 0xdd */
+  /* R_RESERVED */
   0,   "",             /* 0xde */
   0,   "",             /* 0xdf */
   0,   "",             /* 0xe0 */
@@ -719,7 +727,7 @@ static const int comp3_opcodes[] =
   -1
 };
 
-/* These apparently are not in older versions of hpux reloc.h.  */
+/* These apparently are not in older versions of hpux reloc.h (hpux7).  */
 #ifndef R_DLT_REL
 #define R_DLT_REL 0x78
 #endif
@@ -732,6 +740,39 @@ static const int comp3_opcodes[] =
 #define R_SEC_STMT 0xd7
 #endif
 
+/* And these first appeared in hpux10.  */
+#ifndef R_SHORT_PCREL_MODE
+#define R_SHORT_PCREL_MODE 0x3e
+#endif
+
+#ifndef R_LONG_PCREL_MODE
+#define R_LONG_PCREL_MODE 0x3f
+#endif
+
+#ifndef R_N0SEL
+#define R_N0SEL 0xd8
+#endif
+
+#ifndef R_N1SEL
+#define R_N1SEL 0xd9
+#endif
+
+#ifndef R_LINETAB
+#define R_LINETAB 0xda
+#endif
+
+#ifndef R_LINETAB_ESC
+#define R_LINETAB_ESC 0xdb
+#endif
+
+#ifndef R_LTP_OVERRIDE
+#define R_LTP_OVERRIDE 0xdc
+#endif
+
+#ifndef R_COMMENT
+#define R_COMMENT 0xdd
+#endif
+
 static reloc_howto_type som_hppa_howto_table[] =
 {
   {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"},
@@ -796,8 +837,8 @@ static reloc_howto_type som_hppa_howto_table[] =
   {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"},
   {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"},
   {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"},
-  {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
-  {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
+  {R_SHORT_PCREL_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_SHORT_PCREL_MODE"},
+  {R_LONG_PCREL_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LONG_PCREL_MODE"},
   {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"},
   {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"},
   {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"},
@@ -950,12 +991,12 @@ static reloc_howto_type som_hppa_howto_table[] =
   {R_PREV_FIXUP, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PREV_FIXUP"},
   {R_PREV_FIXUP, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PREV_FIXUP"},
   {R_SEC_STMT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_SEC_STMT"},
-  {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
-  {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
-  {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
-  {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
-  {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
-  {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
+  {R_N0SEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_N0SEL"},
+  {R_N1SEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_N1SEL"},
+  {R_LINETAB, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LINETAB"},
+  {R_LINETAB_ESC, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LINETAB_ESC"},
+  {R_LTP_OVERRIDE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LTP_OVERRIDE"},
+  {R_COMMENT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_COMMENT"},
   {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
   {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
   {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"},
@@ -1397,22 +1438,20 @@ hppa_som_reloc (abfd, reloc_entry, symbol_in, data,
    and a field selector, return one or more appropriate SOM relocations.  */
 
 int **
-hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
+hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff, sym)
      bfd *abfd;
      int base_type;
      int format;
      enum hppa_reloc_field_selector_type_alt field;
      int sym_diff;
+     asymbol *sym;
 {
   int *final_type, **final_types;
 
-  final_types = (int **) bfd_alloc_by_size_t (abfd, sizeof (int *) * 6);
-  final_type = (int *) bfd_alloc_by_size_t (abfd, sizeof (int));
+  final_types = (int **) bfd_alloc (abfd, sizeof (int *) * 6);
+  final_type = (int *) bfd_alloc (abfd, sizeof (int));
   if (!final_types || !final_type)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return NULL;
-    }
+    return NULL;
 
   /* The field selector may require additional relocations to be 
      generated.  It's impossible to know at this moment if additional
@@ -1434,12 +1473,9 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
       case e_tsel:
       case e_ltsel:
       case e_rtsel:
-       final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int));
+       final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
        if (!final_types[0])
-         {
-           bfd_set_error (bfd_error_no_memory);
-           return NULL;
-         }
+         return NULL;
        if (field == e_tsel)
          *final_types[0] = R_FSEL;
        else if (field == e_ltsel)
@@ -1453,12 +1489,9 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
 
       case e_lssel:
       case e_rssel:
-       final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int));
+       final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
        if (!final_types[0])
-         {
-           bfd_set_error (bfd_error_no_memory);
-           return NULL;
-         }
+         return NULL;
        *final_types[0] = R_S_MODE;
        final_types[1] = final_type;
        final_types[2] = NULL;
@@ -1467,12 +1500,9 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
 
       case e_lsel:
       case e_rsel:
-       final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int));
+       final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
        if (!final_types[0])
-         {
-           bfd_set_error (bfd_error_no_memory);
-           return NULL;
-         }
+         return NULL;
        *final_types[0] = R_N_MODE;
        final_types[1] = final_type;
        final_types[2] = NULL;
@@ -1481,12 +1511,9 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
 
       case e_ldsel:
       case e_rdsel:
-       final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int));
+       final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
        if (!final_types[0])
-         {
-           bfd_set_error (bfd_error_no_memory);
-           return NULL;
-         }
+         return NULL;
        *final_types[0] = R_D_MODE;
        final_types[1] = final_type;
        final_types[2] = NULL;
@@ -1495,17 +1522,42 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
 
       case e_lrsel:
       case e_rrsel:
-       final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int));
+       final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
        if (!final_types[0])
-         {
-           bfd_set_error (bfd_error_no_memory);
-           return NULL;
-         }
+         return NULL;
        *final_types[0] = R_R_MODE;
        final_types[1] = final_type;
        final_types[2] = NULL;
        *final_type = base_type;
        break;
+
+      case e_nsel:
+       final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
+       if (!final_types[0])
+         return NULL;
+       *final_types[0] = R_N1SEL;
+       final_types[1] = final_type;
+       final_types[2] = NULL;
+       *final_type = base_type;
+       break;
+
+      case e_nlsel:
+      case e_nlrsel:
+       final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
+       if (!final_types[0])
+         return NULL;
+       *final_types[0] = R_N0SEL;
+       final_types[1] = (int *) bfd_alloc (abfd, sizeof (int));
+       if (!final_types[1])
+         return NULL;
+       if (field == e_nlsel)
+         *final_types[1] = R_N_MODE;
+       else
+         *final_types[1] = R_R_MODE;
+       final_types[2] = final_type;
+       final_types[3] = NULL;
+       *final_type = base_type;
+       break;
     }
   
   switch (base_type)
@@ -1514,15 +1566,12 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
       /* The difference of two symbols needs *very* special handling.  */
       if (sym_diff)
        {
-         final_types[0] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int));
-         final_types[1] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int));
-         final_types[2] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int));
-         final_types[3] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int));
+         final_types[0] = (int *)bfd_alloc (abfd, sizeof (int));
+         final_types[1] = (int *)bfd_alloc (abfd, sizeof (int));
+         final_types[2] = (int *)bfd_alloc (abfd, sizeof (int));
+         final_types[3] = (int *)bfd_alloc (abfd, sizeof (int));
          if (!final_types[0] || !final_types[1] || !final_types[2])
-          {
-            bfd_set_error (bfd_error_no_memory);
             return NULL;
-          }
          if (field == e_fsel)
            *final_types[0] = R_FSEL;
          else if (field == e_rsel)
@@ -1533,7 +1582,10 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
          *final_types[2] = R_COMP2;
          *final_types[3] = R_COMP1;
          final_types[4] = final_type;
-         *final_types[4] = R_CODE_EXPR;
+         if (format == 32)
+           *final_types[4] = R_DATA_EXPR;
+         else
+           *final_types[4] = R_CODE_EXPR;
          final_types[5] = NULL;
          break;
        }
@@ -1556,10 +1608,33 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
        *final_type = R_DLT_REL;
       /* A relocation in the data space is always a full 32bits.  */
       else if (format == 32)
-       *final_type = R_DATA_ONE_SYMBOL;
+       {
+         *final_type = R_DATA_ONE_SYMBOL;
+
+         /* If there's no SOM symbol type associated with this BFD
+            symbol, then set the symbol type to ST_DATA.
+
+            Only do this if the type is going to default later when
+            we write the object file.
 
+            This is done so that the linker never encounters an
+            R_DATA_ONE_SYMBOL reloc involving an ST_CODE symbol.
+
+            This allows the compiler to generate exception handling
+            tables.
+
+            Note that one day we may need to also emit BEGIN_BRTAB and
+            END_BRTAB to prevent the linker from optimizing away insns
+            in exception handling regions.  */
+         if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_UNKNOWN
+             && (sym->flags & BSF_SECTION_SYM) == 0
+             && (sym->flags & BSF_FUNCTION) == 0
+             && ! bfd_is_com_section (sym->section))
+           som_symbol_data (sym)->som_type = SYMBOL_TYPE_DATA;
+       }
       break;
 
+
     case R_HPPA_GOTOFF:
       /* More PLABEL special cases.  */
       if (field == e_psel
@@ -1572,15 +1647,12 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
       /* The difference of two symbols needs *very* special handling.  */
       if (sym_diff)
        {
-         final_types[0] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int));
-         final_types[1] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int));
-         final_types[2] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int));
-         final_types[3] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int));
+         final_types[0] = (int *)bfd_alloc (abfd, sizeof (int));
+         final_types[1] = (int *)bfd_alloc (abfd, sizeof (int));
+         final_types[2] = (int *)bfd_alloc (abfd, sizeof (int));
+         final_types[3] = (int *)bfd_alloc (abfd, sizeof (int));
          if (!final_types[0] || !final_types[1] || !final_types[2])
-          {
-            bfd_set_error (bfd_error_no_memory);
             return NULL;
-          }
          if (field == e_fsel)
            *final_types[0] = R_FSEL;
          else if (field == e_rsel)
@@ -1591,7 +1663,10 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff)
          *final_types[2] = R_COMP2;
          *final_types[3] = R_COMP1;
          final_types[4] = final_type;
-         *final_types[4] = R_CODE_EXPR;
+         if (format == 32)
+           *final_types[4] = R_DATA_EXPR;
+         else
+           *final_types[4] = R_CODE_EXPR;
          final_types[5] = NULL;
          break;
        }
@@ -1642,7 +1717,7 @@ som_object_setup (abfd, file_hdrp, aux_hdrp)
     return 0;
 
   /* Set BFD flags based on what information is available in the SOM.  */
-  abfd->flags = NO_FLAGS;
+  abfd->flags = BFD_NO_FLAGS;
   if (file_hdrp->symbol_total)
     abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS;
 
@@ -1677,10 +1752,7 @@ som_object_setup (abfd, file_hdrp, aux_hdrp)
   obj_som_exec_data (abfd) = (struct som_exec_data *)
     bfd_zalloc (abfd, sizeof (struct som_exec_data ));
   if (obj_som_exec_data (abfd) == NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return NULL;
-    }
+    return NULL;
 
   /* The braindamaged OSF1 linker switched exec_flags and exec_entry!
 
@@ -1751,12 +1823,9 @@ setup_sections (abfd, file_hdr)
 
   /* First, read in space names */
 
-  space_strings = malloc (file_hdr->space_strings_size);
+  space_strings = bfd_malloc (file_hdr->space_strings_size);
   if (!space_strings && file_hdr->space_strings_size != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
 
   if (bfd_seek (abfd, file_hdr->space_strings_location, SEEK_SET) < 0)
     goto error_return;
@@ -1802,6 +1871,10 @@ setup_sections (abfd, file_hdr)
                                          space.space_number) == false)
        goto error_return;
 
+      /* If the space has no subspaces, then we're done.  */
+      if (space.subspace_quantity == 0)
+       continue;
+
       /* Now, read in the first subspace for this space */
       if (bfd_seek (abfd, file_hdr->subspace_location
                    + space.subspace_index * sizeof subspace,
@@ -1947,23 +2020,29 @@ setup_sections (abfd, file_hdr)
            goto error_return;
        }
 
-      /* Yow! there is no subspace within the space which actually 
-         has initialized information in it; this should never happen
-         as far as I know.  */
+      /* This can happen for a .o which defines symbols in otherwise
+         empty subspaces.  */
       if (!save_subspace.file_loc_init_value)
-       goto error_return;
-
-      /* Setup the sizes for the space section based upon the info in the
-         last subspace of the space.  */
-      space_asect->_cooked_size = save_subspace.subspace_start
-       - space_asect->vma + save_subspace.subspace_length;
-      space_asect->_raw_size = save_subspace.file_loc_init_value
-       - space_asect->filepos + save_subspace.initialization_length;
+       {
+         space_asect->_cooked_size = 0;
+         space_asect->_raw_size = 0;
+       }
+      else
+       {
+         /* Setup the sizes for the space section based upon the info in the
+            last subspace of the space.  */
+         space_asect->_cooked_size = (save_subspace.subspace_start
+                                      - space_asect->vma
+                                      + save_subspace.subspace_length);
+         space_asect->_raw_size = (save_subspace.file_loc_init_value
+                                   - space_asect->filepos
+                                   + save_subspace.initialization_length);
+       }
     }
   /* Now that we've read in all the subspace records, we need to assign
      a target index to each subspace.  */
-  subspace_sections = (asection **) malloc (total_subspaces
-                                           * sizeof (asection *));
+  subspace_sections = (asection **) bfd_malloc (total_subspaces
+                                               * sizeof (asection *));
   if (subspace_sections == NULL)
     goto error_return;
 
@@ -2088,10 +2167,7 @@ som_mkobject (abfd)
   abfd->tdata.som_data = (struct som_data_struct *)
     bfd_zalloc (abfd, sizeof (struct som_data_struct));
   if (abfd->tdata.som_data == NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return false;
-    }
+    return false;
   return true;
 }
 
@@ -2109,11 +2185,7 @@ som_prep_headers (abfd)
   /* Make and attach a file header to the BFD.  */
   file_hdr = (struct header *) bfd_zalloc (abfd, sizeof (struct header));
   if (file_hdr == NULL)
-
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return false;
-    }
+    return false;
   obj_som_file_hdr (abfd) = file_hdr;
 
   if (abfd->flags & (EXEC_P | DYNAMIC))
@@ -2123,10 +2195,7 @@ som_prep_headers (abfd)
       obj_som_exec_hdr (abfd) = (struct som_exec_auxhdr *)
        bfd_zalloc (abfd, sizeof (struct som_exec_auxhdr));
       if (obj_som_exec_hdr (abfd) == NULL)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         return false;
-       }
+       return false;
 
       if (abfd->flags & D_PAGED)
        file_hdr->a_magic = DEMAND_MAGIC;
@@ -2173,10 +2242,7 @@ som_prep_headers (abfd)
            = (struct space_dictionary_record *)
              bfd_zalloc (abfd, sizeof (struct space_dictionary_record));
          if (som_section_data (section)->space_dict == NULL)
-           {
-             bfd_set_error (bfd_error_no_memory);
-             return false;
-           }
+           return false;
          /* Set space attributes.  Note most attributes of SOM spaces
             are set based on the subspaces it contains.  */
          som_section_data (section)->space_dict->loader_fix_index = -1;
@@ -2199,10 +2265,7 @@ som_prep_headers (abfd)
            = (struct subspace_dictionary_record *)
              bfd_zalloc (abfd, sizeof (struct subspace_dictionary_record));
          if (som_section_data (section)->subspace_dict == NULL)
-           {
-             bfd_set_error (bfd_error_no_memory);
-             return false;
-           }
+           return false;
 
          /* Set subspace attributes.  Basic stuff is done here, additional
             attributes are filled in later as more information becomes
@@ -2604,8 +2667,6 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep)
                 later relocation.  */
              switch (bfd_reloc->howto->type)
                {
-               /* This only needs to handle relocations that may be
-                  made by hppa_som_gen_reloc.  */
                case R_ENTRY:
                case R_ALT_ENTRY:
                case R_EXIT:
@@ -2618,6 +2679,12 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep)
                case R_RSEL:
                case R_COMP1:
                case R_COMP2:
+               case R_BEGIN_BRTAB:
+               case R_END_BRTAB:
+               case R_BEGIN_TRY:
+               case R_END_TRY:
+               case R_N0SEL:
+               case R_N1SEL:
                  reloc_offset = bfd_reloc->address;
                  break;
 
@@ -2747,11 +2814,39 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep)
                case R_FSEL:
                case R_LSEL:
                case R_RSEL:
+               case R_BEGIN_BRTAB:
+               case R_END_BRTAB:
+               case R_BEGIN_TRY:
+               case R_N0SEL:
+               case R_N1SEL:
                  bfd_put_8 (abfd, bfd_reloc->howto->type, p);
                  subspace_reloc_size += 1;
                  p += 1;
                  break;
 
+               case R_END_TRY:
+                 /* The end of a exception handling region.  The reloc's
+                    addend contains the offset of the exception handling
+                    code.  */
+                 if (bfd_reloc->addend == 0)
+                   bfd_put_8 (abfd, bfd_reloc->howto->type, p);
+                 else if (bfd_reloc->addend < 1024)
+                   {
+                     bfd_put_8 (abfd, bfd_reloc->howto->type + 1, p);
+                     bfd_put_8 (abfd, bfd_reloc->addend / 4, p + 1);
+                     p = try_prev_fixup (abfd, &subspace_reloc_size,
+                                         p, 2, reloc_queue);
+                   }
+                 else
+                   {
+                     bfd_put_8 (abfd, bfd_reloc->howto->type + 2, p);
+                     bfd_put_8 (abfd, (bfd_reloc->addend / 4) >> 16, p + 1);
+                     bfd_put_16 (abfd, bfd_reloc->addend / 4, p + 2);
+                     p = try_prev_fixup (abfd, &subspace_reloc_size,
+                                         p, 4, reloc_queue);
+                   }
+                 break;
+                     
                case R_COMP1:
                  /* The only time we generate R_COMP1, R_COMP2 and 
                     R_CODE_EXPR relocs is for the difference of two
@@ -2775,6 +2870,7 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep)
                  break;
 
                case R_CODE_EXPR:
+               case R_DATA_EXPR:
                  /* The only time we generate R_COMP1, R_COMP2 and 
                     R_CODE_EXPR relocs is for the difference of two
                     symbols.  Hence we can cheat here.  */
@@ -2983,9 +3079,8 @@ som_begin_writing (abfd)
   unsigned long current_offset = 0;
   int strings_size = 0;
   unsigned int total_reloc_size = 0;
-  unsigned long num_spaces, num_subspaces, num_syms, i;
+  unsigned long num_spaces, num_subspaces, i;
   asection *section;
-  asymbol **syms = bfd_get_outsymbols (abfd);
   unsigned int total_subspaces = 0;
   struct som_exec_auxhdr *exec_header = NULL;
 
@@ -3117,37 +3212,6 @@ som_begin_writing (abfd)
   obj_som_file_hdr (abfd)->space_strings_size = strings_size;
   current_offset += strings_size;
 
-  /* Next is the symbol table.  These are fixed length records.
-
-     Count the number of symbols to determine how much room is needed
-     in the object file for the symbol table.
-
-     The names of the symbols are stored in a separate string table,
-     and the index for each symbol name into the string table is computed
-     below.  Therefore, it is not possible to write the symobl table
-     at this time.  */
-  num_syms = bfd_get_symcount (abfd);
-  obj_som_file_hdr (abfd)->symbol_location = current_offset;
-  obj_som_file_hdr (abfd)->symbol_total = num_syms;
-  current_offset += num_syms * sizeof (struct symbol_dictionary_record);
-
-  /* Next are the symbol strings.
-     Align them to a word boundary.  */
-  if (current_offset % 4)
-    current_offset += (4 - (current_offset % 4));
-  obj_som_file_hdr (abfd)->symbol_strings_location = current_offset;
-
-  /* Scribble out the symbol strings.  */
-  if (som_write_symbol_strings (abfd, current_offset, syms,
-                               num_syms, &strings_size)
-      == false)
-    return false;
-
-  /* Record total string table size in header and update the
-     current offset.  */
-  obj_som_file_hdr (abfd)->symbol_strings_size = strings_size;
-  current_offset += strings_size;
-
   /* Next is the compiler records.  We do not use these.  */
   obj_som_file_hdr (abfd)->compiler_location = current_offset;
   obj_som_file_hdr (abfd)->compiler_total = 0;
@@ -3358,20 +3422,60 @@ som_finish_writing (abfd)
      bfd *abfd;
 {
   int num_spaces = som_count_spaces (abfd);
-  int i;
+  asymbol **syms = bfd_get_outsymbols (abfd);
+  int i, num_syms, strings_size;
   int subspace_index = 0;
   file_ptr location;
   asection *section;
   unsigned long current_offset;
   unsigned int total_reloc_size;
 
+  /* Next is the symbol table.  These are fixed length records.
+
+     Count the number of symbols to determine how much room is needed
+     in the object file for the symbol table.
+
+     The names of the symbols are stored in a separate string table,
+     and the index for each symbol name into the string table is computed
+     below.  Therefore, it is not possible to write the symbol table
+     at this time. 
+
+     These used to be output before the subspace contents, but they
+     were moved here to work around a stupid bug in the hpux linker
+     (fixed in hpux10).  */
+  current_offset = obj_som_file_hdr (abfd)->som_length;
+
+  /* Make sure we're on a word boundary.  */
+  if (current_offset % 4)
+    current_offset += (4 - (current_offset % 4)); 
+
+  num_syms = bfd_get_symcount (abfd);
+  obj_som_file_hdr (abfd)->symbol_location = current_offset;
+  obj_som_file_hdr (abfd)->symbol_total = num_syms;
+  current_offset += num_syms * sizeof (struct symbol_dictionary_record);
+
+  /* Next are the symbol strings.
+     Align them to a word boundary.  */
+  if (current_offset % 4)
+    current_offset += (4 - (current_offset % 4));
+  obj_som_file_hdr (abfd)->symbol_strings_location = current_offset;
+
+  /* Scribble out the symbol strings.  */
+  if (som_write_symbol_strings (abfd, current_offset, syms,
+                               num_syms, &strings_size)
+      == false)
+    return false;
+
+  /* Record total string table size in header and update the
+     current offset.  */
+  obj_som_file_hdr (abfd)->symbol_strings_size = strings_size;
+  current_offset += strings_size;
+
   /* Do prep work before handling fixups.  */
   som_prep_for_fixups (abfd,
                       bfd_get_outsymbols (abfd),
                       bfd_get_symcount (abfd));
 
-  current_offset = obj_som_file_hdr (abfd)->som_length;
-
   /* At the end of the file is the fixup stream which starts on a
      word boundary.  */
   if (current_offset % 4)
@@ -3386,7 +3490,8 @@ som_finish_writing (abfd)
   /* Record the total size of the fixup stream in the file header.  */
   obj_som_file_hdr (abfd)->fixup_request_total = total_reloc_size;
 
-  obj_som_file_hdr (abfd)->som_length += total_reloc_size;
+  /* Done.  Store the total size of the SOM.  */
+  obj_som_file_hdr (abfd)->som_length = current_offset + total_reloc_size;
  
   /* Now that the symbol table information is complete, build and
      write the symbol table.  */
@@ -3661,9 +3766,8 @@ som_bfd_derive_misc_symbol_info (abfd, sym, info)
          info->arg_reloc = som_symbol_data (sym)->tc_data.hppa_arg_reloc;
        }
 
-      /* If the type is unknown at this point, it should be ST_DATA or
-        ST_CODE (function/ST_ENTRY symbols were handled  as special
-        cases above). */
+      /* For unknown symbols set the symbol's type based on the symbol's
+        section (ST_DATA for DATA sections, ST_CODE for CODE sections).  */
       else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_UNKNOWN)
        {
          if (sym->section->flags & SEC_CODE)
@@ -3671,6 +3775,9 @@ som_bfd_derive_misc_symbol_info (abfd, sym, info)
          else
            info->symbol_type = ST_DATA;
        }
+  
+      else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_UNKNOWN)
+       info->symbol_type = ST_DATA;
 
       /* From now on it's a very simple mapping.  */
       else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_ABSOLUTE)
@@ -3734,12 +3841,9 @@ som_build_and_write_symbol_table (abfd)
   /* Compute total symbol table size and allocate a chunk of memory
      to hold the symbol table as we build it.  */
   symtab_size = num_syms * sizeof (struct symbol_dictionary_record);
-  som_symtab = (struct symbol_dictionary_record *) malloc (symtab_size);
+  som_symtab = (struct symbol_dictionary_record *) bfd_malloc (symtab_size);
   if (som_symtab == NULL && symtab_size != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
   memset (som_symtab, 0, symtab_size);
 
   /* Walk over each symbol.  */
@@ -3823,12 +3927,10 @@ som_slurp_string_table (abfd)
     }
 
   /* Allocate and read in the string table.  */
-  stringtab = bfd_zalloc (abfd, obj_som_stringtab_size (abfd));
+  stringtab = bfd_malloc (obj_som_stringtab_size (abfd));
   if (stringtab == NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return false;
-    }
+    return false;
+  memset (stringtab, 0, obj_som_stringtab_size (abfd));
 
   if (bfd_seek (abfd, obj_som_str_filepos (abfd), SEEK_SET) < 0)
     return false;
@@ -3929,21 +4031,16 @@ som_slurp_symbol_table (abfd)
 
   stringtab = obj_som_stringtab (abfd);
 
-  symbase = (som_symbol_type *)
-    bfd_zalloc (abfd, symbol_count * sizeof (som_symbol_type));
+  symbase = ((som_symbol_type *)
+            bfd_malloc (symbol_count * sizeof (som_symbol_type)));
   if (symbase == NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
+  memset (symbase, 0, symbol_count * sizeof (som_symbol_type));
 
   /* Read in the external SOM representation.  */
-  buf = malloc (symbol_count * symsize);
+  buf = bfd_malloc (symbol_count * symsize);
   if (buf == NULL && symbol_count * symsize != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
   if (bfd_seek (abfd, obj_som_sym_filepos (abfd), SEEK_SET) < 0)
     goto error_return;
   if (bfd_read (buf, symbol_count * symsize, 1, abfd) 
@@ -4070,6 +4167,10 @@ som_slurp_symbol_table (abfd)
       sym++;
     }
 
+  /* We modify the symbol count to record the number of BFD symbols we
+     created.  */
+  bfd_get_symcount (abfd) = sym - symbase;
+
   /* Save our results and return success.  */
   obj_som_symtab (abfd) = symbase;
  successful_return:
@@ -4117,10 +4218,7 @@ som_make_empty_symbol (abfd)
   som_symbol_type *new =
   (som_symbol_type *) bfd_zalloc (abfd, sizeof (som_symbol_type));
   if (new == NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return 0;
-    }
+    return 0;
   new->symbol.the_bfd = abfd;
 
   return &new->symbol;
@@ -4158,11 +4256,11 @@ som_print_symbol (ignore_abfd, afile, symbol, how)
 }
 
 static boolean
-som_bfd_is_local_label (abfd, sym)
+som_bfd_is_local_label_name (abfd, name)
      bfd *abfd;
-     asymbol *sym;
+     const char *name;
 {
-  return (sym->name[0] == 'L' && sym->name[1] == '$');
+  return (name[0] == 'L' && name[1] == '$');
 }
 
 /* Count or process variable-length SOM fixup records.
@@ -4480,7 +4578,7 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count)
                      /* Got to read the damn contents first.  We don't
                         bother saving the contents (yet).  Add it one
                         day if the need arises.  */
-                     section->contents = malloc (section->_raw_size);
+                     section->contents = bfd_malloc (section->_raw_size);
                      if (section->contents == NULL)
                        return -1;
 
@@ -4546,12 +4644,9 @@ som_slurp_reloc_table (abfd, section, symbols, just_count)
      parsed.  We must do so now to know how many relocations exist.  */
   if (section->reloc_count == -1)
     {
-      external_relocs = (char *) malloc (fixup_stream_size);
+      external_relocs = (char *) bfd_malloc (fixup_stream_size);
       if (external_relocs == (char *) NULL)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         return false;
-       }
+       return false;
       /* Read in the external forms. */
       if (bfd_seek (abfd,
                    obj_som_reloc_filepos (abfd) + section->rel_filepos,
@@ -4585,10 +4680,7 @@ som_slurp_reloc_table (abfd, section, symbols, just_count)
   internal_relocs = (arelent *) 
     bfd_zalloc (abfd, (num_relocs * sizeof (arelent)));
   if (internal_relocs == (arelent *) NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return false;
-    }
+    return false;
 
   /* Process and internalize the relocations.  */
   som_set_reloc_info (external_relocs, fixup_stream_size,
@@ -4596,6 +4688,7 @@ som_slurp_reloc_table (abfd, section, symbols, just_count)
 
   /* We're done with the external relocations.  Free them.  */
   free (external_relocs);
+  som_section_data (section)->reloc_stream = NULL;
 
   /* Save our results and return success.  */
   section->relocation = internal_relocs;
@@ -4660,10 +4753,7 @@ som_new_section_hook (abfd, newsect)
   newsect->used_by_bfd =
     (PTR) bfd_zalloc (abfd, sizeof (struct som_section_data_struct));
   if (!newsect->used_by_bfd)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return false;
-    }
+    return false;
   newsect->alignment_power = 3;
 
   /* We allow more than three sections internally */
@@ -4680,8 +4770,8 @@ som_bfd_copy_private_symbol_data (ibfd, isymbol, obfd, osymbol)
      bfd *obfd;
      asymbol *osymbol;
 {
-  struct som_symbol *input_symbol = isymbol;
-  struct som_symbol *output_symbol = osymbol;
+  struct som_symbol *input_symbol = (struct som_symbol *) isymbol;
+  struct som_symbol *output_symbol = (struct som_symbol *) osymbol;
 
   /* One day we may try to grok other private data.  */
   if (ibfd->xvec->flavour != bfd_target_som_flavour
@@ -4714,10 +4804,7 @@ som_bfd_copy_private_section_data (ibfd, isection, obfd, osection)
     = (struct som_copyable_section_data_struct *)
       bfd_zalloc (obfd, sizeof (struct som_copyable_section_data_struct));
   if (som_section_data (osection)->copy_data == NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return false;
-    }
+    return false;
 
   memcpy (som_section_data (osection)->copy_data,
          som_section_data (isection)->copy_data,
@@ -4747,10 +4834,7 @@ som_bfd_copy_private_bfd_data (ibfd, obfd)
   obj_som_exec_data (obfd) = (struct som_exec_data *)
     bfd_zalloc (obfd, sizeof (struct som_exec_data));
   if (obj_som_exec_data (obfd) == NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return false;
-    }
+    return false;
 
   /* Now copy the data.  */
   memcpy (obj_som_exec_data (obfd), obj_som_exec_data (ibfd),
@@ -4778,10 +4862,7 @@ bfd_som_set_section_attributes (section, defined, private, sort_key, spnum)
          bfd_zalloc (section->owner,
                      sizeof (struct som_copyable_section_data_struct));
       if (som_section_data (section)->copy_data == NULL)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         return false;
-       }
+       return false;
     }
   som_section_data (section)->copy_data->sort_key = sort_key;
   som_section_data (section)->copy_data->is_defined = defined;
@@ -4811,10 +4892,7 @@ bfd_som_set_subsection_attributes (section, container, access,
          bfd_zalloc (section->owner,
                      sizeof (struct som_copyable_section_data_struct));
       if (som_section_data (section)->copy_data == NULL)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         return false;
-       }
+       return false;
     }
   som_section_data (section)->copy_data->sort_key = sort_key;
   som_section_data (section)->copy_data->access_control_bits = access;
@@ -4856,10 +4934,7 @@ bfd_som_attach_aux_hdr (abfd, type, string)
        bfd_zalloc (abfd, sizeof (struct aux_id)
                              + sizeof (unsigned int) + len + pad);
       if (!obj_som_version_hdr (abfd))
-       {
-         bfd_set_error (bfd_error_no_memory);
-         return false;
-       }
+       return false;
       obj_som_version_hdr (abfd)->header_id.type = VERSION_AUX_ID;
       obj_som_version_hdr (abfd)->header_id.length = len + pad;
       obj_som_version_hdr (abfd)->header_id.length += sizeof (int);
@@ -4877,10 +4952,7 @@ bfd_som_attach_aux_hdr (abfd, type, string)
        bfd_zalloc (abfd, sizeof (struct aux_id)
                            + sizeof (unsigned int) + len + pad);
       if (!obj_som_copyright_hdr (abfd))
-       {
-         bfd_set_error (bfd_error_no_memory);
-         return false;
-       }
+       return false;
       obj_som_copyright_hdr (abfd)->header_id.type = COPYRIGHT_AUX_ID;
       obj_som_copyright_hdr (abfd)->header_id.length = len + pad;
       obj_som_copyright_hdr (abfd)->header_id.length += sizeof (int);
@@ -4972,7 +5044,7 @@ som_sizeof_headers (abfd, reloc)
      bfd *abfd;
      boolean reloc;
 {
-  fprintf (stderr, "som_sizeof_headers unimplemented\n");
+  (*_bfd_error_handler) ("som_sizeof_headers unimplemented");
   fflush (stderr);
   abort ();
   return (0);
@@ -5051,12 +5123,10 @@ som_bfd_count_ar_symbols (abfd, lst_header, count)
   file_ptr lst_filepos = bfd_tell (abfd) - sizeof (struct lst_header);
 
   hash_table = 
-    (unsigned int *) malloc (lst_header->hash_size * sizeof (unsigned int));
+    (unsigned int *) bfd_malloc (lst_header->hash_size
+                                * sizeof (unsigned int));
   if (hash_table == NULL && lst_header->hash_size != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
 
   /* Don't forget to initialize the counter!  */
   *count = 0;
@@ -5131,21 +5201,16 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
   file_ptr lst_filepos = bfd_tell (abfd) - sizeof (struct lst_header);
 
   hash_table = 
-    (unsigned int *) malloc (lst_header->hash_size * sizeof (unsigned int));
+    (unsigned int *) bfd_malloc (lst_header->hash_size
+                                * sizeof (unsigned int));
   if (hash_table == NULL && lst_header->hash_size != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
 
   som_dict =
-    (struct som_entry *) malloc (lst_header->module_count
-                                * sizeof (struct som_entry));
+    (struct som_entry *) bfd_malloc (lst_header->module_count
+                                    * sizeof (struct som_entry));
   if (som_dict == NULL && lst_header->module_count != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
 
   /* Read in the hash table.  The has table is an array of 32bit file offsets
      which point to the hash chains.  */
@@ -5197,10 +5262,7 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
       /* Allocate space for the name and null terminate it too.  */
       set->name = bfd_zalloc (abfd, len + 1);
       if (!set->name)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         goto error_return;
-       }
+       goto error_return;
       if (bfd_read (set->name, 1, len, abfd) != len)
        goto error_return;
 
@@ -5236,10 +5298,7 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
          /* Allocate space for the name and null terminate it too.  */
          set->name = bfd_zalloc (abfd, len + 1);
          if (!set->name)
-           {
-             bfd_set_error (bfd_error_no_memory);
-             goto error_return;
-           }
+           goto error_return;
 
          if (bfd_read (set->name, 1, len, abfd) != len)
            goto error_return;
@@ -5350,10 +5409,7 @@ som_slurp_armap (abfd)
                                          (ardata->symdef_count
                                           * sizeof (carsym)));
   if (!ardata->symdefs)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return false;
-    }
+    return false;
 
   /* Now fill in the canonical archive symbols.  */
   if (som_bfd_fill_in_ar_symbols (abfd, &lst_header, &ardata->symdefs)
@@ -5495,29 +5551,20 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst)
   unsigned int maxname = abfd->xvec->ar_max_namelen;
 
   hash_table =
-    (unsigned int *) malloc (lst.hash_size * sizeof (unsigned int));
+    (unsigned int *) bfd_malloc (lst.hash_size * sizeof (unsigned int));
   if (hash_table == NULL && lst.hash_size != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
   som_dict =
-    (struct som_entry *) malloc (lst.module_count
-                                * sizeof (struct som_entry));
+    (struct som_entry *) bfd_malloc (lst.module_count
+                                    * sizeof (struct som_entry));
   if (som_dict == NULL && lst.module_count != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
 
   last_hash_entry =
     ((struct lst_symbol_record **)
-     malloc (lst.hash_size * sizeof (struct lst_symbol_record *)));
+     bfd_malloc (lst.hash_size * sizeof (struct lst_symbol_record *)));
   if (last_hash_entry == NULL && lst.hash_size != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
 
   /* Lots of fields are file positions relative to the start
      of the lst record.  So save its location.  */
@@ -5549,13 +5596,10 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst)
       unsigned int thislen;
 
       if (!normal)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         return false;
-       }
+       return false;
       thislen = strlen (normal);
       if (thislen > maxname)
-       extended_name_length += thislen + 1;
+       extended_name_length += thislen + 2;
     }
 
   /* Make room for the archive header and the contents of the
@@ -5567,18 +5611,12 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst)
   curr_som_offset = (curr_som_offset + 0x1) & ~0x1;
 
   /* FIXME should be done with buffers just like everything else... */
-  lst_syms = malloc (nsyms * sizeof (struct lst_symbol_record));
+  lst_syms = bfd_malloc (nsyms * sizeof (struct lst_symbol_record));
   if (lst_syms == NULL && nsyms != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
-  strings = malloc (string_size);
+    goto error_return;
+  strings = bfd_malloc (string_size);
   if (strings == NULL && string_size != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
 
   p = strings;
   curr_lst_sym = lst_syms;
@@ -5763,20 +5801,6 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst)
   return false;
 }
 
-/* SOM almost uses the SVR4 style extended name support, but not
-   quite.  */
-
-static boolean
-som_construct_extended_name_table (abfd, tabloc, tablen, name)
-     bfd *abfd;
-     char **tabloc;
-     bfd_size_type *tablen;
-     const char **name;
-{
-  *name = "//";
-  return _bfd_construct_extended_name_table (abfd, false, tabloc, tablen);
-}
-
 /* Write out the LST for the archive.
 
    You'll never believe this is really how armaps are handled in SOM...  */
@@ -5947,16 +5971,23 @@ som_bfd_link_split_section (abfd, sec)
 
 #define        som_close_and_cleanup           som_bfd_free_cached_info
 
+#define som_read_ar_hdr                        _bfd_generic_read_ar_hdr
 #define som_openr_next_archived_file   bfd_generic_openr_next_archived_file
+#define som_get_elt_at_index           _bfd_generic_get_elt_at_index
 #define som_generic_stat_arch_elt      bfd_generic_stat_arch_elt
 #define som_truncate_arname            bfd_bsd_truncate_arname
 #define som_slurp_extended_name_table  _bfd_slurp_extended_name_table
+#define som_construct_extended_name_table \
+  _bfd_archive_coff_construct_extended_name_table
 #define som_update_armap_timestamp     bfd_true
+#define som_bfd_print_private_bfd_data  _bfd_generic_bfd_print_private_bfd_data
 
 #define som_get_lineno                  _bfd_nosymbols_get_lineno
 #define som_bfd_make_debug_symbol      _bfd_nosymbols_bfd_make_debug_symbol
 #define som_read_minisymbols           _bfd_generic_read_minisymbols
 #define som_minisymbol_to_symbol       _bfd_generic_minisymbol_to_symbol
+#define som_get_section_contents_in_window \
+  _bfd_generic_get_section_contents_in_window
 
 #define som_bfd_get_relocated_section_contents \
  bfd_generic_get_relocated_section_contents
@@ -5965,12 +5996,13 @@ som_bfd_link_split_section (abfd, sec)
 #define som_bfd_link_add_symbols _bfd_generic_link_add_symbols
 #define som_bfd_final_link _bfd_generic_final_link
 
+
 const bfd_target som_vec =
 {
   "som",                       /* name */
   bfd_target_som_flavour,
-  true,                                /* target byte order */
-  true,                                /* target headers byte order */
+  BFD_ENDIAN_BIG,              /* target byte order */
+  BFD_ENDIAN_BIG,              /* target headers byte order */
   (HAS_RELOC | EXEC_P |                /* object flags */
    HAS_LINENO | HAS_DEBUG |
    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | DYNAMIC),
@@ -5982,7 +6014,6 @@ const bfd_target som_vec =
   0,
   '/',                         /* ar_pad_char */
   14,                          /* ar_max_namelen */
-  3,                           /* minimum alignment */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,  /* data */