diff -urN gdb-4.14/bfd/Makefile.in gdb-4.14.1/bfd/Makefile.in
--- gdb-4.14/bfd/Makefile.in	Fri Mar  3 20:01:23 1995
+++ gdb-4.14.1/bfd/Makefile.in	Tue Aug 29 09:58:24 1995
@@ -163,10 +163,12 @@
 	i386mach3.o \
 	i386os9k.o \
 	ieee.o \
+	m68klinux.o \
 	m68klynx.o \
 	m68knetbsd.o \
 	m88kmach3.o \
 	mipsbsd.o \
+	mipslinux.o \
 	newsos3.o \
 	nlm.o \
 	nlm32-i386.o \
@@ -247,14 +249,14 @@
 	 i386bsd.c i386dynix.c cpu-h8300.c cpu-i960.c cpu-sparc.c cpu-m68k.c \
 	 cpu-m88k.c cpu-vax.c cpu-mips.c cpu-a29k.c cpu-i386.c cpu-powerpc.c cpu-w65.c \
 	 cpu-rs6000.c coff-h8300.c som.c cpu-hppa.c cpu-we32k.c reloc16.c \
-	 mipsbsd.c cpu-sh.c \
+	 mipsbsd.c mipslinux.c cpu-sh.c \
 	 elf.c elf32.c elf32-sparc.c elf32-i386.c elf32-i860.c elf32-m68k.c \
 	 elf32-hppa.c elf32-m88k.c elf32-mips.c elf32-gen.c elf32-ppc.c \
 	 elf64.c elf64-gen.c elf64-sparc.c \
 	 nlm.c nlm32.c nlm32-i386.c nlm32-sparc.c nlm32-alpha.c \
 	 nlm64.c coff-alpha.c cpu-alpha.c nlm32-ppc.c \
 	 hp300bsd.c hp300hpux.c \
-	 i386lynx.c cf-i386lynx.c m68klynx.c cf-m68klynx.c \
+	 i386lynx.c cf-i386lynx.c m68klinux.c m68klynx.c cf-m68klynx.c \
 	 sparclynx.c cf-sparclynx.c aix386-core.c hpux-core.c \
 	 irix-core.c lynx-core.c osf-core.c hash.c linker.c cofflink.c \
 	 m68knetbsd.c ns32knetbsd.c sparcnetbsd.c
@@ -657,6 +659,9 @@
 cpu-i386.o: cpu-i386.c
 cpu-powerpc.o: cpu-powerpc.c
 cpu-rs6000.o: cpu-rs6000.c
+mipslinux.o : mipslinux.c $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \
+  $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h libaout.h \
+  aout-target.h linux.h
 coff-h8300.o: coff-h8300.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/h8300.h \
   $(INCDIR)/coff/internal.h libcoff.h coffcode.h coffswap.h
 som.o: som.c
@@ -722,6 +727,9 @@
 nlm32-sparc.o: nlm32-sparc.c $(INCDIR)/nlm/sparc32-ext.h \
   libnlm.h $(INCDIR)/nlm/common.h $(INCDIR)/nlm/internal.h \
   $(INCDIR)/nlm/external.h nlmswap.h nlm-target.h
+m68klinux.o : m68klinux.c $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \
+  $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h libaout.h \
+  aout-target.h linux.h
 nlm32-alpha.o: nlm32-alpha.c $(INCDIR)/nlm/alpha-ext.h \
   libnlm.h $(INCDIR)/nlm/common.h $(INCDIR)/nlm/internal.h \
   $(INCDIR)/nlm/external.h nlmswap.h nlm-target.h
diff -urN gdb-4.14/bfd/config/m68k-linux.mt gdb-4.14.1/bfd/config/m68k-linux.mt
--- gdb-4.14/bfd/config/m68k-linux.mt	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/config/m68k-linux.mt	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,4 @@
+# Target: Motorola 68000 running linux using a.out
+
+DEFAULT_VECTOR=m68klinux_vec
+SELECT_ARCHITECTURES=bfd_m68k_arch
diff -urN gdb-4.14/bfd/config/m68klinux.mh gdb-4.14.1/bfd/config/m68klinux.mh
--- gdb-4.14/bfd/config/m68klinux.mh	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/config/m68klinux.mh	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,2 @@
+HDEFINES=-DTRAD_CORE
+HDEPFILES=trad-core.o
diff -urN gdb-4.14/bfd/config/mipslinux.mh gdb-4.14.1/bfd/config/mipslinux.mh
--- gdb-4.14/bfd/config/mipslinux.mh	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/config/mipslinux.mh	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,3 @@
+CC=gcc
+HDEFINES=-DTRAD_CORE -G 0
+HDEPFILES=trad-core.o
diff -urN gdb-4.14/bfd/config/mipsllinux.mt gdb-4.14.1/bfd/config/mipsllinux.mt
--- gdb-4.14/bfd/config/mipsllinux.mt	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/config/mipsllinux.mt	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,5 @@
+# Target: MIPS processor running Linux using a.out
+
+DEFAULT_VECTOR=mipslinux_little_vec
+SELECT_VECS=ecoff_big_vec ecoff_little_vec bfd_elf32_bigmips_vec bfd_elf32_littlemips_vec
+SELECT_ARCHITECTURES=bfd_mips_arch
diff -urN gdb-4.14/bfd/config.bfd gdb-4.14.1/bfd/config.bfd
--- gdb-4.14/bfd/config.bfd	Fri Mar  3 20:01:27 1995
+++ gdb-4.14.1/bfd/config.bfd	Tue Aug 29 09:53:36 1995
@@ -65,6 +65,7 @@
   i960-*-vxworks5.*)	bfd_name=i960-coff strip_underscore=yes ;;
   i960-*-vxworks*)	bfd_name=i960-bout strip_underscore=yes ;;
   i960-*-aout*)		bfd_name=i960-bout strip_underscore=yes ;;
+  m68*-*-linux*)	bfd_name=m68k-linux strip_underscore=yes  ;;
   i960-*-bout*)		bfd_name=i960-bout strip_underscore=yes ;;
   i960-*-coff*)		bfd_name=i960-coff strip_underscore=yes ;;
   i960-*-nindy*)	bfd_name=i960-bout strip_underscore=yes ;;
@@ -107,6 +108,8 @@
   mips*-*-bsd*)		bfd_name=bigmips ;; # Sony News
   mips*el-*-elf*)	bfd_name=mipslelf ;;
   mips*-*-elf*)		bfd_name=mipsbelf ;;
+  mips*el-*-linux*)	bfd_name=mipsllinux ;;
+  mips*-*-linux*)	bfd_name=mipsblinux ;;
   ns32k-pc532-mach*)	bfd_name=pc532-mach strip_underscore=yes;;
   ns32k-*-netbsd*)	bfd_name=ns32k-nbsd strip_underscore=yes;;
   powerpc-*-aix*)	bfd_name=rs6000 ;;
diff -urN gdb-4.14/bfd/configure.host gdb-4.14.1/bfd/configure.host
--- gdb-4.14/bfd/configure.host	Tue Nov 29 23:24:42 1994
+++ gdb-4.14.1/bfd/configure.host	Tue Aug 29 09:53:36 1995
@@ -54,6 +54,7 @@
 mips-dec-*)		my_host=decstation ;;
 mips-sgi-irix3*)	my_host=irix3 ;;
 mips-sgi-irix4*)	my_host=irix4 ;;
