* Makefile.in (TE_OBJS): Add empty definition.
[deliverable/binutils-gdb.git] / bfd / mipsbsd.c
index 5d1ce12f7d97921d42d509924e60ad41057a736d..9c610b430a1418c81d1b94e2c76ee32e4859fb38 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD backend for MIPS BSD (a.out) binaries.
-   Copyright (C) 1993 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
    Written by Ralph Campbell.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -19,7 +19,6 @@ along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #define BYTES_IN_WORD 4
-#define ARCH 32
 /* #define ENTRY_CAN_BE_ZERO */
 #define N_HEADER_IN_TEXT(x) 1
 #define N_SHARED_LIB(x) 0
@@ -32,6 +31,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define PAGE_SIZE 4096
 #define SEGMENT_SIZE PAGE_SIZE
 #define DEFAULT_ARCH bfd_arch_mips
+#define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN \
+                           || (mtype) == M_MIPS1 || (mtype) == M_MIPS2)
 #define MY_symbol_leading_char '\0'
 
 #define MY(OP) CAT(mipsbsd_,OP)
@@ -50,18 +51,21 @@ static void MY(choose_reloc_size) PARAMS ((bfd *abfd));
 #define MY_write_object_contents MY(write_object_contents)
 static boolean MY(write_object_contents) PARAMS ((bfd *abfd));
 
-#define MY_reloc_howto_type_lookup MY(reloc_howto_type_lookup)
-#define MY_canonicalize_reloc MY(canonicalize_reloc)
+/* We can't use MY(x) here because it leads to a recursive call to CAT
+   when expanded inside JUMP_TABLE.  */
+#define MY_bfd_reloc_type_lookup mipsbsd_reloc_howto_type_lookup
+#define MY_canonicalize_reloc mipsbsd_canonicalize_reloc
+
+#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
 
 #define MY_backend_data &MY(backend_data)
 #define MY_BFD_TARGET
 
 #include "aout-target.h"
 
-/*
- * These really should be common to all BSD systems.
- * Also, to reduce space, should ifdef the individual cases if MINIMIZE=1.
- */
 void
 MY(set_arch_mach) (abfd, machtype)
      bfd *abfd;
