* 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.
This commit is contained in:
Stu Grossman 1993-09-22 14:54:50 +00:00
parent cb6b02027c
commit 2b91cc453b
4 changed files with 245 additions and 26 deletions

View File

@ -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;

View File

@ -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 ;;

View File

@ -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 <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <string.h>
#include <sys/conf.h>
#include <sys/kernel.h>
#include <sys/mem.h>
#include <sys/signal.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/itimer.h>
#include <sys/file.h>
#ifndef O_ACCMODE
#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR)
#endif
#define SEEK_SET 0
#define SEEK_CUR 1
#include <sys/proc.h>
#define HOST_PAGE_SIZE NBPG
#define HOST_MACHINE_ARCH bfd_arch_i386
#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 <stddef.h>, 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 */

205
bfd/lynx-core.c Normal file
View File

@ -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 */