+mips-*-linux*)		my_host=mipslinux ;;
 mips-sgi-irix5*)	my_host=irix5 ;;
 mips-*-mach3*)		my_host=mipsmach3 ;;
 mips-*-sysv4*)		my_host=sysv4 ;;
@@ -70,6 +71,7 @@
 m68*-cbm-sysv4*)	my_host=m68kv4 ;;
 m68*-hp-hpux*)		my_host=hp300 ;;
 m68*-hp-bsd*)		my_host=hp300bsd ;;
+m68*-*-linux*)		my_host=m68klinux ;;
 m68*-*-lynxos*)		my_host=m68klynx ;;
 m68*-motorola-sysv*)	my_host=delta68 ;;
 m68*-sony-*)		my_host=news ;;
diff -urN gdb-4.14/bfd/configure.in gdb-4.14.1/bfd/configure.in
--- gdb-4.14/bfd/configure.in	Fri Mar  3 20:01:28 1995
+++ gdb-4.14.1/bfd/configure.in	Tue Aug 29 09:58:24 1995
@@ -187,10 +187,12 @@
     ieee_vec)			tb="$tb ieee.o" ;;
     m68kcoff_vec)		tb="$tb coff-m68k.o cofflink.o" ;;
     m68kcoffun_vec)		tb="$tb coff-u68k.o coff-m68k.o cofflink.o" ;;
+    m68klinux_vec)		tb="$tb m68klinux.o aout32.o stab-syms.o" ;;
     m68klynx_aout_vec)		tb="$tb m68klynx.o lynx-core.o aout32.o stab-syms.o" ;;
     m68klynx_coff_vec)		tb="$tb cf-m68klynx.o coff-m68k.o cofflink.o lynx-core.o stab-syms.o" ;;
     m68knetbsd_vec)		tb="$tb m68knetbsd.o aout32.o stab-syms.o" ;;
     m88kbcs_vec)		tb="$tb coff-m88k.o" ;;
+    mipslinux_little_vec)	tb="$tb mipslinux.o aout32.o stab-syms.o" ;;
     newsos3_vec)		tb="$tb newsos3.o aout32.o stab-syms.o" ;;
     nlm32_i386_vec)		tb="$tb nlm32-i386.o nlm32.o nlm.o" ;;
     nlm32_sparc_vec)		tb="$tb nlm32-sparc.o nlm32.o nlm.o" ;;
diff -urN gdb-4.14/bfd/hosts/i386linux.h gdb-4.14.1/bfd/hosts/i386linux.h
--- gdb-4.14/bfd/hosts/i386linux.h	Fri Sep 17 11:07:40 1993
+++ gdb-4.14.1/bfd/hosts/i386linux.h	Tue Aug 29 09:53:36 1995
@@ -2,7 +2,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #define DONTDECLARE_MALLOC
-#include "hosts/i386v.h"
+#include "hosts/linux.h"
 
 /* Might be required by trad-core.c (not sure if it is).  */
 #include <sys/file.h>
