For bfd, add vr5400 and vr5000 mips machine variants to list of machines.
[deliverable/binutils-gdb.git] / bfd / hp300hpux.c
index 3b8cb9c4ad8960f565ca12b7231342667d07efcc..ec48fd382429f3d5b22868b752f12d5bd415b59b 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD backend for hp-ux 9000/300
-   Copyright (C) 1990, 1991, 1994 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1991, 1994, 1995 Free Software Foundation, Inc.
    Written by Glenn Engel.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -16,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /*
 
@@ -100,7 +100,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        mkobject
    This should also be fixed.  */
 
-#define ARCH 32
 #define TARGETNAME "a.out-hp300hpux"
 #define MY(OP) CAT(hp300hpux_,OP)
 
@@ -132,8 +131,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define MY_canonicalize_reloc hp300hpux_canonicalize_reloc
 #define MY_write_object_contents hp300hpux_write_object_contents
 
+#define MY_read_minisymbols _bfd_generic_read_minisymbols
+#define MY_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
+
 #define MY_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
 #define MY_bfd_link_add_symbols _bfd_generic_link_add_symbols
+#define MY_final_link_callback unused
 #define MY_bfd_final_link _bfd_generic_final_link
 
 /* Until and unless we convert the slurp_reloc and slurp_symtab
@@ -146,6 +149,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #define MY_callback MY(callback)
 
+#define MY_exec_hdr_flags 0x2
+
 #define NAME_swap_exec_header_in NAME(hp300hpux_32_,swap_exec_header_in)
 
 #define HP_SYMTYPE_UNDEFINED   0x00
@@ -179,6 +184,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #define NAME(x,y) CAT3(hp300hpux,_32_,y)
 #define ARCH_SIZE 32
+
+/* aoutx.h requires definitions for BMAGIC and QMAGIC.  */
+#define BMAGIC HPUX_DOT_O_MAGIC
+#define QMAGIC 0314
+
 #include "aoutx.h"
 
 /* Since the hpux symbol table has nlist elements interspersed with
@@ -191,7 +201,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* Set parameters about this a.out file that are machine-dependent.
    This routine is called from some_aout_object_p just before it returns.  */
-static bfd_target *
+static const bfd_target *
 MY (callback) (abfd)
      bfd *abfd;
 {
@@ -205,6 +215,10 @@ MY (callback) (abfd)
   obj_datasec (abfd)->vma = N_DATADDR (*execp);
   obj_bsssec (abfd)->vma = N_BSSADDR (*execp);
 
+  obj_textsec (abfd)->lma = obj_textsec (abfd)->vma;
+  obj_datasec (abfd)->lma = obj_datasec (abfd)->vma;
+  obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma;
+
   /* The file offsets of the sections */
   obj_textsec (abfd)->filepos = N_TXTOFF (*execp);
   obj_datasec (abfd)->filepos = N_DATOFF (*execp);
@@ -263,7 +277,7 @@ MY (write_object_contents) (abfd)
 #endif
 
   if (adata (abfd).magic == undecided_magic)
-    NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
+    NAME (aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
   execp->a_syms = 0;
 
   execp->a_entry = bfd_get_start_address (abfd);
@@ -274,9 +288,9 @@ MY (write_object_contents) (abfd)
                     obj_reloc_entry_size (abfd));
 
   N_SET_MACHTYPE (*execp, 0xc);
-  N_SET_FLAGS (*execp, 0x2);
+  N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags);
 
-  NAME (aout, swap_exec_header_out) (abfd, execp, &exec_bytes);
+  NAME (aout,swap_exec_header_out) (abfd, execp, &exec_bytes);
 
   /* update fields not covered by default swap_exec_header_out */
 
@@ -306,11 +320,11 @@ MY (write_object_contents) (abfd)
     {
       if (bfd_seek (abfd, (long) (N_TRELOFF (*execp)), false) != 0)
        return false;
-      if (!NAME (aout, squirt_out_relocs) (abfd, obj_textsec (abfd)))
+      if (!NAME (aout,squirt_out_relocs) (abfd, obj_textsec (abfd)))
        return false;
       if (bfd_seek (abfd, (long) (N_DRELOFF (*execp)), false) != 0)
        return false;
-      if (!NAME (aout, squirt_out_relocs) (abfd, obj_datasec (abfd)))
+      if (!NAME (aout,squirt_out_relocs) (abfd, obj_datasec (abfd)))
        return false;
     }
 
