Add support for netbsd386 (almost-but-not-quite 386bsd).
authorSean Eric Fagan <sef@cygnus>
Mon, 23 Aug 1993 07:45:32 +0000 (07:45 +0000)
committerSean Eric Fagan <sef@cygnus>
Mon, 23 Aug 1993 07:45:32 +0000 (07:45 +0000)
bfd/config.bfd
bfd/netbsd386.c [new file with mode: 0644]
gdb/configure.in
gdb/dbxread.c

index af7cfea1480bd74e0a856f10524750c1fb40d6d5..2ed4dfddeea4cfd99b785f0f55f75132e06e7e3a 100755 (executable)
@@ -31,6 +31,7 @@ case "${canon}" in
   i[34]86-*-isc*)      bfd_name=i386-sco ;; # gets core dump reading right
   i[34]86-*-sco*)      bfd_name=i386-sco ;;
   i[34]86-*-bsd*)      bfd_name=i386-bsd ;;
+  i[34]86-*-netbsd)    bfd_name=i386-netbsd ;; # CYGNUS LOCAL
   i[34]86-*-lynxos*)   bfd_name=i386-lynx ;;
   i[34]86-*-coff)      bfd_name=i386-coff ;;
   i[34]86-*-aix*)      bfd_name=i386-coff ;;
diff --git a/bfd/netbsd386.c b/bfd/netbsd386.c
new file mode 100644 (file)
index 0000000..207638a
--- /dev/null
@@ -0,0 +1,111 @@
+/* BFD back-end for NetBSD/386 a.out-ish binaries.
+   Copyright (C) 1990, 1991, 1992 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        BYTES_IN_WORD   4
+#define        ARCH    32
+
+/* ZMAGIC files never have the header in the text.  */
+#define        N_HEADER_IN_TEXT(x)     0
+
+/* ZMAGIC files start at address 0.  This does not apply to QMAGIC.  */
+#define TEXT_START_ADDR 0
+
+#define        PAGE_SIZE       4096
+#define        SEGMENT_SIZE    PAGE_SIZE
+
+#define        DEFAULT_ARCH    bfd_arch_i386
+#define MACHTYPE_OK(mtype) ((mtype) == M_386 || (mtype) == M_I386 || (mtype) == M_UNKNOWN)
+
+#define MY(OP) CAT(netbsd386_,OP)
+#define TARGETNAME "netbsd-386"
+
+#define N_MAGIC(ex) \
+    ( (((ex).a_info)&0xffff0000) ? (ntohl(((ex).a_info))&0xffff) : ((ex).a_info))
+#define N_MACHTYPE(ex) \
+    ( (((ex).a_info)&0xffff0000) ? ((ntohl(((ex).a_info))>>16)&0x03ff) : 0 )
+# define N_FLAGS(ex) \
+    ( (((ex).a_info)&0xffff0000) ? ((ntohl(((ex).a_info))>>26)&0x3f) : 0 )
+#define N_SET_INFO(ex, mag,mid,flag) \
+    ( (ex).a_info = htonl( (((flag)&0x3f)<<26) | (((mid)&0x03ff)<<16) | \
+    (((mag)&0xffff)) ) )
+#define N_SET_MAGIC(exec,magic) \
+  ((exec).a_info = (((exec).a_info & ~0xffff) | ((magic) & 0xffff)))
+#define N_SET_MACHTYPE(exec,machtype) \
+  ((exec).a_info = \
+   (((exec).a_info & ~(0x3ff<<16)) | (((machtype)&0xff) << 16)))
+#define N_SET_FLAGS(exec, flags) \
+  ((exec).a_info = ((exec).a_info & 0xffff) | (flags & 0xffff))
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "libbfd.h"
+#include "libaout.h"
+
+#define N_GETMAGIC2(ex) \
+    ( (((ex).a_info)&0xffff0000) ? (ntohl(((ex).a_info))&0xffff) : \
+    (((ex).a_info) | 0x10000) )
+
+#define N_TXTADDR(ex)  (N_GETMAGIC2(ex) == (ZMAGIC|0x10000) ? 0 : 4096)
+#define N_TXTOFF(ex) \
+       ( N_GETMAGIC2(ex)==ZMAGIC || N_GETMAGIC2(ex)==(QMAGIC|0x10000) ? \
+       0 : (N_GETMAGIC2(ex)==(ZMAGIC|0x10000) ? 4096 : EXEC_BYTES_SIZE ))
+#define N_ALIGN(ex,x) \
+       (N_MAGIC(ex) == ZMAGIC || N_MAGIC(ex) == QMAGIC ? \
+        ((x) + 4096 - 1) & ~(4096 - 1) : (x))
+#define N_DATADDR(ex) \
+       N_ALIGN(ex, N_TXTADDR(ex) + (ex).a_text)
+/* Data segment offset. */
+#define        N_DATOFF(ex) \
+       N_ALIGN(ex, N_TXTOFF(ex) + (ex).a_text)
+
+/* #define N_BADMAG(x) n_badmag(N_MAGIC(x)) */
+
+#define NO_SWAP_MAGIC  /* magic number already in correct endian format */
+
+#include "aout-target.h"
+
+#if 0
+int
+n_badmag(x)
+unsigned long x; {
+  union {
+    unsigned long l;
+    unsigned char c[sizeof(unsigned long)];
+  } l;
+  unsigned char temp;
+
+  printf ("x = %o, OMAGIC = %o, NMAGIC = %o, ZMAGIC = %o, QMAGIC = %o\n",
+         x, OMAGIC, NMAGIC, ZMAGIC, QMAGIC);
+
+  l.l = x;
+  temp = l.c[0];
+  l.c[0] = l.c[3];
+  l.c[3] = temp;
+  temp = l.c[2];
+  l.c[2] = l.c[1];
+  l.c[1] = temp;
+  printf ("\tbyte-swapped(x) = %o\n", l.l);
+  
+  return (x != OMAGIC
+         && x != NMAGIC
+         && x != ZMAGIC
+         && x != QMAGIC);
+}
+#endif
+
index 2dbc9740348777110fa5b043fc7140d7b1840847..2c9a033ae5f6590cb4e3757c9d2ef17cb4ddd80d 100644 (file)
@@ -40,6 +40,7 @@ i[34]86-sequent-sysv*)        gdb_host=ptx ;;
 
 i[34]86-*-aix*)                gdb_host=i386aix ;;
 i[34]86-*-bsd*)                gdb_host=i386bsd ;;