diff -urN gdb-4.14/bfd/hosts/linux.h gdb-4.14.1/bfd/hosts/linux.h
--- gdb-4.14/bfd/hosts/linux.h	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/hosts/linux.h	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,15 @@
+#include <ansidecl.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+
+#define USE_UTIME
+
+#include <string.h>
+
+#include "fopen-same.h"
diff -urN gdb-4.14/bfd/hosts/m68klinux.h gdb-4.14.1/bfd/hosts/m68klinux.h
--- gdb-4.14/bfd/hosts/m68klinux.h	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/hosts/m68klinux.h	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,17 @@
+#include <stddef.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "hosts/linux.h"
+
+/* Might be required by trad-core.c (not sure if it is).  */
+#include <sys/file.h>
+
+/* Linux writes the task structure at the end of the core file.  Currently it
+   is 2912 bytes.  It is possible that this should be a pickier check, but
+   we should probably not be too picky (the size of the task structure might
+   vary, and if it's not the length we expect it to be, it doesn't affect
+   our ability to process the core file).  So allow 0-4096 extra bytes at
+   the end.  */
+
+#define TRAD_CORE_EXTRA_SIZE_ALLOWED 4096
+#define HOST_BIG_ENDIAN_P
diff -urN gdb-4.14/bfd/hosts/mipslinux.h gdb-4.14.1/bfd/hosts/mipslinux.h
--- gdb-4.14/bfd/hosts/mipslinux.h	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/hosts/mipslinux.h	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,17 @@
+#include <stddef.h>
+#include <stdlib.h>
+#include <unistd.h>
+#define DONTDECLARE_MALLOC
+#include "hosts/linux.h"
+
+/* Might be required by trad-core.c (not sure if it is).  */
+#include <sys/file.h>
+
+/* Linux writes the task structure at the end of the core file.  Currently it
+   is 2912 bytes.  It is possible that this should be a pickier check, but
+   we should probably not be too picky (the size of the task structure might
+   vary, and if it's not the length we expect it to be, it doesn't affect
+   our ability to process the core file).  So allow 0-4096 extra bytes at
+   the end.  */
+
+#define TRAD_CORE_EXTRA_SIZE_ALLOWED 4096
diff -urN gdb-4.14/bfd/linux.h gdb-4.14.1/bfd/linux.h
--- gdb-4.14/bfd/linux.h	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/linux.h	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,739 @@
+/* BFD back-end for linux flavored a.out binaries.
+   Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+
+This file is part of BFD, the Binary File Descriptor library.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+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.  */
+
+
+/* We always generate QMAGIC files in preference to ZMAGIC files.  It
+   would be possible to make this a linker option, if that ever
+   becomes important.  */
+
+static void MY_final_link_callback
+  PARAMS ((bfd *, file_ptr *, file_ptr *, file_ptr *));
+
+static boolean
+MY(bfd_final_link) (abfd, info)
+     bfd *abfd;
+     struct bfd_link_info *info;
+{
+  obj_aout_subformat (abfd) = q_magic_format;
+  return NAME(aout,final_link) (abfd, info, MY_final_link_callback);
+}
+
+#define MY_bfd_final_link MY(bfd_final_link)
+
+/*
+ * Determine the size of a relocation entry, based on the architecture
+ */
+static void
+MY(choose_reloc_size) (abfd)
+     bfd *abfd;
+{
+  switch (bfd_get_arch(abfd)) {
+  case bfd_arch_mips:
+    obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
+    break;
+  default:
+    obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
+    break;
+  }
+}
+
+static void MY(choose_reloc_size) PARAMS ((bfd *abfd));
+
+/* Set the machine type correctly.  */
+
+static boolean
+MY(write_object_contents) (abfd)
+     bfd *abfd;
+{
+  struct external_exec exec_bytes;
+  struct internal_exec *execp = exec_hdr (abfd);
+
+  /* Magic number, maestro, please!  */
+  switch (bfd_get_arch(abfd)) {
+  case bfd_arch_i386:
+    N_SET_MACHTYPE (*execp, M_386);
+    break;
+  case bfd_arch_m68k:
+    switch (bfd_get_mach(abfd)) {
+    case 68010:
+      N_SET_MACHTYPE(*execp, M_68010);
+      break;
+    default:
+    case 68020:
+      N_SET_MACHTYPE(*execp, M_68020);
+      break;
+    }
+    break;
+  default:
+    N_SET_MACHTYPE(*execp, M_UNKNOWN);
+  }
+
+  MY(choose_reloc_size)(abfd);
+
+  WRITE_HEADERS(abfd, execp);
+
+  return true;
+}
+
+#define MY_write_object_contents MY(write_object_contents)
+
+/* Code to link against Linux a.out shared libraries.  */
+
+/* See if a symbol name is a reference to the global offset table.  */
+
+#ifndef GOT_REF_PREFIX
+#define	GOT_REF_PREFIX	"__GOT_"
+#endif
+
+#define IS_GOT_SYM(name) \
+  (strncmp (name, GOT_REF_PREFIX, sizeof GOT_REF_PREFIX - 1) == 0)
+
+/* See if a symbol name is a reference to the procedure linkage table.  */
+
+#ifndef PLT_REF_PREFIX
+#define	PLT_REF_PREFIX	"__PLT_"
+#endif
+
+#define IS_PLT_SYM(name) \
+  (strncmp (name, PLT_REF_PREFIX, sizeof PLT_REF_PREFIX - 1) == 0)
+
+/* This special symbol is a set vector that contains a list of
+   pointers to fixup tables.  It will be present in any dynamicly
+   linked file.  The linker generated fixup table should also be added
+   to the list, and it should always appear in the second slot (the
+   first one is a dummy with a magic number that is defined in
+   crt0.o).  */
+
+#ifndef SHARABLE_CONFLICTS
+#define SHARABLE_CONFLICTS "__SHARABLE_CONFLICTS__"
+#endif
+
+/* We keep a list of fixups.  The terminology is a bit strange, but
+   each fixup contains two 32 bit numbers.  A regular fixup contains
+   an address and a pointer, and at runtime we should store the
+   address at the location pointed to by the pointer.  A builtin fixup
+   contains two pointers, and we should read the address using one
+   pointer and store it at the location pointed to by the other
+   pointer.  Builtin fixups come into play when we have duplicate
+   __GOT__ symbols for the same variable.  The builtin fixup will copy
+   the GOT pointer from one over into the other.  */
+
+struct fixup
+{
+  struct fixup *next;
+  struct linux_link_hash_entry *h;
+  bfd_vma value;
+
+  /* Nonzero if this is a jump instruction that needs to be fixed,
+     zero if this is just a pointer */
+  char jump;
+
+  char builtin;
+};
+
+/* We don't need a special hash table entry structure, but we do need
+   to keep some information between linker passes, so we use a special
+   hash table.  */
+
+struct linux_link_hash_entry
+{
+  struct aout_link_hash_entry root;
+};
+
+struct linux_link_hash_table
+{
+  struct aout_link_hash_table root;
+
+  /* First dynamic object found in link.  */
+  bfd *dynobj;
+
+  /* Number of fixups.  */
+  size_t fixup_count;
+
+  /* Number of builtin fixups.  */
+  size_t local_builtins;
+
+  /* List of fixups.  */
+  struct fixup *fixup_list;
+};
+
+static struct bfd_hash_entry *linux_link_hash_newfunc
+  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
+static struct bfd_link_hash_table *linux_link_hash_table_create
+  PARAMS ((bfd *));
+static struct fixup *new_fixup
+  PARAMS ((struct bfd_link_info *, struct linux_link_hash_entry *,
+	   bfd_vma, int));
+static boolean linux_link_create_dynamic_sections
+  PARAMS ((bfd *, struct bfd_link_info *));
+static boolean linux_add_one_symbol
+  PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, asection *,
+	   bfd_vma, const char *, boolean, boolean,
+	   struct bfd_link_hash_entry **));
+static boolean linux_tally_symbols
+  PARAMS ((struct linux_link_hash_entry *, PTR));
+static boolean linux_finish_dynamic_link
+  PARAMS ((bfd *, struct bfd_link_info *));
+
+/* Routine to create an entry in an Linux link hash table.  */
+
+static struct bfd_hash_entry *
+linux_link_hash_newfunc (entry, table, string)
+     struct bfd_hash_entry *entry;
+     struct bfd_hash_table *table;
+     const char *string;
+{
+  struct linux_link_hash_entry *ret = (struct linux_link_hash_entry *) entry;
+
+  /* Allocate the structure if it has not already been allocated by a
+     subclass.  */
+  if (ret == (struct linux_link_hash_entry *) NULL)
+    ret = ((struct linux_link_hash_entry *)
+	   bfd_hash_allocate (table, sizeof (struct linux_link_hash_entry)));
+  if (ret == NULL)
+    return (struct bfd_hash_entry *) ret;
+
+  /* Call the allocation method of the superclass.  */
+  ret = ((struct linux_link_hash_entry *)
+	 NAME(aout,link_hash_newfunc) ((struct bfd_hash_entry *) ret,
+				       table, string));
+  if (ret != NULL)
+    {
+      /* Set local fields; there aren't any.  */
+    }
+
+  return (struct bfd_hash_entry *) ret;
+}
+
+/* Create a Linux link hash table.  */
+
+static struct bfd_link_hash_table *
+linux_link_hash_table_create (abfd)
+     bfd *abfd;
+{
+  struct linux_link_hash_table *ret;
+
+  ret = ((struct linux_link_hash_table *)
+	 malloc (sizeof (struct linux_link_hash_table)));
+  if (ret == (struct linux_link_hash_table *) NULL)
+    {
+      bfd_set_error (bfd_error_no_memory);
+      return (struct bfd_link_hash_table *) NULL;
+    }
+  if (! NAME(aout,link_hash_table_init) (&ret->root, abfd,
+					 linux_link_hash_newfunc))
+    {
+      free (ret);
+      return (struct bfd_link_hash_table *) NULL;
+    }
+
+  ret->dynobj = NULL;
+  ret->fixup_count = 0;
+  ret->local_builtins = 0;
+  ret->fixup_list = NULL;
+
+  return &ret->root.root;
+}
+
+/* Look up an entry in a Linux link hash table.  */
+
+#define linux_link_hash_lookup(table, string, create, copy, follow) \
+  ((struct linux_link_hash_entry *) \
+   aout_link_hash_lookup (&(table)->root, (string), (create), (copy),\
+			  (follow)))
+
+/* Traverse a Linux link hash table.  */
+
+#define linux_link_hash_traverse(table, func, info)			\
+  (aout_link_hash_traverse						\
+   (&(table)->root,							\
+    (boolean (*) PARAMS ((struct aout_link_hash_entry *, PTR))) (func),	\
+    (info)))
+
+/* Get the Linux link hash table from the info structure.  This is
+   just a cast.  */
+
+#define linux_hash_table(p) ((struct linux_link_hash_table *) ((p)->hash))
+
+/* Store the information for a new fixup.  */
+
+static struct fixup *
+new_fixup (info, h, value, builtin)
+     struct bfd_link_info *info;
+     struct linux_link_hash_entry *h;
+     bfd_vma value;
+     int builtin;
+{
+  struct fixup *f;
+
+  f = (struct fixup *) bfd_hash_allocate (&info->hash->table,
+					  sizeof (struct fixup));
+  if (f == NULL)
+    return f;
+  f->next = linux_hash_table (info)->fixup_list;
+  linux_hash_table (info)->fixup_list = f;
+  f->h = h;
+  f->value = value;
+  f->builtin = builtin;
+  f->jump = 0;
+  ++linux_hash_table (info)->fixup_count;
+  return f;
+}
+
+/* We come here once we realize that we are going to link to a shared
+   library.  We need to create a special section that contains the
+   fixup table, and we ultimately need to add a pointer to this into
+   the set vector for SHARABLE_CONFLICTS.  At this point we do not
+   know the size of the section, but that's OK - we just need to
+   create it for now.  */
+
+static boolean
+linux_link_create_dynamic_sections (abfd, info)
+     bfd *abfd;
+     struct bfd_link_info *info;
+{
+  flagword flags;
+  register asection *s;
+
+  /* Note that we set the SEC_IN_MEMORY flag.  */
+  flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
+
+  /* We choose to use the name ".linux-dynamic" for the fixup table.
+     Why not? */
+  s = bfd_make_section (abfd, ".linux-dynamic");
+  if (s == NULL
+      || ! bfd_set_section_flags (abfd, s, flags)
+      || ! bfd_set_section_alignment (abfd, s, 2))
+    return false;
+  s->_raw_size = 0;
+  s->contents = 0;
+
+  return true;
+}
+
+/* Function to add a single symbol to the linker hash table.  This is
+   a wrapper around _bfd_generic_link_add_one_symbol which handles the
+   tweaking needed for dynamic linking support.  */
+
+static boolean
+linux_add_one_symbol (info, abfd, name, flags, section, value, string,
+		      copy, collect, hashp)
+     struct bfd_link_info *info;
+     bfd *abfd;
+     const char *name;
+     flagword flags;
+     asection *section;
+     bfd_vma value;
+     const char *string;
+     boolean copy;
+     boolean collect;
+     struct bfd_link_hash_entry **hashp;
+{
+  struct linux_link_hash_entry *h;
+  boolean insert;
+
+  /* Look up and see if we already have this symbol in the hash table.
+     If we do, and the defining entry is from a shared library, we
+     need to create the dynamic sections.
+
+     FIXME: What if abfd->xvec != info->hash->creator?  We may want to
+     be able to link Linux a.out and ELF objects together, but serious
+     confusion is possible.  */
+
+  insert = false;
+
+  if (! info->relocateable
+      && linux_hash_table (info)->dynobj == NULL
+      && strcmp (name, SHARABLE_CONFLICTS) == 0
+      && (flags & BSF_CONSTRUCTOR) != 0)
+    {
+      if (! linux_link_create_dynamic_sections (abfd, info))
+	return false;
+      linux_hash_table (info)->dynobj = abfd;
+      insert = true;
+    }
+
+  if (bfd_is_abs_section (section))
+    {
+      h = linux_link_hash_lookup (linux_hash_table (info), name, false,
+				  false, false);
+      if (h != NULL
+	  && h->root.root.type == bfd_link_hash_defined)
+	{
+	  struct fixup *f;
+
+	  if (hashp != NULL)
+	    *hashp = (struct bfd_link_hash_entry *) h;
+
+	  f = new_fixup (info, h, value, ! IS_PLT_SYM (name));
+	  if (f == NULL)
+	    return false;
+	  f->jump = IS_PLT_SYM (name);
+
+	  return true;
+	}
+    }
+
+  /* Do the usual procedure for adding a symbol.  */
+  if (! _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section,
+					  value, string, copy, collect,
+					  hashp))
+    return false;
+
+  /* Insert a pointer to our table in the set vector.  The dynamic
+     linker requires this information */
+  if (insert)
+    {
+      asection *s;
+
+      /* Here we do our special thing to add the pointer to the
+	 dynamic section in the SHARABLE_CONFLICTS set vector.  */
+      s = bfd_get_section_by_name (linux_hash_table (info)->dynobj,
+				   ".linux-dynamic");
+      BFD_ASSERT (s != NULL);
+
+      if (! (_bfd_generic_link_add_one_symbol
+	     (info, linux_hash_table (info)->dynobj, SHARABLE_CONFLICTS,
+	      BSF_GLOBAL | BSF_CONSTRUCTOR, s, 0, NULL, false, false, NULL)))
+	return false;
+    }
+
+  return true;
+}
+
+/* We will crawl the hash table and come here for every global symbol.
+   We will examine each entry and see if there are indications that we
+   need to add a fixup.  There are two possible cases - one is where
+   you have duplicate definitions of PLT or GOT symbols - these will
+   have already been caught and added as "builtin" fixups.  If we find
+   that the corresponding non PLT/GOT symbol is also present, we
+   convert it to a regular fixup instead.
+
+   This function is called via linux_link_hash_traverse.  */
+
+static boolean
+linux_tally_symbols (h, data)
+     struct linux_link_hash_entry *h;
+     PTR data;
+{
+  struct bfd_link_info *info = (struct bfd_link_info *) data;
+  struct fixup *f, *f1;
+  int is_plt;
+  struct linux_link_hash_entry *h1, *h2;
+  boolean exists;
+
+  /* If this symbol is not a PLT/GOT, we do not even need to look at it */
+  is_plt = IS_PLT_SYM (h->root.root.root.string);
+
+  if (is_plt || IS_GOT_SYM (h->root.root.root.string))
+    {
+      /* Look up this symbol twice.  Once just as a regular lookup,
+	 and then again following all of the indirect links until we
+	 reach a real symbol.  */
+      h1 = linux_link_hash_lookup (linux_hash_table (info),
+				   (h->root.root.root.string
+				    + sizeof PLT_REF_PREFIX - 1),
+				   false, false, true);
+      /* h2 does not follow indirect symbols. */
+      h2 = linux_link_hash_lookup (linux_hash_table (info), 
+				   (h->root.root.root.string
+				    + sizeof PLT_REF_PREFIX - 1),
+				   false, false, false);
+
+      /* The real symbol must exist but if it is also an ABS symbol,
+	 there is no need to have a fixup.  This is because they both
+	 came from the same library.  If on the other hand, we had to
+	 use an indirect symbol to get to the real symbol, we add the
+	 fixup anyway, since there are cases where these symbols come
+	 from different shared libraries */
+      if (h1 != NULL
+	  && ((h1->root.root.type == bfd_link_hash_defined
+	       && ! bfd_is_abs_section (h1->root.root.u.def.section))
+	      || h2->root.root.type == bfd_link_hash_indirect))
+	{
+	  /* See if there is a "builtin" fixup already present
+	     involving this symbol.  If so, convert it to a regular
+	     fixup.  In the end, this relaxes some of the requirements
+	     about the order of performing fixups.  */
+	  exists = false;
+	  for (f1 = linux_hash_table (info)->fixup_list;
+	       f1 != NULL;
+	       f1 = f1->next)
+	    {
+	      if ((f1->h != h && f1->h != h1)
+		  || (! f1->builtin && ! f1->jump))
+		continue;
+	      if (f1->h == h1)
+		exists = true;
+	      if (! exists
+		  && bfd_is_abs_section (h->root.root.u.def.section))
+		{
+		  f = new_fixup (info, h1, f1->h->root.root.u.def.value, 0);
+		  f->jump = is_plt;
+		}
+	      f1->h = h1;
+	      f1->jump = is_plt;
+	      f1->builtin = 0;
+	      exists = true;
+	    }
+	  if (! exists
+	      && bfd_is_abs_section (h->root.root.u.def.section))
+	    {
+	      f = new_fixup (info, h1, h->root.root.u.def.value, 0);
+	      if (f == NULL)
+		{
+		  /* FIXME: No way to return error.  */
+		  abort ();
+		}
+	      f->jump = is_plt;
+	    }
+	}
+
+      /* Quick and dirty way of stripping these symbols from the
+	 symtab. */
+      if (bfd_is_abs_section (h->root.root.u.def.section))
+	h->root.written = true;
+    }
+
+  return true;
+}
+
+/* This is called to set the size of the .linux-dynamic section is.
+   It is called by the Linux linker emulation before_allocation
+   routine.  We have finished reading all of the input files, and now
+   we just scan the hash tables to find out how many additional fixups
+   are required.  */
+
+boolean
+bfd_linux_size_dynamic_sections (output_bfd, info)
+     bfd *output_bfd;
+     struct bfd_link_info *info;
+{
+  struct fixup *f;
+  asection *s;
+
+  /* First find the fixups... */
+  linux_link_hash_traverse (linux_hash_table (info),
+			    linux_tally_symbols,
+			    (PTR) info);
+
+  /* If there are builtin fixups, leave room for a marker.  This is
+     used by the dynamic linker so that it knows that all that follow
+     are builtin fixups instead of regular fixups.  */
+  for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next)
+    {
+      if (f->builtin)
+	{
+	  ++linux_hash_table (info)->fixup_count;
+	  ++linux_hash_table (info)->local_builtins;
+	  break;
+	}
+    }
+
+  if (linux_hash_table (info)->dynobj == NULL)
+    {
+      if (linux_hash_table (info)->fixup_count > 0)
+	abort ();
+      return true;
+    }
+
+  /* Allocate memory for our fixup table.  We will fill it in later.  */
+  s = bfd_get_section_by_name (linux_hash_table (info)->dynobj,
+			       ".linux-dynamic");
+  if (s != NULL)
+    {
+      s->_raw_size = 8 + linux_hash_table (info)->fixup_count * 8;
+      s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size);
+      if (s->contents == NULL)
+	{
+	  bfd_set_error (bfd_error_no_memory);
+	  return false;
+	}
+      memset (s->contents, 0, s->_raw_size);
+    }
+
+  return true;
+}
+
+/* We come here once we are ready to actually write the fixup table to
+   the output file.  Scan the fixup tables and so forth and generate
+   the stuff we need.  */
+
+static boolean
+linux_finish_dynamic_link (output_bfd, info)
+     bfd *output_bfd;
+     struct bfd_link_info *info;
+{
+  asection *s, *os, *is;
+  bfd_byte *fixup_table;
+  struct linux_link_hash_entry *h;
+  struct fixup *f;
+  unsigned int new_addr;
+  int section_offset;
+  int fixups_written;
+
+  if (linux_hash_table (info)->dynobj == NULL)
+    return true;
+
+  s = bfd_get_section_by_name (linux_hash_table (info)->dynobj,
+			       ".linux-dynamic");
+  BFD_ASSERT (s != NULL);
+  os = s->output_section;
+  fixups_written = 0;
+
+#ifdef LINUX_LINK_DEBUG
+  printf ("Fixup table file offset: %x  VMA: %x\n", 
+	  os->filepos + s->output_offset,
+	  os->vma + s->output_offset);
+#endif
+
+  fixup_table = s->contents;
+  bfd_put_32 (output_bfd, linux_hash_table (info)->fixup_count, fixup_table);
+  fixup_table += 4;
+
+  /* Fill in fixup table.  */
+  for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next)
+    {
+      if (f->builtin)
+	continue;
+
+      if (f->h->root.root.type != bfd_link_hash_defined)
+	{
+	  /* FIXME!  */
+	  fprintf (stderr,
+		   "Symbol %s not defined for fixups\n",
+		   f->h->root.root.root.string);
+	  continue;
+	}
+
+      is = f->h->root.root.u.def.section;
+      section_offset = is->output_section->vma + is->output_offset;
+      new_addr = f->h->root.root.u.def.value + section_offset;
+
+#ifdef LINUX_LINK_DEBUG
+      printf ("Fixup(%d) %s: %x %x\n",f->jump, f->h->root.root.string,
+	      new_addr, f->value);
+#endif
+
+      if (f->jump)
+	{
+	  /* Relative address */
+	  new_addr = new_addr - (f->value + 5); 
+	  bfd_put_32 (output_bfd, new_addr, fixup_table);
+	  fixup_table += 4;
+	  bfd_put_32 (output_bfd, f->value + 1, fixup_table);
+	  fixup_table += 4;
+	}
+      else
+	{
+	  bfd_put_32 (output_bfd, new_addr, fixup_table);
+	  fixup_table += 4;
+	  bfd_put_32 (output_bfd, f->value, fixup_table);
+	  fixup_table += 4;
+	}
+      ++fixups_written;
+    }
+
+  if (linux_hash_table (info)->local_builtins != 0)
+    {
+      /* Special marker so we know to switch to the other type of fixup */
+      bfd_put_32 (output_bfd, 0, fixup_table);
+      fixup_table += 4;
+      bfd_put_32 (output_bfd, 0, fixup_table);
+      fixup_table += 4;
+      ++fixups_written;
+      for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next)
+	{
+	  if (! f->builtin)
+	    continue;
+
+	  if (f->h->root.root.type != bfd_link_hash_defined)
+	    {
+	      /* FIXME!  */
+	      fprintf (stderr,
+		       "Symbol %s not defined for fixups\n",
+		       f->h->root.root.root.string);
+	      continue;
+	    }
+
+	  is = f->h->root.root.u.def.section;
+	  section_offset = is->output_section->vma + is->output_offset;
+	  new_addr = f->h->root.root.u.def.value + section_offset;
+
+#ifdef LINUX_LINK_DEBUG
+	  printf ("Fixup(B) %s: %x %x\n", f->h->root.root.string,
+		  new_addr, f->value);
+#endif
+
+	  bfd_put_32 (output_bfd, new_addr, fixup_table);
+	  fixup_table += 4;
+	  bfd_put_32 (output_bfd, f->value, fixup_table);
+	  fixup_table += 4;
+	  ++fixups_written;
+	}
+  }
+
+  if (linux_hash_table (info)->fixup_count != fixups_written)
+    {
+      /* FIXME!  */
+      fprintf (stderr, "Warning: fixup count mismatch\n");
+      while (linux_hash_table (info)->fixup_count > fixups_written)
+	{
+	  bfd_put_32 (output_bfd, 0, fixup_table);
+	  fixup_table += 4;
+	  bfd_put_32 (output_bfd, 0, fixup_table);
+	  fixup_table += 4;
+	  ++fixups_written;
+	}
+    }
+
+  h = linux_link_hash_lookup (linux_hash_table (info), 
+			      "__BUILTIN_FIXUPS__",
+			      false, false, false);
+
+  if (h != NULL && h->root.root.type == bfd_link_hash_defined)
+    {
+      is = h->root.root.u.def.section;
+      section_offset = is->output_section->vma + is->output_offset;
+      new_addr = h->root.root.u.def.value + section_offset;
+
+#ifdef LINUX_LINK_DEBUG
+      printf ("Builtin fixup table at %x\n", new_addr);
+#endif
+
+      bfd_put_32 (output_bfd, new_addr, fixup_table);
+    }
+  else
+    bfd_put_32 (output_bfd, 0, fixup_table);
+
+  if (bfd_seek (output_bfd, os->filepos + s->output_offset, SEEK_SET) != 0)
+    return false;
+
+  if (bfd_write ((PTR) s->contents, 1, s->_raw_size, output_bfd)
+      != s->_raw_size)
+    return false;
+
+  return true;
+}
+
+#define MY_bfd_link_hash_table_create linux_link_hash_table_create
+#define MY_add_one_symbol linux_add_one_symbol
+#define MY_finish_dynamic_link linux_finish_dynamic_link
+
+#define MY_zmagic_contiguous 1
diff -urN gdb-4.14/bfd/m68klinux.c gdb-4.14.1/bfd/m68klinux.c
--- gdb-4.14/bfd/m68klinux.c	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/m68klinux.c	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,53 @@
+/* BFD back-end for linux flavored m68k a.out binaries.
+   Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+
+This file is part of BFD, the Binary File Descriptor library.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+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.  */
+
+#define TARGET_IS_BIG_ENDIAN_P
+#define	PAGE_SIZE	4096
+#define ZMAGIC_DISK_BLOCK_SIZE 1024
+#define	SEGMENT_SIZE	4096
+#define TEXT_START_ADDR	0x0
+#define N_SHARED_LIB(x) 0
+#define BYTES_IN_WORD 4
+#define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN || \
+                            (mtype) == M_68010 || (mtype) == M_68020)
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "libbfd.h"
+#include "aout/aout64.h"
+#include "aout/stab_gnu.h"
+#include "aout/ar.h"
+#include "libaout.h"           /* BFD a.out internal data structures */
+
+#define DEFAULT_ARCH bfd_arch_m68k
+
+/*
+ * Don't use MY using the CAT() macro, since we otherwise
+ * run into trouble with recursive macro calls.
+ */
+#if defined(__STDC__) || defined(ALMOST_STDC)
+#define MY(OP) m68klinux_##OP
+#else
+#define MY(OP) m68klinux_/**/OP
+#endif
+  
+#define TARGETNAME "a.out-m68k-linux"
+
+#include "linux.h"
+#include "aout-target.h"
diff -urN gdb-4.14/bfd/mipslinux.c gdb-4.14.1/bfd/mipslinux.c
--- gdb-4.14/bfd/mipslinux.c	Thu Jan  1 01:00:00 1970
+++ gdb-4.14.1/bfd/mipslinux.c	Tue Aug 29 09:53:36 1995
@@ -0,0 +1,403 @@
+/* BFD back-end for linux flavored mips a.out binaries.
+   Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+This file is part of BFD, the Binary File Descriptor library.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+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.  */
+
+#define PAGE_SIZE       4096
+#define ZMAGIC_DISK_BLOCK_SIZE 1024
+#define SEGMENT_SIZE    4096
+#define TEXT_START_ADDR 0x0
+#define N_SHARED_LIB(x) 0
+
+#if 0
+/*
+ * Stuff from mipsbsd.c
+ */
+#define N_TXTADDR(x) \
+    (N_MAGIC(x) != ZMAGIC ? (x).a_entry :       /* object file or NMAGIC */\
+            TEXT_START_ADDR + EXEC_BYTES_SIZE   /* no padding */\
+    )
+#define N_DATADDR(x) (N_TXTADDR(x)+N_TXTSIZE(x))
+#else
+/*
+ * from include/aout/aout64.h
+ */
+#define LOAD_ADDRESS(x) ((x).a_entry)
+#define N_TXTADDR(x) \
+    (/* The address of a QMAGIC file is always one page in, */ \
+     /* with the header in the text.  */ \
+     N_IS_QMAGIC (x) ? PAGE_SIZE + EXEC_BYTES_SIZE : \
+     N_MAGIC(x) != ZMAGIC ? LOAD_ADDRESS(x) : /* object file or NMAGIC */\
+     N_SHARED_LIB(x) ? LOAD_ADDRESS(x) :      \
+     N_HEADER_IN_TEXT(x)  ?     \
+            TEXT_START_ADDR + EXEC_BYTES_SIZE : /* no padding */\
+            TEXT_START_ADDR                     /* a page of padding */\
+    )
+#endif
+ 
+#define BYTES_IN_WORD 4
+#define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN \
+			    || (mtype) == M_MIPS1 || (mtype) == M_MIPS2)
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "libbfd.h"
+#include "aout/aout64.h"
+#include "aout/stab_gnu.h"
+#include "aout/ar.h"
+#include "libaout.h"           /* BFD a.out internal data structures */
+
+#define DEFAULT_ARCH bfd_arch_mips
+
+/*
+ * Don't use MY using the CAT() macro, since we otherwise
+ * run into trouble with recursive macro calls.
+ */
+#if defined(__STDC__) || defined(ALMOST_STDC)
+#define MY(OP) mipslinux_little_##OP
+#else
+#define MY(OP) mipslinux_little_/**/OP
+#endif
+
+#define TARGETNAME "a.out-mips-little-linux"
+
+#define SET_ARCH_MACH(ABFD, EXEC) \
+  MY(set_arch_mach)(ABFD, N_MACHTYPE (EXEC)); \
+  MY(choose_reloc_size)(ABFD);
+
+
+/* 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 mipslinux_little_reloc_howto_type_lookup
+
+#if 1
+#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
+#endif
+
+void
+MY(set_arch_mach) (abfd, machtype)
+     bfd *abfd;
+     int machtype;
+{
+  enum bfd_architecture arch;
+  long machine;
+
+  /* Determine the architecture and machine type of the object file. */
+  switch (machtype) {
+
+  case M_MIPS1:
+    arch = bfd_arch_mips;
+    machine = 3000;
+    break;
+
+  case M_MIPS2:
+    arch = bfd_arch_mips;
+    machine = 4000;
+    break;
+
+  default:
+    arch = bfd_arch_obscure;
+    machine = 0;
+    break;
+  }
+  bfd_set_arch_mach(abfd, arch, machine);  
+}
+
+/* Determine the size of a relocation entry, based on the architecture */
+static void
+MY(choose_reloc_size) (abfd)
+     bfd *abfd;
+{
+  switch (bfd_get_arch(abfd)) {
+  case bfd_arch_sparc:
+  case bfd_arch_a29k:
+  case bfd_arch_mips:
+    obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
+    break;
+  default:
+    obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
+    break;
+  }
+}
+
+/* Write an object file in BSD a.out format.
+  Section contents have already been written.  We write the
+  file header, symbols, and relocation.  */
+
+static boolean
+MY(write_object_contents) (abfd)
+     bfd *abfd;
+{
+  struct external_exec exec_bytes;
+  struct internal_exec *execp = exec_hdr (abfd);
+
+  /* Magic number, maestro, please!  */
+  switch (bfd_get_arch(abfd)) {
+  case bfd_arch_m68k:
+    switch (bfd_get_mach(abfd)) {
+    case 68010:
+      N_SET_MACHTYPE(*execp, M_68010);
+      break;
+    default:
+    case 68020:
+      N_SET_MACHTYPE(*execp, M_68020);
+      break;
+    }
+    break;
+  case bfd_arch_sparc:
+    N_SET_MACHTYPE(*execp, M_SPARC);
+    break;
+  case bfd_arch_i386:
+    N_SET_MACHTYPE(*execp, M_386);
+    break;
+  case bfd_arch_a29k:
+    N_SET_MACHTYPE(*execp, M_29K);
+    break;
+  case bfd_arch_mips:
+    switch (bfd_get_mach(abfd)) {
+    case 4000:
+    case 6000:
+      N_SET_MACHTYPE(*execp, M_MIPS2);
+      break;
+    default:
+      N_SET_MACHTYPE(*execp, M_MIPS1);
+      break;
+    }
+    break;
+  default:
+    N_SET_MACHTYPE(*execp, M_UNKNOWN);
+  }
+
+  MY(choose_reloc_size)(abfd);
+
+  WRITE_HEADERS(abfd, execp);
+
+  return true;
+}
+
+#define MY_write_object_contents MY(write_object_contents)
+
+/*
+ * MIPS relocation types.
+ */
+#define MIPS_RELOC_32		0
+#define MIPS_RELOC_JMP		1
+#define MIPS_RELOC_WDISP16	2
+#define MIPS_RELOC_HI16		3
+#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.
+ */
+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;
+     asymbol *symbol;
+     PTR data;
+     asection *input_section;
+     bfd *output_bfd;
+     char **error_message;
+{
+  bfd_vma relocation;
+ 
+  /* 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;
+
+  if (relocation & 0x8000)
+    reloc_entry->addend += 0x10000;
+
+  return bfd_reloc_continue;
+}
+
+static reloc_howto_type mips_howto_table_ext[] = {
+  HOWTO(MIPS_RELOC_32,      0, 2, 32, false, 0,  complain_overflow_bitfield, 0,
+	"32",       false, 0, 0xffffffff, false),
+  HOWTO(MIPS_RELOC_JMP,     2, 2, 26, false, 0, complain_overflow_dont, mips_fix_jmp_addr,
+	"MIPS_JMP", false, 0, 0x03ffffff, false),
+  HOWTO(MIPS_RELOC_WDISP16, 2, 1, 16, true,  0, complain_overflow_signed, 0,
+	"WDISP16",  false, 0, 0x0000ffff, false),
+  HOWTO(MIPS_RELOC_HI16,   16, 1, 16, false, 0, complain_overflow_bitfield, 0,
+	"HI16",     false, 0, 0x0000ffff, false),
+  HOWTO(MIPS_RELOC_HI16_S, 16, 1, 16, false, 0, complain_overflow_bitfield, mips_fix_hi16_s,
+        "HI16_S",   false, 0, 0x0000ffff, false),
+  HOWTO(MIPS_RELOC_LO16,    0, 1, 16, false, 0, complain_overflow_dont, 0,
+	"LO16",     false, 0, 0x0000ffff, false),
+};
+
+static const reloc_howto_type *
+MY(reloc_howto_type_lookup) (abfd, code)
+     bfd *abfd;
+     bfd_reloc_code_real_type code;
+{
+
+  if (bfd_get_arch (abfd) != bfd_arch_mips)
+    return 0;
+
+  switch (code)
+    {
+    case BFD_RELOC_32:
+    case BFD_RELOC_CTOR:
+      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;
+    }
+}
+
+/*
+ * 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.
+ */
+long
+MY(canonicalize_reloc)(abfd, section, relptr, symbols)
+      bfd *abfd;
+      sec_ptr section;
+      arelent **relptr;
+      asymbol **symbols;
+{
+  arelent *tblptr = section->relocation;
+  unsigned int count, c;
+  extern reloc_howto_type NAME(aout,ext_howto_table)[];
+
+  /* If we have already read in the relocation table, return the values. */
+  if (section->flags & SEC_CONSTRUCTOR) {
+    arelent_chain *chain = section->constructor_chain;
+
+    for (count = 0; count < section->reloc_count; count++) {
+      *relptr++ = &chain->relent;
+      chain = chain->next;
+    }
+    *relptr = 0;
+    return section->reloc_count;
+  }
+  if (tblptr && section->reloc_count) {
+    for (count = 0; count++ < section->reloc_count;) 
+      *relptr++ = tblptr++;
+    *relptr = 0;
+    return section->reloc_count;
+  }
+
+  if (!NAME(aout,slurp_reloc_table)(abfd, section, symbols))
+    return -1;
+  tblptr = section->relocation;
+
+  /* fix up howto entries */
+  for (count = 0; count++ < section->reloc_count;) 
+    {
+      c = tblptr->howto - NAME(aout,ext_howto_table);
+      tblptr->howto = &mips_howto_table_ext[c];
+
+      *relptr++ = tblptr++;
+    }
+  *relptr = 0;
+  return section->reloc_count;
+}
+
+#define MY_canonicalize_reloc mipslinux_little_canonicalize_reloc
+
+#include "aout-target.h"
diff -urN gdb-4.14/bfd/targets.c gdb-4.14.1/bfd/targets.c
--- gdb-4.14/bfd/targets.c	Fri Mar  3 20:01:26 1995
+++ gdb-4.14.1/bfd/targets.c	Tue Aug 29 09:58:23 1995
@@ -470,11 +470,14 @@
 extern const bfd_target ieee_vec;
 extern const bfd_target m68kcoff_vec;
 extern const bfd_target m68kcoffun_vec;
+extern const bfd_target m68klinux_vec;
 extern const bfd_target m68klynx_aout_vec;
 extern const bfd_target m68klynx_coff_vec;
 extern const bfd_target m68knetbsd_vec;
 extern const bfd_target m88kbcs_vec;
 extern const bfd_target m88kmach3_vec;
+extern const bfd_target mipslinux_big_vec;
+extern const bfd_target mipslinux_little_vec;
 extern const bfd_target newsos3_vec;
 extern const bfd_target nlm32_i386_vec;
 extern const bfd_target nlm32_sparc_vec;
@@ -608,6 +611,11 @@
 	&icoff_big_vec,
 	&icoff_little_vec,
 	&ieee_vec,
+#if 0
+	/* Since a.out files lack decent magic numbers, no way to recognize
+	   which kind of a.out file it is.  */
+	&m68klinux_vec,
+#endif
 	&m68kcoff_vec,
 	&m68kcoffun_vec,
 	&m68klynx_aout_vec,
@@ -616,6 +624,12 @@
 	&m88kbcs_vec,
 	&m88kmach3_vec,
 	&newsos3_vec,
+#if 0
+        /* Since a.out files lack decent magic numbers, no way to recognize
+           which kind of a.out file it is.  */
+        &mipslinux_big_vec,
+        &mipslinux_little_vec,
+#endif
 	&nlm32_i386_vec,
 	&nlm32_sparc_vec,
 #ifdef BFD64
diff -urN gdb-4.14/config/mh-linux gdb-4.14.1/config/mh-linux
--- gdb-4.14/config/mh-linux	Tue Nov 16 00:01:36 1993
+++ gdb-4.14.1/config/mh-linux	Tue Aug 29 09:53:37 1995
@@ -3,6 +3,3 @@
 # it's not clear linux should define it).
 SYSV = -DSYSV
 RANLIB = ranlib
-
-# What is this doing here?
-#LDFLAGS = -static
diff -urN gdb-4.14/config.guess gdb-4.14.1/config.guess
--- gdb-4.14/config.guess	Wed Jan  4 22:01:39 1995
+++ gdb-4.14.1/config.guess	Tue Aug 29 09:53:37 1995
@@ -96,8 +96,14 @@
     VAX*:ULTRIX*:*:*)
 	echo vax-dec-ultrix${UNAME_RELEASE}
 	exit 0 ;;