@@ -369,13 +383,35 @@ convert_sym_type (sym_pointer, cache_ptr, abfd)
          break;
 
        default:
-         fprintf (stderr, "unknown symbol type encountered: %x", name_type);
+         abort ();
+         break;
        }
       if (name_type & HP_SYMTYPE_EXTERNAL)
        new_type |= N_EXT;
 
       if (name_type & HP_SECONDARY_SYMBOL)
-       new_type = (new_type & ~N_TYPE) | N_INDR;
+       {
+         switch (new_type)
+           {
+           default:
+             abort ();
+           case N_UNDF | N_EXT:
+             new_type = N_WEAKU;
+             break;
+           case N_ABS | N_EXT:
+             new_type = N_WEAKA;
+             break;
+           case N_TEXT | N_EXT:
+             new_type = N_WEAKT;
+             break;
+           case N_DATA | N_EXT:
+             new_type = N_WEAKD;
+             break;
+           case N_BSS | N_EXT:
+             new_type = N_WEAKB;
+             break;
+           }
+       }
     }
   cache_ptr->type = new_type;
 
@@ -390,7 +426,7 @@ DESCRIPTION
 */
 
 void
-  NAME (aout, swap_exec_header_in) (abfd, raw_bytes, execp)
+NAME (aout,swap_exec_header_in) (abfd, raw_bytes, execp)
      bfd *abfd;
      struct external_exec *raw_bytes;
      struct internal_exec *execp;
@@ -485,17 +521,11 @@ MY (slurp_symbol_table) (abfd)
   char *strings;
   aout_symbol_type *cached;
   unsigned num_syms = 0;
-  unsigned num_secondary = 0;
 
   /* If there's no work to be done, don't do any */
   if (obj_aout_symbols (abfd) != (aout_symbol_type *) NULL)
     return true;
   symbol_bytes = exec_hdr (abfd)->a_syms;
-  if (symbol_bytes == 0)
-    {
-      bfd_set_error (bfd_error_no_symbols);
-      return false;
-    }
 
   strings = (char *) bfd_alloc (abfd,
                                symbol_bytes + SYM_EXTRA_BYTES);
@@ -518,20 +548,18 @@ MY (slurp_symbol_table) (abfd)
   /* first, march thru the table and figure out how many symbols there are */
   for (sym_pointer = syms; sym_pointer < sym_end; sym_pointer++, num_syms++)
     {
-      if (bfd_get_8 (abfd, sym_pointer->e_type) & HP_SECONDARY_SYMBOL)
-       num_secondary++;
       /* skip over the embedded symbol. */
       sym_pointer = (struct external_nlist *) (((char *) sym_pointer) +
                                               sym_pointer->e_length[0]);
     }
 
   /* now that we know the symbol count, update the bfd header */
-  bfd_get_symcount (abfd) = num_syms + num_secondary;
+  bfd_get_symcount (abfd) = num_syms;
 