@@ -73,38 +77,6 @@ MY(set_arch_mach) (abfd, machtype)
   /* Determine the architecture and machine type of the object file. */
   switch (machtype) {
 
-  case M_68010:
-  case M_HP200:
-    arch = bfd_arch_m68k;
-    machine = 68010;
-    break;
-
-  case M_68020:
-  case M_HP300:
-    arch = bfd_arch_m68k;
-    machine = 68020;
-    break;
-
-  case M_SPARC:
-    arch = bfd_arch_sparc;
-    machine = 0;
-    break;
-
-  case M_386:
-    arch = bfd_arch_i386;
-    machine = 0;
-    break;
-
-  case M_29K:
-    arch = bfd_arch_a29k;
-    machine = 0;
-    break;
-
-  case M_HPUX:
-    arch = bfd_arch_m68k;
-    machine = 0;
-    break;
-
   case M_MIPS1:
     arch = bfd_arch_mips;
     machine = 3000;
@@ -205,20 +177,76 @@ MY(write_object_contents) (abfd)
 #define MIPS_RELOC_HI16_S      4
 #define MIPS_RELOC_LO16                5
 
+/*
+ * This is only called when performing a BFD_RELOC_MIPS_JMP relocation.
+ * The jump destination address is formed from the upper 4 bits of the
+ * "current" program counter concatenated with the jump instruction's
+ * 26 bit field and two trailing zeros.
+ * If the destination address is not in the same segment as the "current"
+ * program counter, then we need to signal an error.
+ */
+static bfd_reloc_status_type
+mips_fix_jmp_addr (abfd,reloc_entry,symbol,data,input_section,output_bfd)
+     bfd *abfd;
+     arelent *reloc_entry;
+     struct symbol_cache_entry *symbol;
+     PTR data;
+     asection *input_section;
+     bfd *output_bfd;
+{
+  bfd_vma relocation, pc;
+  /* If this is a partial relocation, just continue. */
+  if (output_bfd != (bfd *)NULL)
+    return bfd_reloc_continue;
+
+  /* If this is an undefined symbol, return error */
+  if (bfd_is_und_section (symbol->section)
+      && (symbol->flags & BSF_WEAK) == 0)
+    return bfd_reloc_undefined;
+
+  /* 
+   * Work out which section the relocation is targetted at and the
+   * initial relocation command value.
+   */
+  if (bfd_is_com_section (symbol->section))
+    relocation = 0;
+  else
+    relocation = symbol->value;
+
+  relocation += symbol->section->output_section->vma;
+  relocation += symbol->section->output_offset;
+  relocation += reloc_entry->addend;
+
+  pc = input_section->output_section->vma + input_section->output_offset +
+    reloc_entry->address + 4;
+
+  if ((relocation & 0xF0000000) != (pc & 0xF0000000))
+    return bfd_reloc_overflow;
+
+  return bfd_reloc_continue;
+}
+
 /*
  * This is only called when performing a BFD_RELOC_HI16_S relocation.
  * We need to see if bit 15 is set in the result. If it is, we add
  * 0x10000 and continue normally. This will compensate for the sign extension
  * when the low bits are added at run time.
  */
-bfd_reloc_status_type
-mips_fix_hi16_s (abfd,reloc_entry,symbol,data,input_section,output_bfd)
+static bfd_reloc_status_type
+mips_fix_hi16_s PARAMS ((bfd *, arelent *, asymbol *, PTR,
+                        asection *, bfd *, char **));
+
+static bfd_reloc_status_type
+mips_fix_hi16_s (abfd, reloc_entry, symbol, data, input_section,
+                output_bfd, error_message)
      bfd *abfd;
      arelent *reloc_entry;
-     struct symbol_cache_entry *symbol;
+     asymbol *symbol;
      PTR data;
      asection *input_section;
      bfd *output_bfd;
+     char **error_message;
 {
   bfd_vma relocation;
  
@@ -226,11 +254,16 @@ mips_fix_hi16_s (abfd,reloc_entry,symbol,data,input_section,output_bfd)
   if (output_bfd != (bfd *)NULL)
     return bfd_reloc_continue;
 
+  /* If this is an undefined symbol, return error */
+  if (bfd_is_und_section (symbol->section)
+      && (symbol->flags & BSF_WEAK) == 0)
+    return bfd_reloc_undefined;
+
   /* 
    * Work out which section the relocation is targetted at and the
    * initial relocation command value.
    */
-  if (symbol->section == &bfd_com_section)
+  if (bfd_is_com_section (symbol->section))
     relocation = 0;
   else
     relocation = symbol->value;
@@ -246,59 +279,46 @@ mips_fix_hi16_s (abfd,reloc_entry,symbol,data,input_section,output_bfd)
 }
 
 static reloc_howto_type mips_howto_table_ext[] = {
-  MIPS_RELOC_32,      0, 2, 32, false, 0, true,  true, 0,
-       "32",       false, 0, 0xffffffff, false,
-  MIPS_RELOC_JMP,     2, 2, 26, false, 0, false, true, 0,
-       "MIPS_JMP", false, 0, 0x03ffffff, false,
-  MIPS_RELOC_WDISP16, 2, 1, 16, true,  0, false, true, 0,
-       "WDISP16",  false, 0, 0x0000ffff, false,
-  MIPS_RELOC_HI16,   16, 1, 16, false, 0, false, true, 0,
-       "HI16",     false, 0, 0x0000ffff, false,
-  MIPS_RELOC_HI16_S, 16, 1, 16, false, 0, false, true, mips_fix_hi16_s,
-       "HI16_S",   false, 0, 0x0000ffff, false,
-  MIPS_RELOC_LO16,    0, 1, 16, false, 0, false, true, 0,
-       "LO16",     false, 0, 0x0000ffff, false,
+  {MIPS_RELOC_32,      0, 2, 32, false, 0,  complain_overflow_bitfield, 0,
+       "32",       false, 0, 0xffffffff, false},
+  {MIPS_RELOC_JMP,     2, 2, 26, false, 0, complain_overflow_dont,
+       mips_fix_jmp_addr,
+       "MIPS_JMP", false, 0, 0x03ffffff, false},
+  {MIPS_RELOC_WDISP16, 2, 2, 16, true,  0, complain_overflow_signed, 0,
+       "WDISP16",  false, 0, 0x0000ffff, false},
+  {MIPS_RELOC_HI16,   16, 2, 16, false, 0, complain_overflow_bitfield, 0,
+       "HI16",     false, 0, 0x0000ffff, false},
+  {MIPS_RELOC_HI16_S, 16, 2, 16, false, 0, complain_overflow_bitfield,
+        mips_fix_hi16_s,
+        "HI16_S",   false, 0, 0x0000ffff, false},
+  {MIPS_RELOC_LO16,    0, 2, 16, false, 0, complain_overflow_dont, 0,
+       "LO16",     false, 0, 0x0000ffff, false},
 };
 
-static reloc_howto_type *
+static const reloc_howto_type *
 MY(reloc_howto_type_lookup) (abfd, code)
      bfd *abfd;
      bfd_reloc_code_real_type code;
 {
-  extern reloc_howto_type NAME(aout,ext_howto_table)[];
 
-  switch (bfd_get_arch (abfd))
+  if (bfd_get_arch (abfd) != bfd_arch_mips)
+    return 0;
+
+  switch (code)
     {
-    case bfd_arch_sparc:
-      switch (code)
-       {
-       default:
-         return 0;
-#define IDX(i,j)       case i: return &NAME(aout,ext_howto_table)[j]
-       IDX (BFD_RELOC_CTOR, 2);
-       IDX (BFD_RELOC_32, 2);
-       IDX (BFD_RELOC_HI22, 8);
-       IDX (BFD_RELOC_LO10, 11);
-       IDX (BFD_RELOC_32_PCREL_S2, 6);
-       }
-    case bfd_arch_mips:
-      switch (code)
-       {
-       case BFD_RELOC_32:
-         return (&mips_howto_table_ext[MIPS_RELOC_32]);
-       case BFD_RELOC_MIPS_JMP:
-         return (&mips_howto_table_ext[MIPS_RELOC_JMP]);
-       case BFD_RELOC_16_PCREL_S2:
-         return (&mips_howto_table_ext[MIPS_RELOC_WDISP16]);
-       case BFD_RELOC_HI16:
-         return (&mips_howto_table_ext[MIPS_RELOC_HI16]);
-       case BFD_RELOC_HI16_S:
-         return (&mips_howto_table_ext[MIPS_RELOC_HI16_S]);
-       case BFD_RELOC_LO16:
-         return (&mips_howto_table_ext[MIPS_RELOC_LO16]);
-       default:
-         return 0;
-       }
+    case BFD_RELOC_CTOR:
+    case BFD_RELOC_32:
+      return (&mips_howto_table_ext[MIPS_RELOC_32]);
+    case BFD_RELOC_MIPS_JMP:
+      return (&mips_howto_table_ext[MIPS_RELOC_JMP]);
+    case BFD_RELOC_16_PCREL_S2:
+      return (&mips_howto_table_ext[MIPS_RELOC_WDISP16]);
+    case BFD_RELOC_HI16:
+      return (&mips_howto_table_ext[MIPS_RELOC_HI16]);
+    case BFD_RELOC_HI16_S:
+      return (&mips_howto_table_ext[MIPS_RELOC_HI16_S]);
+    case BFD_RELOC_LO16:
+      return (&mips_howto_table_ext[MIPS_RELOC_LO16]);
     default:
       return 0;
     }
@@ -308,7 +328,7 @@ MY(reloc_howto_type_lookup) (abfd, code)
  * This is just like the standard aoutx.h version but we need to do our
  * own mapping of external reloc type values to howto entries.
  */
-unsigned int
+long
 MY(canonicalize_reloc)(abfd, section, relptr, symbols)
       bfd *abfd;
       sec_ptr section;
@@ -338,10 +358,8 @@ MY(canonicalize_reloc)(abfd, section, relptr, symbols)
   }
 
   if (!NAME(aout,slurp_reloc_table)(abfd, section, symbols))
-    return 0;
+    return -1;
   tblptr = section->relocation;
-  if (!tblptr)
-    return 0;
 
   /* fix up howto entries */
   for (count = 0; count++ < section->reloc_count;) 
@@ -358,27 +376,38 @@ MY(canonicalize_reloc)(abfd, section, relptr, symbols)
 static CONST struct aout_backend_data MY(backend_data) = {
   0,                           /* zmagic contiguous */
   1,                           /* text incl header */
+  0,                           /* exec_hdr_flags */
   PAGE_SIZE,                   /* text vma */
   MY_set_sizes,
   0,                           /* text size includes exec header */
+  0,                           /* add_dynamic_symbols */
+  0,                           /* add_one_symbol */
+  0,                           /* link_dynamic_object */
+  0,                           /* write_dynamic_symbol */
+  0,                           /* check_dynamic_reloc */
+  0                            /* finish_dynamic_link */
 };
 
-bfd_target aout_mips_little_vec =
+const bfd_target aout_mips_little_vec =
 {
-  "aout-mips-little",          /* name */
+  "a.out-mips-little",         /* name */
   bfd_target_aout_flavour,
   false,                       /* target byte order (little) */
   false,                       /* target headers byte order (little) */
   (HAS_RELOC | EXEC_P |                /* object flags */
    HAS_LINENO | HAS_DEBUG |
-   HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
+   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
   MY_symbol_leading_char,
   ' ',                         /* ar_pad_char */
   15,                          /* ar_max_namelen */
   1,                           /* minimum alignment */
-  _do_getl64, _do_putl64, _do_getl32, _do_putl32, _do_getl16, _do_putl16, /* data */
-  _do_getl64, _do_putl64, _do_getl32, _do_putl32, _do_getl16, _do_putl16, /* hdrs */
+  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 */
+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
     {_bfd_dummy_target, MY_object_p, /* bfd_check_format */
        bfd_generic_archive_p, MY_core_file_p},
     {bfd_false, MY_mkobject,   /* bfd_set_format */
@@ -386,56 +415,39 @@ bfd_target aout_mips_little_vec =
     {bfd_false, MY_write_object_contents, /* bfd_write_contents */
        _bfd_write_archive_contents, bfd_false},
 
-  MY_core_file_failing_command,
-  MY_core_file_failing_signal,
-  MY_core_file_matches_executable_p,
-  MY_slurp_armap,
-  MY_slurp_extended_name_table,
-  MY_truncate_arname,
-  MY_write_armap,
-  MY_close_and_cleanup,
-  MY_set_section_contents,
-  MY_get_section_contents,
-  MY_new_section_hook,
-  MY_get_symtab_upper_bound,
-  MY_get_symtab,
-  MY_get_reloc_upper_bound,
-  MY_canonicalize_reloc,
-  MY_make_empty_symbol,
-  MY_print_symbol,
-  MY_get_lineno,
-  MY_set_arch_mach,
-  MY_openr_next_archived_file,
-  MY_find_nearest_line,
-  MY_generic_stat_arch_elt,
-  MY_sizeof_headers,
-  MY_bfd_debug_info_start,
-  MY_bfd_debug_info_end,
-  MY_bfd_debug_info_accumulate,
-  bfd_generic_get_relocated_section_contents,
-  bfd_generic_relax_section,
-  bfd_generic_seclet_link,
-  MY_reloc_howto_type_lookup,
-  MY_make_debug_symbol,
+     BFD_JUMP_TABLE_GENERIC (MY),
+     BFD_JUMP_TABLE_COPY (MY),
+     BFD_JUMP_TABLE_CORE (MY),
+     BFD_JUMP_TABLE_ARCHIVE (MY),
+     BFD_JUMP_TABLE_SYMBOLS (MY),
+     BFD_JUMP_TABLE_RELOCS (MY),
+     BFD_JUMP_TABLE_WRITE (MY),
+     BFD_JUMP_TABLE_LINK (MY),
+     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+
   (PTR) MY_backend_data,
 };
 
-bfd_target aout_mips_big_vec =
+const bfd_target aout_mips_big_vec =
 {
-  "aout-mips-big",             /* name */
+  "a.out-mips-big",            /* name */
   bfd_target_aout_flavour,
   true,                                /* target byte order (big) */
   true,                                /* target headers byte order (big) */
   (HAS_RELOC | EXEC_P |                /* object flags */
    HAS_LINENO | HAS_DEBUG |
-   HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
+   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
   MY_symbol_leading_char,
   ' ',                         /* ar_pad_char */
   15,                          /* ar_max_namelen */
   1,                           /* minimum alignment */
-  _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* data */
-  _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs */
+  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 */
+  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
+     bfd_getb32, bfd_getb_signed_32, bfd_putb32,
+     bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
     {_bfd_dummy_target, MY_object_p, /* bfd_check_format */
        bfd_generic_archive_p, MY_core_file_p},
     {bfd_false, MY_mkobject,   /* bfd_set_format */
@@ -443,36 +455,15 @@ bfd_target aout_mips_big_vec =
     {bfd_false, MY_write_object_contents, /* bfd_write_contents */
        _bfd_write_archive_contents, bfd_false},
 
-  MY_core_file_failing_command,
-  MY_core_file_failing_signal,
-  MY_core_file_matches_executable_p,
-  MY_slurp_armap,
-  MY_slurp_extended_name_table,
-  MY_truncate_arname,
-  MY_write_armap,
-  MY_close_and_cleanup,
-  MY_set_section_contents,
-  MY_get_section_contents,
-  MY_new_section_hook,
-  MY_get_symtab_upper_bound,
-  MY_get_symtab,
-  MY_get_reloc_upper_bound,
-  MY_canonicalize_reloc,
-  MY_make_empty_symbol,
-  MY_print_symbol,
-  MY_get_lineno,
-  MY_set_arch_mach,
-  MY_openr_next_archived_file,
-  MY_find_nearest_line,
-  MY_generic_stat_arch_elt,
-  MY_sizeof_headers,
-  MY_bfd_debug_info_start,
-  MY_bfd_debug_info_end,
-  MY_bfd_debug_info_accumulate,
-  bfd_generic_get_relocated_section_contents,
-  bfd_generic_relax_section,
-  bfd_generic_seclet_link,
-  MY_reloc_howto_type_lookup,
-  MY_make_debug_symbol,
+     BFD_JUMP_TABLE_GENERIC (MY),
+     BFD_JUMP_TABLE_COPY (MY),
+     BFD_JUMP_TABLE_CORE (MY),
+     BFD_JUMP_TABLE_ARCHIVE (MY),
+     BFD_JUMP_TABLE_SYMBOLS (MY),
+     BFD_JUMP_TABLE_RELOCS (MY),
+     BFD_JUMP_TABLE_WRITE (MY),
+     BFD_JUMP_TABLE_LINK (MY),
+     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+
   (PTR) MY_backend_data,
 };
This page took 0.02741 seconds and 4 git commands to generate.