+    mips:Linux/MIPS:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
     mips:*:5*:RISCos)
 	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    m68k:Linux/68k:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
 	exit 0 ;;
     m88k:CX/UX:7*:*)
 	echo m88k-harris-cxux7
diff -urN gdb-4.14/config.sub gdb-4.14.1/config.sub
--- gdb-4.14/config.sub	Fri Mar  3 20:14:05 1995
+++ gdb-4.14.1/config.sub	Tue Aug 29 09:53:37 1995
@@ -392,15 +392,15 @@
 		basic_machine=i386-unknown
 		os=-go32
 		;;
-	i386-linux* | linux)				# CYGNUS LOCAL
+	i386-linux*)					# CYGNUS LOCAL
 		basic_machine=i386-unknown
 		os=-linux
 		;;
-	i386-linux*coff | linuxcoff)			# CYGNUS LOCAL
+	i386-linux*coff)				# CYGNUS LOCAL
 		basic_machine=i386-unknown
 		os=-linuxcoff
 		;;
-	i386-linux*elf | linuxelf)			# CYGNUS LOCAL
+	i386-linux*elf)					# CYGNUS LOCAL
 		basic_machine=i386-unknown
 		os=-linuxelf
 		;;
@@ -433,6 +433,10 @@
 	miniframe)
 		basic_machine=m68000-convergent
 		;;