-  cached = (aout_symbol_type *)
-    bfd_zalloc (abfd, (bfd_size_type) (bfd_get_symcount (abfd) *
-                                      sizeof (aout_symbol_type)));
-  if (!cached)
+  cached = ((aout_symbol_type *)
+           bfd_zalloc (abfd,
+                       bfd_get_symcount (abfd) * sizeof (aout_symbol_type)));
+  if (cached == NULL && bfd_get_symcount (abfd) != 0)
     {
       bfd_set_error (bfd_error_no_memory);
       return false;
@@ -541,7 +569,6 @@ MY (slurp_symbol_table) (abfd)
      null terminated strings to hold the symbol names.  Make sure any
      assignment to the strings pointer is done after we're thru using
      the nlist so we don't overwrite anything important. */
-  num_secondary = 0;
 
   /* OK, now walk the new symtable, cacheing symbol properties */
   {
@@ -556,13 +583,13 @@ MY (slurp_symbol_table) (abfd)
        cache_ptr->symbol.value = GET_SWORD (abfd, sym_pointer->e_value);
        cache_ptr->desc = bfd_get_16 (abfd, sym_pointer->e_almod);
        cache_ptr->type = bfd_get_8 (abfd, sym_pointer->e_type);
-       cache_ptr->symbol.udata = 0;
+       cache_ptr->symbol.udata.p = NULL;
        length = bfd_get_8 (abfd, sym_pointer->e_length);
        cache_ptr->other = length;      /* other not used, save length here */
 
        cache_save = *cache_ptr;
        convert_sym_type (sym_pointer, cache_ptr, abfd);
-       if (!translate_from_native_sym_flags (sym_pointer, cache_ptr, abfd))
+       if (!translate_from_native_sym_flags (abfd, cache_ptr))
          return false;
 
        /********************************************************/
@@ -584,35 +611,6 @@ MY (slurp_symbol_table) (abfd)
        else
          cache_ptr->symbol.name = (char *) NULL;
 
-       /**********************************************************/
-       /* this is a bit of a kludge, but a secondary hp symbol   */
-       /* gets translated into a gnu indirect symbol.  When this */
-       /* happens, we need to create a "dummy" record to which   */
-       /* we can point the indirect symbol to.                   */
-       /**********************************************************/
-       if ((cache_ptr->type | N_EXT) == (N_INDR | N_EXT))
-         {
-           aout_symbol_type *cache_ptr2 = cached + num_syms + num_secondary;
-
-           num_secondary++;
-
-           /* aoutx.h assumes the "next" value is the indirect sym  */
-           /* since we don't want to disturb the order by inserting */
-           /* a new symbol, we tack on the created secondary syms   */
-           /* at the end.                                           */
-           cache_ptr->symbol.value = (bfd_vma) (cache_ptr2);
-           *cache_ptr2 = cache_save;
-           cache_ptr2->symbol.name = strings;
-           memcpy (strings, cache_ptr->symbol.name, length);
-           strcpy (strings + length, ":secondry");     /* 9 max chars + null */
-           strings += length + 10;
-           cache_ptr2->type &= ~HP_SECONDARY_SYMBOL;   /* clear secondary */
-           convert_sym_type (sym_pointer, cache_ptr2, abfd);
-           if (!translate_from_native_sym_flags (sym_pointer, cache_ptr2,
-                                                 abfd))
-             return false;
-         }
-
        /* skip over the embedded symbol. */
        sym_pointer = (struct external_nlist *) (((char *) sym_pointer) +
                                                 length);
@@ -627,11 +625,12 @@ MY (slurp_symbol_table) (abfd)
 
 
 void
-MY (swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols)
+MY (swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount)
      bfd *abfd;
      struct hp300hpux_reloc *bytes;
      arelent *cache_ptr;
      asymbol **symbols;
+     bfd_size_type symcount;
 {
   int r_index;
   int r_extern = 0;
@@ -667,8 +666,8 @@ MY (swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols)
     case HP_RSEGMENT_NOOP:
       break;
     default:
-      fprintf (stderr, "illegal relocation segment type: %x\n",
-              (bytes->r_type[0]));
+      abort ();
+      break;
     }
 
   switch (bytes->r_length[0])
@@ -683,8 +682,8 @@ MY (swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols)
       r_length = 2;
       break;
     default:
-      fprintf (stderr, "illegal relocation length: %x\n", bytes->r_length[0]);
-      r_length = 0;
+      abort ();
+      break;
     }
 
   cache_ptr->howto = howto_table_std + r_length + 4 * r_pcrel;
@@ -750,7 +749,7 @@ doit:
 
   reloc_cache = (arelent *) bfd_zalloc (abfd, (size_t) (count * sizeof
                                                        (arelent)));
-  if (!reloc_cache)
+  if (!reloc_cache && count != 0)
     {
     nomem:
       bfd_set_error (bfd_error_no_memory);
@@ -758,7 +757,7 @@ doit:
     }
 
   relocs = (PTR) bfd_alloc (abfd, reloc_size);
-  if (!relocs)
+  if (!relocs && reloc_size != 0)
     {
       bfd_release (abfd, reloc_cache);
       goto nomem;
@@ -777,7 +776,8 @@ doit:
 
   for (; counter < count; counter++, rptr++, cache_ptr++)
     {
-      MY (swap_std_reloc_in) (abfd, rptr, cache_ptr, symbols);
+      MY (swap_std_reloc_in) (abfd, rptr, cache_ptr, symbols,
+                             bfd_get_symcount (abfd));
     }
 
 
@@ -863,8 +863,6 @@ MY (canonicalize_reloc) (abfd, section, relptr, symbols)
   else
     {
       tblptr = section->relocation;
-      if (!tblptr)
-       return -1;
 
       for (count = 0; count++ < section->reloc_count;)
        {
This page took 0.03082 seconds and 4 git commands to generate.