From: Stu Grossman Date: Wed, 22 Sep 1993 14:54:50 +0000 (+0000) Subject: * Makefile.in (OPTIONAL_BACKENDS): Add lynx-core.o. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2b91cc453bae74cdf8ccd567a651b6af4aa0ce10;p=binutils-gdb.git * Makefile.in (OPTIONAL_BACKENDS): Add lynx-core.o. * bfd-in2.h (tdata): Add lynx_core_data; * config.bfd configure.host: Get rid of superfluous netbsd and lynxos entries. * configure.in: Add lynx-core.o to Lynx config. * i386lynx.c: Add defs for core file support. * lynx-core.c: New file with Lynx core file support. * hosts/i386lynx.h: Move lots of host specific includes to here. Add def of HOST_LYNX. Remove unnecessary defs. --- diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index c7ca34eb675..2054de714de 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -188,9 +188,6 @@ typedef enum bfd_symclass { } symclass; -typedef int symtype; /* Who knows, yet? */ - - /* general purpose part of a symbol; target specific parts will be found in libcoff.h, liba.out.h etc */ @@ -406,6 +403,27 @@ CAT(NAME,_bfd_make_debug_symbol) #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char) +/* Byte swapping routines. */ + +bfd_vma bfd_getb64 PARAMS ((unsigned char *)); +bfd_vma bfd_getl64 PARAMS ((unsigned char *)); +bfd_signed_vma bfd_getb_signed_64 PARAMS ((unsigned char *)); +bfd_signed_vma bfd_getl_signed_64 PARAMS ((unsigned char *)); +bfd_vma bfd_getb32 PARAMS ((unsigned char *)); +bfd_vma bfd_getl32 PARAMS ((unsigned char *)); +bfd_signed_vma bfd_getb_signed_32 PARAMS ((unsigned char *)); +bfd_signed_vma bfd_getl_signed_32 PARAMS ((unsigned char *)); +bfd_vma bfd_getb16 PARAMS ((unsigned char *)); +bfd_vma bfd_getl16 PARAMS ((unsigned char *)); +bfd_signed_vma bfd_getb_signed_16 PARAMS ((unsigned char *)); +bfd_signed_vma bfd_getl_signed_16 PARAMS ((unsigned char *)); +void bfd_putb64 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl64 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putb32 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl32 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putb16 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl16 PARAMS ((bfd_vma, unsigned char *)); + /* And more from the source. */ void bfd_init PARAMS ((void)); @@ -1539,6 +1557,7 @@ struct _bfd struct hppa_data_struct *hppa_data; struct hpux_core_struct *hpux_core_data; struct sgi_core_struct *sgi_core_data; + struct lynx_core_struct *lynx_core_data; PTR any; } tdata; diff --git a/bfd/config.bfd b/bfd/config.bfd index 47e9f6e699d..1f5407aa1db 100755 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -29,11 +29,9 @@ case "${canon}" in i[34]86-*-sysv4*) bfd_name=i386-elf ;; i[34]86-*-solaris2*) bfd_name=i386-elf ;; i[34]86-*-sysv*) bfd_name=i386-coff ;; - i[34]86-*-isc*) bfd_name=i386-sco ;; # gets core dump reading right - i[34]86-*-sco*) bfd_name=i386-sco ;; + i[34]86-*-isc*) bfd_name=i386-coff ;; + i[34]86-*-sco*) bfd_name=i386-coff ;; 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 ;; i[34]86-*-elf) bfd_name=i386-elf ;; diff --git a/bfd/hosts/i386lynx.h b/bfd/hosts/i386lynx.h index 59adeffa505..b399533b327 100644 --- a/bfd/hosts/i386lynx.h +++ b/bfd/hosts/i386lynx.h @@ -1,35 +1,32 @@ -/* Intel 386 running any BSD Unix */ +/* Intel 386 running Lynx OS */ + +#ifndef hosts_i386lynx_h +#define hosts_i386lynx_h -#ifndef hosts_i386bsd_H #include #include #include #include -#include -#include #include #include -#include -#ifndef O_ACCMODE -#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) -#endif - -#define SEEK_SET 0 -#define SEEK_CUR 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include #define HOST_PAGE_SIZE NBPG #define HOST_MACHINE_ARCH bfd_arch_i386 -#define HOST_TEXT_START_ADDR USRTEXT +#define HOST_TEXT_START_ADDR USRTEXT -#define u_comm u_kproc.kp_proc.p_comm +#define HOST_LYNX #include "fopen-same.h" -#define hosts_i386bsd_H #undef I386 /* Lynx defines this for some reason */ -#endif -/* From ANSI C , which we can't depend upon the existence of */ -#ifndef offsetof -#define offsetof(type,memb) ((size_t)&(((type *)0)->memb)) -#endif +#endif /* hosts_i386lynx_h */ diff --git a/bfd/lynx-core.c b/bfd/lynx-core.c new file mode 100644 index 00000000000..5c5e2bea320 --- /dev/null +++ b/bfd/lynx-core.c @@ -0,0 +1,205 @@ +/* BFD back end for Lynx core files + Copyright 1993 Free Software Foundation, Inc. + Written by Stu Grossman of Cygnus Support. + +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. */ + +#include "bfd.h" +#include "sysdep.h" +#include "libbfd.h" + +#ifdef HOST_LYNX /* Core files only work locally for now */ + +/* These are stored in the bfd's tdata */ + +struct lynx_core_struct +{ + int sig; + char cmd[PNMLEN + 1]; +}; + +#define core_hdr(bfd) ((bfd)->tdata.lynx_core_data) +#define core_signal(bfd) (core_hdr(bfd)->sig) +#define core_command(bfd) (core_hdr(bfd)->cmd) + +/* Handle Lynx core dump file. */ + +static asection * +make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos) + bfd *abfd; + CONST char *name; + flagword flags; + bfd_size_type _raw_size; + bfd_vma vma; + file_ptr filepos; +{ + asection *asect; + char *newname; + + newname = bfd_alloc (abfd, strlen (name) + 1); + if (!newname) + return NULL; + + strcpy (newname, name); + + asect = bfd_make_section (abfd, newname); + if (!asect) + return NULL; + + asect->flags = flags; + asect->_raw_size = _raw_size; + asect->vma = vma; + asect->filepos = filepos; + asect->alignment_power = 2; + + return asect; +} + +/* ARGSUSED */ +bfd_target * +lynx_core_file_p (abfd) + bfd *abfd; +{ + int val; + int secnum; + struct pssentry pss; + size_t tcontext_size; + core_st_t *threadp; + int pagesize; + asection *newsect; + + pagesize = getpagesize (); /* Serious cross-target issue here... This + really needs to come from a system-specific + header file. */ + + /* Get the pss entry from the core file */ + + bfd_seek (abfd, 0, SEEK_SET); + + val = bfd_read ((void *)&pss, 1, sizeof pss, abfd); + if (val != sizeof pss) + { + /* Too small to be a core file */ + bfd_error = wrong_format; + return NULL; + } + + core_hdr (abfd) = (struct lynx_core_struct *) + bfd_zalloc (abfd, sizeof (struct lynx_core_struct)); + + if (!core_hdr (abfd)) + { + bfd_error = no_memory; + return NULL; + } + + strncpy (core_command (abfd), pss.pname, PNMLEN + 1); + + /* Compute the size of the thread contexts */ + + tcontext_size = pss.threadcnt * sizeof (core_st_t); + + /* Allocate space for the thread contexts */ + + threadp = (core_st_t *)bfd_zalloc (abfd, tcontext_size); + if (!threadp) + { + bfd_error = no_memory; + return NULL; + } + + /* Save thread contexts */ + + bfd_seek (abfd, pagesize, SEEK_SET); + + val = bfd_read ((void *)threadp, pss.threadcnt, sizeof (core_st_t), abfd); + + if (val != tcontext_size) + { + /* Probably too small to be a core file */ + bfd_error = wrong_format; + return NULL; + } + + core_signal (abfd) = threadp->currsig; + + newsect = make_bfd_asection (abfd, ".stack", + SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS, + pss.ssize, + pss.slimit, + pagesize + tcontext_size); + if (!newsect) + { + bfd_error = no_memory; + return NULL; + } + + newsect = make_bfd_asection (abfd, ".data", + SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS, + pss.data_len + pss.bss_len, + pss.data_start, + pagesize + tcontext_size + pss.ssize); + if (!newsect) + { + bfd_error = no_memory; + return NULL; + } + + for (secnum = 0; secnum < pss.threadcnt; secnum++) + { + char secname[100]; + + sprintf (secname, ".reg%d", threadp[secnum].tid); + newsect = make_bfd_asection (abfd, secname, + SEC_ALLOC + SEC_HAS_CONTENTS, + sizeof (core_st_t), + 0, + pagesize + secnum * sizeof (core_st_t)); + if (!newsect) + { + bfd_error = no_memory; + return NULL; + } + } + + return abfd->xvec; +} + +char * +lynx_core_file_failing_command (abfd) + bfd *abfd; +{ + return core_command (abfd); +} + +/* ARGSUSED */ +int +lynx_core_file_failing_signal (abfd) + bfd *abfd; +{ + return core_signal (abfd); +} + +/* ARGSUSED */ +boolean +lynx_core_file_matches_executable_p (core_bfd, exec_bfd) + bfd *core_bfd, *exec_bfd; +{ + return true; /* FIXME, We have no way of telling at this point */ +} + +#endif /* HOST_LYNX */