+	mips-linux*)
+		basic_machine=mips-unknown
+		os=-linux
+		;;
 	mips3*-*)
 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
 		;;
@@ -696,7 +700,11 @@
 		basic_machine=hppa1.1-oki
 		;;
 	mips)
-		basic_machine=mips-mips
+		if [ x$os = x-linux ]; then
+			basic_machine=mips-unknown
+		else
+			basic_machine=mips-mips
+		fi
 		;;
 	romp)
 		basic_machine=romp-ibm
diff -urN gdb-4.14/configure.in gdb-4.14.1/configure.in
--- gdb-4.14/configure.in	Sat Mar  4 00:31:05 1995
+++ gdb-4.14.1/configure.in	Tue Aug 29 09:53:37 1995
@@ -94,6 +94,7 @@
   m68k-hp-hpux*)	  host_makefile_frag=config/mh-hp300 ;;
   m68k-apollo-sysv*)      host_makefile_frag=config/mh-apollo68 ;;
   m68k-apollo-bsd*)       host_makefile_frag=config/mh-a68bsd ;;
+  m68k-*-linux*)          host_makefile_frag=config/mh-linux ;;
   m88k-dg-dgux*)	  host_makefile_frag=config/mh-dgux ;;
   m88k-harris-cxux*)	  host_makefile_frag=config/mh-cxux ;;
   m88k-motorola-sysv*)    host_makefile_frag=config/mh-delta88;;
