]> Git Repo - binutils.git/blobdiff - bfd/coff-mips.c
* Makefile.in (install): Move subdir_do out of conditional. From
[binutils.git] / bfd / coff-mips.c
index 768821e1a6890e7ca9dc40018676641f5a516436..2b0a6a7fcd04ccf8750ed887c038c5a05cd2378e 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for MIPS Extended-Coff files.
-   Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
    Original version by Per Bothner.
    Full support added by Ian Lance Taylor, [email protected].
 
@@ -17,7 +17,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.  */
 
 #include "bfd.h"
 #include "sysdep.h"
@@ -104,6 +104,7 @@ static void mips_relocate_hi PARAMS ((struct internal_reloc *refhi,
 static boolean mips_relocate_section PARAMS ((bfd *, struct bfd_link_info *,
                                              bfd *, asection *,
                                              bfd_byte *, PTR));
+static boolean mips_read_relocs PARAMS ((bfd *, asection *));
 static boolean mips_relax_section PARAMS ((bfd *, asection *,
                                           struct bfd_link_info *,
                                           boolean *));
@@ -395,12 +396,12 @@ mips_ecoff_bad_format_hook (abfd, filehdr)
     case MIPS_MAGIC_BIG:
     case MIPS_MAGIC_BIG2:
     case MIPS_MAGIC_BIG3:
-      return abfd->xvec->byteorder_big_p;
+      return bfd_big_endian (abfd);
 
     case MIPS_MAGIC_LITTLE:
     case MIPS_MAGIC_LITTLE2:
     case MIPS_MAGIC_LITTLE3:
-      return abfd->xvec->byteorder_big_p == false;
+      return bfd_little_endian (abfd);
 
     default:
       return false;
@@ -422,7 +423,7 @@ mips_ecoff_swap_reloc_in (abfd, ext_ptr, intern)
   const RELOC *ext = (RELOC *) ext_ptr;
 
   intern->r_vaddr = bfd_h_get_32 (abfd, (bfd_byte *) ext->r_vaddr);
-  if (abfd->xvec->header_byteorder_big_p != false)
+  if (bfd_header_big_endian (abfd))
     {
       intern->r_symndx = (((int) ext->r_bits[0]
                           << RELOC_BITS0_SYMNDX_SH_LEFT_BIG)
@@ -499,7 +500,7 @@ mips_ecoff_swap_reloc_out (abfd, intern, dst)
     }
 
   bfd_h_put_32 (abfd, intern->r_vaddr, (bfd_byte *) ext->r_vaddr);
-  if (abfd->xvec->header_byteorder_big_p != false)
+  if (bfd_header_big_endian (abfd))
     {
       ext->r_bits[0] = r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_BIG;
       ext->r_bits[1] = r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_BIG;
@@ -537,12 +538,12 @@ mips_adjust_reloc_in (abfd, intern, rptr)
   if (! intern->r_extern
       && (intern->r_type == MIPS_R_GPREL
          || intern->r_type == MIPS_R_LITERAL))
-    rptr->addend += ecoff_data (abfd)->gp;
+    rptr->addend += _bfd_get_gp_value (abfd);
 
   /* If the type is MIPS_R_IGNORE, make sure this is a reference to
      the absolute section so that the reloc is ignored.  */
   if (intern->r_type == MIPS_R_IGNORE)
-    rptr->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
+    rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
 
   /* If this is a MIPS_R_SWITCH reloc, or an internal MIPS_R_RELHI or
      MIPS_R_RELLO reloc, we want the addend field of the BFD relocto
@@ -657,7 +658,7 @@ mips_refhi_reloc (abfd,
     }
 
   ret = bfd_reloc_ok;
-  if (symbol->section == &bfd_und_section
+  if (bfd_is_und_section (symbol->section)
       && output_bfd == (bfd *) NULL)
     ret = bfd_reloc_undefined;
 
@@ -784,7 +785,7 @@ mips_gprel_reloc (abfd,
       output_bfd = symbol->section->output_section->owner;
     }
 
-  if (symbol->section == &bfd_und_section
+  if (bfd_is_und_section (symbol->section)
       && relocateable == false)
     return bfd_reloc_undefined;
 
@@ -793,15 +794,15 @@ mips_gprel_reloc (abfd,
      BFD.  If we can't find it, we're stuck.  We cache it in the ECOFF
      target data.  We don't need to adjust the symbol value for an
      external symbol if we are producing relocateable output.  */
-  if (ecoff_data (output_bfd)->gp == 0
+  if (_bfd_get_gp_value (output_bfd) == 0
       && (relocateable == false
          || (symbol->flags & BSF_SECTION_SYM) != 0))
     {
       if (relocateable != false)
        {
          /* Make up a value.  */
-         ecoff_data (output_bfd)->gp =
-           symbol->section->output_section->vma + 0x4000;
+         _bfd_set_gp_value (output_bfd,
+                            symbol->section->output_section->vma + 0x4000);
        }
       else
        {
@@ -823,7 +824,8 @@ mips_gprel_reloc (abfd,
                  name = bfd_asymbol_name (*sym);
                  if (*name == '_' && strcmp (name, "_gp") == 0)
                    {
-                     ecoff_data (output_bfd)->gp = bfd_asymbol_value (*sym);
+                     _bfd_set_gp_value (output_bfd,
+                                        bfd_asymbol_value (*sym));
                      break;
                    }
                }
@@ -832,7 +834,7 @@ mips_gprel_reloc (abfd,
          if (i >= count)
            {
              /* Only get the error once.  */
-             ecoff_data (output_bfd)->gp = 4;
+             _bfd_set_gp_value (output_bfd, 4);
              *error_message =
                (char *) "GP relative relocation when _gp not defined";
              return bfd_reloc_dangerous;
@@ -863,7 +865,7 @@ mips_gprel_reloc (abfd,
      an external symbol.  */
   if (relocateable == false
       || (symbol->flags & BSF_SECTION_SYM) != 0)
-    val += relocation - ecoff_data (output_bfd)->gp;
+    val += relocation - _bfd_get_gp_value (output_bfd);
 
   insn = (insn &~ 0xffff) | (val & 0xffff);
   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
@@ -925,7 +927,7 @@ mips_relhi_reloc (abfd,
     }
 
   ret = bfd_reloc_ok;
-  if (symbol->section == &bfd_und_section
+  if (bfd_is_und_section (symbol->section)
       && output_bfd == (bfd *) NULL)
     ret = bfd_reloc_undefined;
 
@@ -990,7 +992,7 @@ mips_rello_reloc (abfd,
         symbol is not defined we don't want to do this, because we
         don't want the value in the object file to incorporate the
         address of the reloc.  */
-      if (bfd_get_section (symbol) != &bfd_und_section
+      if (! bfd_is_und_section (bfd_get_section (symbol))
          && ! bfd_is_com_section (bfd_get_section (symbol)))
        val -= (input_section->output_section->vma
                + input_section->output_offset
@@ -1065,7 +1067,7 @@ mips_switch_reloc (abfd,
 
 /* Get the howto structure for a generic reloc type.  */
 
-static CONST struct reloc_howto_struct *
+static reloc_howto_type *
 mips_bfd_reloc_type_lookup (abfd, code)
      bfd *abfd;
      bfd_reloc_code_real_type code;
@@ -1109,7 +1111,7 @@ mips_bfd_reloc_type_lookup (abfd, code)
       mips_type = MIPS_R_SWITCH;
       break;
     default:
-      return (CONST struct reloc_howto_struct *) NULL;
+      return (reloc_howto_type *) NULL;
     }
 
   return &mips_howto_table[mips_type];
@@ -1189,8 +1191,8 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
   boolean got_lo;
   struct internal_reloc lo_int_rel;
 
-  BFD_ASSERT (input_bfd->xvec->header_byteorder_big_p
-             == output_bfd->xvec->header_byteorder_big_p);
+  BFD_ASSERT (input_bfd->xvec->header_byteorder
+             == output_bfd->xvec->header_byteorder);
 
   /* We keep a table mapping the symndx found in an internal reloc to
      the appropriate section.  This is faster than looking up the
@@ -1203,10 +1205,7 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
                                      (NUM_RELOC_SECTIONS
                                       * sizeof (asection *))));
       if (!symndx_to_section)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         return false;
-       }
+       return false;
 
       symndx_to_section[RELOC_SECTION_NONE] = NULL;
       symndx_to_section[RELOC_SECTION_TEXT] =
@@ -1239,7 +1238,7 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
 
   sym_hashes = ecoff_data (input_bfd)->sym_hashes;
 
-  gp = ecoff_data (output_bfd)->gp;
+  gp = _bfd_get_gp_value (output_bfd);
   if (gp == 0)
     gp_undefined = true;
   else
@@ -1358,7 +1357,8 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
                      int_rel.r_vaddr - input_section->vma)))
                return false;
              /* Only give the error once per link.  */
-             ecoff_data (output_bfd)->gp = gp = 4;
+             gp = 4;
+             _bfd_set_gp_value (output_bfd, gp);
              gp_undefined = false;
            }
          if (! int_rel.r_extern)
@@ -1372,16 +1372,17 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
              addend = ecoff_data (input_bfd)->gp - gp;
            }
          else if (! info->relocateable
-                  || h->root.type == bfd_link_hash_defined)
+                  || h->root.type == bfd_link_hash_defined
+                  || h->root.type == bfd_link_hash_defweak)
            {
-             /* This is a relocation against an undefined or common
-                symbol.  The current addend in the instruction is
-                simply the desired offset into the symbol (normally
-                zero).  We are going to change this into a relocation
-                against a defined symbol, so we want the instruction
-                to hold the difference between the final definition
-                of the symbol (which will end up in RELOCATION) and
-                the GP value of OUTPUT_BFD (which is in GP).  */
+             /* This is a relocation against a defined symbol.  The
+                current addend in the instruction is simply the
+                desired offset into the symbol (normally zero).  We
+                are going to change this into a relocation against a
+                defined symbol, so we want the instruction to hold
+                the difference between the final definition of the
+                symbol (which will end up in RELOCATION) and the GP
+                value of OUTPUT_BFD (which is in GP).  */
              addend = - gp;
            }
          else
@@ -1422,8 +1423,8 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
                      + int_rel.r_vaddr
                      - input_section->vma);
              memmove (here + PCREL16_EXPANSION_ADJUSTMENT, here,
-                      (input_section->_raw_size
-                       - (int_rel.r_vaddr - input_section->vma)));
+                      (size_t) (input_section->_raw_size
+                                - (int_rel.r_vaddr - input_section->vma)));
                       
              /* Generate the new instructions.  */
              if (! mips_relax_pcrel16 (info, input_bfd, input_section,
@@ -1487,7 +1488,9 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
             the existing reloc.  */
          if (int_rel.r_extern)
            {
-             if (h->root.type == bfd_link_hash_defined)
+             if ((h->root.type == bfd_link_hash_defined
+                  || h->root.type == bfd_link_hash_defweak)
+                 && ! bfd_is_abs_section (h->root.u.def.section))
                {
                  const char *name;
 
@@ -1676,7 +1679,8 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
          if (int_rel.r_extern)
            {
              /* This is a reloc against a symbol.  */
-             if (h->root.type == bfd_link_hash_defined)
+             if (h->root.type == bfd_link_hash_defined
+                 || h->root.type == bfd_link_hash_defweak)
                {
                  asection *hsec;
 
@@ -1781,6 +1785,51 @@ mips_relocate_section (output_bfd, info, input_bfd, input_section,
   return true;
 }
 \f
+/* Read in the relocs for a section.  */
+
+static boolean
+mips_read_relocs (abfd, sec)
+     bfd *abfd;
+     asection *sec;
+{
+  struct ecoff_section_tdata *section_tdata;
+
+  section_tdata = ecoff_section_data (abfd, sec);
+  if (section_tdata == (struct ecoff_section_tdata *) NULL)
+    {
+      sec->used_by_bfd =
+       (PTR) bfd_alloc_by_size_t (abfd, sizeof (struct ecoff_section_tdata));
+      if (sec->used_by_bfd == NULL)
+       return false;
+
+      section_tdata = ecoff_section_data (abfd, sec);
+      section_tdata->external_relocs = NULL;
+      section_tdata->contents = NULL;
+      section_tdata->offsets = NULL;
+    }
+
+  if (section_tdata->external_relocs == NULL)
+    {
+      bfd_size_type external_relocs_size;
+
+      external_relocs_size = (ecoff_backend (abfd)->external_reloc_size
+                             * sec->reloc_count);
+
+      section_tdata->external_relocs =
+       (PTR) bfd_alloc (abfd, external_relocs_size);
+      if (section_tdata->external_relocs == NULL && external_relocs_size != 0)
+       return false;
+
+      if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
+         || (bfd_read (section_tdata->external_relocs, 1,
+                       external_relocs_size, abfd)
+             != external_relocs_size))
+       return false;
+    }
+
+  return true;
+}
+
 /* Relax a section when linking a MIPS ECOFF file.  This is used for
    embedded PIC code, which always uses PC relative branches which
    only have an 18 bit range on MIPS.  If a branch is not in range, we
@@ -1838,40 +1887,16 @@ mips_relax_section (abfd, sec, info, again)
 
   /* Read in the relocs, if we haven't already got them.  */
   section_tdata = ecoff_section_data (abfd, sec);
-  if (section_tdata == (struct ecoff_section_tdata *) NULL)
+  if (section_tdata == (struct ecoff_section_tdata *) NULL
+      || section_tdata->external_relocs == NULL)
     {
-      bfd_size_type external_reloc_size;
-      bfd_size_type external_relocs_size;
-
-      sec->used_by_bfd =
-       (PTR) bfd_alloc_by_size_t (abfd, sizeof (struct ecoff_section_tdata));
-      if (sec->used_by_bfd == NULL)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         goto error_return;
-       }
-
-      section_tdata = ecoff_section_data (abfd, sec);
-      section_tdata->contents = NULL;
-      section_tdata->offsets = NULL;
-
-      external_reloc_size = ecoff_backend (abfd)->external_reloc_size;
-      external_relocs_size = external_reloc_size * sec->reloc_count;
-
-      section_tdata->external_relocs =
-       (PTR) bfd_alloc (abfd, external_relocs_size);
-      if (section_tdata->external_relocs == NULL && external_relocs_size != 0)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         goto error_return;
-       }
-
-      if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
-         || (bfd_read (section_tdata->external_relocs, 1,
-                       external_relocs_size, abfd)
-             != external_relocs_size))
+      if (! mips_read_relocs (abfd, sec))
        goto error_return;
+      section_tdata = ecoff_section_data (abfd, sec);
+    }
 
+  if (sec->_cooked_size == 0)
+    {
       /* We must initialize _cooked_size only the first time we are
         called.  */
       sec->_cooked_size = sec->_raw_size;
@@ -1904,7 +1929,7 @@ mips_relax_section (abfd, sec, info, again)
        continue;
 
       /* Quickly check that this reloc is external PCREL16.  */
-      if (abfd->xvec->header_byteorder_big_p)
+      if (bfd_header_big_endian (abfd))
        {
          if ((ext_rel->r_bits[3] & RELOC_BITS3_EXTERN_BIG) == 0
              || (((ext_rel->r_bits[3] & RELOC_BITS3_TYPE_BIG)
@@ -1927,7 +1952,8 @@ mips_relax_section (abfd, sec, info, again)
       if (h == (struct ecoff_link_hash_entry *) NULL)
        abort ();
 
-      if (h->root.type != bfd_link_hash_defined)
+      if (h->root.type != bfd_link_hash_defined
+         && h->root.type != bfd_link_hash_defweak)
        {
          /* Just ignore undefined symbols.  These will presumably
             generate an error later in the link.  */
@@ -1972,12 +1998,9 @@ mips_relax_section (abfd, sec, info, again)
          if (info->keep_memory)
            contents = (bfd_byte *) bfd_alloc (abfd, sec->_raw_size);
          else
-           contents = (bfd_byte *) malloc (sec->_raw_size);
+           contents = (bfd_byte *) bfd_malloc ((size_t) sec->_raw_size);
          if (contents == (bfd_byte *) NULL)
-           {
-             bfd_set_error (bfd_error_no_memory);
-             goto error_return;
-           }
+           goto error_return;
          if (! bfd_get_section_contents (abfd, sec, (PTR) contents,
                                          (file_ptr) 0, sec->_raw_size))
            goto error_return;
@@ -2013,10 +2036,7 @@ mips_relax_section (abfd, sec, info, again)
          size = sec->reloc_count * sizeof (long);
          offsets = (long *) bfd_alloc_by_size_t (abfd, size);
          if (offsets == (long *) NULL)
-           {
-             bfd_set_error (bfd_error_no_memory);
-             goto error_return;
-           }
+           goto error_return;
          memset (offsets, 0, size);
          section_tdata->offsets = offsets;
        }
@@ -2180,7 +2200,8 @@ mips_relax_section (abfd, sec, info, again)
 
          adj_h = *adj_h_ptr;
          if (adj_h != (struct ecoff_link_hash_entry *) NULL
-             && adj_h->root.type == bfd_link_hash_defined
+             && (adj_h->root.type == bfd_link_hash_defined
+                 || adj_h->root.type == bfd_link_hash_defweak)
              && adj_h->root.u.def.section == sec
              && adj_h->esym.asym.value > int_rel.r_vaddr)
            adj_h->root.u.def.value += PCREL16_EXPANSION_ADJUSTMENT;
@@ -2192,10 +2213,7 @@ mips_relax_section (abfd, sec, info, again)
       adjust = ((struct ecoff_value_adjust *)
                bfd_alloc (abfd, sizeof (struct ecoff_value_adjust)));
       if (adjust == (struct ecoff_value_adjust *) NULL)
-       {
-         bfd_set_error (bfd_error_no_memory);
-         goto error_return;
-       }
+       goto error_return;
 
       adjust->start = int_rel.r_vaddr;
       adjust->end = sec->vma + sec->_raw_size;
@@ -2258,6 +2276,130 @@ mips_relax_pcrel16 (info, input_bfd, input_section, h, location, address)
 
   return true;
 }
+
+/* Given a .sdata section and a .rel.sdata in-memory section, store
+   relocation information into the .rel.sdata section which can be
+   used at runtime to relocate the section.  This is called by the
+   linker when the --embedded-relocs switch is used.  This is called
+   after the add_symbols entry point has been called for all the
+   objects, and before the final_link entry point is called.  This
+   function presumes that the object was compiled using
+   -membedded-pic.  */
+
+boolean
+bfd_mips_ecoff_create_embedded_relocs (abfd, info, datasec, relsec, errmsg)
+     bfd *abfd;
+     struct bfd_link_info *info;
+     asection *datasec;
+     asection *relsec;
+     char **errmsg;
+{
+  struct ecoff_link_hash_entry **sym_hashes;
+  struct ecoff_section_tdata *section_tdata;
+  struct external_reloc *ext_rel;
+  struct external_reloc *ext_rel_end;
+  bfd_byte *p;
+
+  BFD_ASSERT (! info->relocateable);
+
+  *errmsg = NULL;
+
+  if (datasec->reloc_count == 0)
+    return true;
+
+  sym_hashes = ecoff_data (abfd)->sym_hashes;
+
+  if (! mips_read_relocs (abfd, datasec))
+    return false;
+
+  relsec->contents = (bfd_byte *) bfd_alloc (abfd, datasec->reloc_count * 4);
+  if (relsec->contents == NULL)
+    return false;
+
+  p = relsec->contents;
+
+  section_tdata = ecoff_section_data (abfd, datasec);
+  ext_rel = (struct external_reloc *) section_tdata->external_relocs;
+  ext_rel_end = ext_rel + datasec->reloc_count;
+  for (; ext_rel < ext_rel_end; ext_rel++, p += 4)
+    {
+      struct internal_reloc int_rel;
+      boolean text_relative;
+
+      mips_ecoff_swap_reloc_in (abfd, (PTR) ext_rel, &int_rel);
+
+      /* We are going to write a four byte word into the runtime reloc
+        section.  The word will be the address in the data section
+        which must be relocated.  This must be on a word boundary,
+        which means the lower two bits must be zero.  We use the
+        least significant bit to indicate how the value in the data
+        section must be relocated.  A 0 means that the value is
+        relative to the text section, while a 1 indicates that the
+        value is relative to the data section.  Given that we are
+        assuming the code was compiled using -membedded-pic, there
+        should not be any other possibilities.  */
+
+      /* We can only relocate REFWORD relocs at run time.  */
+      if (int_rel.r_type != MIPS_R_REFWORD)
+       {
+         *errmsg = "unsupported reloc type";
+         bfd_set_error (bfd_error_bad_value);
+         return false;
+       }
+
+      if (int_rel.r_extern)
+       {
+         struct ecoff_link_hash_entry *h;
+
+         h = sym_hashes[int_rel.r_symndx];
+         /* If h is NULL, that means that there is a reloc against an
+            external symbol which we thought was just a debugging
+            symbol.  This should not happen.  */
+         if (h == (struct ecoff_link_hash_entry *) NULL)
+           abort ();
+         if ((h->root.type == bfd_link_hash_defined
+              || h->root.type == bfd_link_hash_defweak)
+             && (h->root.u.def.section->flags & SEC_CODE) != 0)
+           text_relative = true;
+         else
+           text_relative = false;
+       }
+      else
+       {
+         switch (int_rel.r_symndx)
+           {
+           case RELOC_SECTION_TEXT:
+             text_relative = true;
+             break;
+           case RELOC_SECTION_SDATA:
+           case RELOC_SECTION_SBSS:
+           case RELOC_SECTION_LIT8:
+             text_relative = false;
+             break;
+           default:
+             /* No other sections should appear in -membedded-pic
+                 code.  */
+             *errmsg = "reloc against unsupported section";
+             bfd_set_error (bfd_error_bad_value);
+             return false;
+           }
+       }
+
+      if ((int_rel.r_offset & 3) != 0)
+       {
+         *errmsg = "reloc not properly aligned";
+         bfd_set_error (bfd_error_bad_value);
+         return false;
+       }
+
+      bfd_put_32 (abfd,
+                 (int_rel.r_vaddr - datasec->vma + datasec->output_offset
+                  + (text_relative ? 0 : 1)),
+                 p);
+    }
+
+  return true;
+}
 \f
 /* This is the ECOFF backend structure.  The backend field of the
    target vector points to this.  */
@@ -2275,13 +2417,13 @@ static const struct ecoff_backend_data mips_ecoff_backend_data =
     (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* reloc_out */
     mips_ecoff_swap_filehdr_out, mips_ecoff_swap_aouthdr_out,
     mips_ecoff_swap_scnhdr_out,
-    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, true,
+    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, true,
     mips_ecoff_swap_filehdr_in, mips_ecoff_swap_aouthdr_in,
-    mips_ecoff_swap_scnhdr_in, mips_ecoff_bad_format_hook,
-    _bfd_ecoff_set_arch_mach_hook, _bfd_ecoff_mkobject_hook,
-    _bfd_ecoff_styp_to_sec_flags, _bfd_ecoff_make_section_hook,
+    mips_ecoff_swap_scnhdr_in, NULL,
+    mips_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,
+    _bfd_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags,
     _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table,
-    NULL, NULL
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
   },
   /* Supported architecture.  */
   bfd_arch_mips,
@@ -2346,7 +2488,11 @@ static const struct ecoff_backend_data mips_ecoff_backend_data =
   mips_adjust_reloc_in,
   mips_adjust_reloc_out,
   /* Relocate section contents while linking.  */
-  mips_relocate_section
+  mips_relocate_section,
+  /* Do final adjustments to filehdr and aouthdr.  */
+  NULL,
+  /* Read an element from an archive at a given file position.  */
+  _bfd_get_elt_at_filepos
 };
 
 /* Looking up a reloc type is MIPS specific.  */
@@ -2356,26 +2502,28 @@ static const struct ecoff_backend_data mips_ecoff_backend_data =
 #define _bfd_ecoff_bfd_get_relocated_section_contents \
   bfd_generic_get_relocated_section_contents
 
+/* Handling file windows is generic.  */
+#define _bfd_ecoff_get_section_contents_in_window \
+  _bfd_generic_get_section_contents_in_window
+
 /* Relaxing sections is MIPS specific.  */
 #define _bfd_ecoff_bfd_relax_section mips_relax_section
 
-bfd_target ecoff_little_vec =
+const bfd_target ecoff_little_vec =
 {
   "ecoff-littlemips",          /* name */
   bfd_target_ecoff_flavour,
-  false,                       /* data byte order is little */
-  false,                       /* header byte order is little */
+  BFD_ENDIAN_LITTLE,           /* data byte order is little */
+  BFD_ENDIAN_LITTLE,           /* header byte order is little */
 
   (HAS_RELOC | EXEC_P |                /* object flags */
    HAS_LINENO | HAS_DEBUG |
    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
 
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* sect
-                                                           flags */
+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
   0,                           /* leading underscore */
   ' ',                         /* ar_pad_char */
   15,                          /* ar_max_namelen */
-  4,                           /* minimum alignment power */
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
@@ -2403,22 +2551,21 @@ bfd_target ecoff_little_vec =
   (PTR) &mips_ecoff_backend_data
 };
 
-bfd_target ecoff_big_vec =
+const bfd_target ecoff_big_vec =
 {
   "ecoff-bigmips",             /* name */
   bfd_target_ecoff_flavour,
-  true,                                /* data byte order is big */
-  true,                                /* header byte order is big */
+  BFD_ENDIAN_BIG,              /* data byte order is big */
+  BFD_ENDIAN_BIG,              /* header byte order is big */
 
   (HAS_RELOC | EXEC_P |                /* object flags */
    HAS_LINENO | HAS_DEBUG |
    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
 
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* sect flags */
+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
   0,                           /* leading underscore */
   ' ',                         /* ar_pad_char */
   15,                          /* ar_max_namelen */
-  4,                           /* minimum alignment power */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
      bfd_getb32, bfd_getb_signed_32, bfd_putb32,
      bfd_getb16, bfd_getb_signed_16, bfd_putb16,
This page took 0.0472050000000001 seconds and 4 git commands to generate.