+i[34]86-*-netbsd)      gdb_host=i386bsd ;;
 i[34]86-*-go32)                gdb_host=go32 ;;
 i[34]86-*-linux)       gdb_host=linux ;;
 i[34]86-*-lynx*)       gdb_host=i386lynx ;;
@@ -177,6 +178,7 @@ i[34]86-*-elf)              gdb_target=i386v ;;
 
 i[34]86-*-aix*)                gdb_target=i386aix ;;
 i[34]86-*-bsd*)                gdb_target=i386bsd ;;
+i[34]86-*-netbsd)      gdb_target=i386bsd ;;
 i[34]86-*-go32)                gdb_target=i386aout ;;
 i[34]86-*-lynx*)       gdb_target=i386lynx
                        configdirs="${configdirs} gdbserver"
index 012fac20119951405e4b30ebd6a5ab11c2fc7214..b55362e2f21ae18a3dff23687094210e333c090e 100644 (file)
@@ -438,10 +438,28 @@ record_minimal_symbol (name, address, type, objfile)
       ms_type = mst_file_data;
       break;
 #endif
+    case N_TEXT:
+      /* Don't put gcc_compiled, __gnu_compiled_cplus, and friends into
+        the minimal symbols, because if there is also another symbol
+        at the same address (e.g. the first function of the file),
+        lookup_minimal_symbol_by_pc would have no way of getting the
+        right one.  */
+      if (name[0] == 'g'
+         && (strcmp (name, GCC_COMPILED_FLAG_SYMBOL) == 0
+             || strcmp (name, GCC2_COMPILED_FLAG_SYMBOL) == 0))
+       return;
+
+      {
+       char *tempstring = name;
+       if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
+         ++tempstring;
+       if (STREQN (tempstring, "__gnu_compiled", 14))
+         return;
+      }
+
     case N_NBTEXT:
     case N_FN:
     case N_FN_SEQ:
-    case N_TEXT:
       ms_type = mst_file_text;
       break;
 
@@ -450,9 +468,8 @@ record_minimal_symbol (name, address, type, objfile)
 
       /* Check for __DYNAMIC, which is used by Sun shared libraries. 
         Record it as global even if it's local, not global, so
-        lookup_minimal_symbol can find it.
-        FIXME:  this might want to check for _DYNAMIC and the current
-        symbol_leading_char.  */
+        lookup_minimal_symbol can find it.  We don't check symbol_leading_char
+        because for SunOS4 it always is '_'.  */
       if (name[8] == 'C' && STREQ ("__DYNAMIC", name))
        ms_type = mst_data;
 
@@ -2142,7 +2159,7 @@ dbx_symfile_offsets (objfile, addr)
 }
 \f
 /* Register our willingness to decode symbols for SunOS and a.out and
-   b.out files handled by BFD... */
+   NetBSD and b.out files handled by BFD... */
 static struct sym_fns sunos_sym_fns =
 {
   "sunOs",             /* sym_name: name or name prefix of BFD target type */
@@ -2167,6 +2184,18 @@ static struct sym_fns aout_sym_fns =
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
+static struct sym_fns netbsd386_sym_fns =
+{
+  "netbsd-386",                /* sym_name: name or name prefix of BFD target type */
+  10,                  /* sym_namelen: number of significant sym_name chars */
+  dbx_new_init,                /* sym_new_init: init anything gbl to entire symtab */
+  dbx_symfile_init,    /* sym_init: read initial info, setup for sym_read() */
+  dbx_symfile_read,    /* sym_read: read a symbol file into symtab */
+  dbx_symfile_finish,  /* sym_finish: finished with file, cleanup */
+  dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
+  NULL                 /* next: pointer to next struct sym_fns */
+};
+
 static struct sym_fns bout_sym_fns =
 {
   "b.out",             /* sym_name: name or name prefix of BFD target type */
@@ -2184,5 +2213,6 @@ _initialize_dbxread ()
 {
   add_symtab_fns(&sunos_sym_fns);
   add_symtab_fns(&aout_sym_fns);
+  add_symtab_fns(&netbsd386_sym_fns);
   add_symtab_fns(&bout_sym_fns);
 }