@@ -101,6 +102,7 @@
   mips*-sgi-irix5*)       host_makefile_frag=config/mh-irix5 ;;
   mips*-sgi-irix4*)       host_makefile_frag=config/mh-irix4 ;;
   mips*-sgi-irix3*)       host_makefile_frag=config/mh-sysv ;;
+  mips-*-linux*)          host_makefile_frag=config/mh-linux ;;
   mips*-*-sysv4*)	  host_makefile_frag=config/mh-sysv4 ;;
   mips*-*-sysv*)	  host_makefile_frag=config/mh-riscos ;;
   i[345]86-ncr-sysv4.3)   host_makefile_frag=config/mh-ncrsvr43 ;;
diff -urN gdb-4.14/gdb/configure.in gdb-4.14.1/gdb/configure.in
--- gdb-4.14/gdb/configure.in	Fri Mar  3 20:09:04 1995
+++ gdb-4.14.1/gdb/configure.in	Tue Aug 29 10:04:50 1995
@@ -303,6 +303,7 @@
 mips*-*-sysv4*)		gdb_target=mipsv4 ;;
 mips*-*-sysv*)		gdb_target=bigmips ;;
 mips*-*-riscos*)	gdb_target=bigmips ;;
+mipsel-*-linux*)	gdb_target=littlemips ;;
 
 none-*-*)		gdb_target=none ;;
 
diff -urN gdb-4.14/include/libiberty.h gdb-4.14.1/include/libiberty.h
--- gdb-4.14/include/libiberty.h	Tue Aug 15 09:49:42 1995
+++ gdb-4.14.1/include/libiberty.h	Tue Aug 29 10:06:42 1995
@@ -24,7 +24,7 @@
 /* Return the last component of a path name.  */
 
 #ifndef linux
-extern char *basename PARAMS ((char *));
+extern char *basename PARAMS ((const char *));
 #endif
 
 /* Concatenate an arbitrary number of strings, up to (char *) NULL.
diff -urN gdb-4.14/opcodes/mips-opc.c gdb-4.14.1/opcodes/mips-opc.c
--- gdb-4.14/opcodes/mips-opc.c	Tue Jan 17 16:57:29 1995
+++ gdb-4.14.1/opcodes/mips-opc.c	Tue Aug 29 09:53:37 1995
@@ -583,6 +583,7 @@
 {"ush",     "t,A",	0,    (int) M_USH_A,	INSN_MACRO	},
 {"usw",     "t,o(b)",	0,    (int) M_USW,	INSN_MACRO	},
 {"usw",     "t,A",	0,    (int) M_USW_A,	INSN_MACRO	},
+{"wait",    "",		0x42000020, 0xffffffff, I3		},
 {"xor",     "d,v,t",	0x00000026, 0xfc0007ff,	WR_d|RD_s|RD_t	},
 {"xor",     "t,r,I",	0,    (int) M_XOR_I,	INSN_MACRO	},
 {"xori",    "t,r,i",	0x38000000, 0xfc000000,	WR_t|RD_s	},
