@ -1,5 +1,5 @@
/* BFD back end for traditional Unix core files (U-area and raw sections)
Copyright ( C ) 1988 , 1989 , 1991 Free Software Foundation , Inc .
Copyright 1988 , 1989 , 1991 , 1992 Free Software Foundation , Inc .
Written by John Gilmore of Cygnus Support .
This file is part of BFD , the Binary File Descriptor library .
@ -36,26 +36,32 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
# include <sys/param.h>
# include <sys/dir.h>
# include <signal.h>
# include <machine/reg.h>
# include <sys/user.h> /* After a.out.h */
# include <sys/file.h>
# include <errno.h>
/* These are stored in the bfd's tdata */
struct core_data {
struct user * upage ; /* core file header */
asection * data_section ;
asection * stack_section ;
asection * reg_section ;
} ;
struct trad_core_struct
{
asection * data_section ;
asection * stack_section ;
asection * reg_section ;
struct user u ;
} * rawptr ;
# define core_upage(bfd) (&((bfd)->tdata.trad_core_data->u))
# define core_datasec(bfd) ((bfd)->tdata.trad_core_data->data_section)
# define core_stacksec(bfd) ((bfd)->tdata.trad_core_data->stack_section)
# define core_regsec(bfd) ((bfd)->tdata.trad_core_data->reg_section)
/* forward declarations */
# define core_hdr(bfd) (((struct core_data *) (bfd->tdata))->hdr)
# define core_upage(bfd) (((struct core_data *) ((bfd)->tdata))->upage)
# define core_datasec(bfd) (((struct core_data *) ((bfd)->tdata))->data_section)
# define core_stacksec(bfd) (((struct core_data*)((bfd)->tdata))->stack_section)
# define core_regsec(bfd) (((struct core_data *) ((bfd)->tdata))->reg_section)
bfd_target * trad_unix_core_file_p PARAMS ( ( bfd * abfd ) ) ;
char * trad_unix_core_file_failing_command PARAMS ( ( bfd * abfd ) ) ;
int trad_unix_core_file_failing_signal PARAMS ( ( bfd * abfd ) ) ;
boolean trad_unix_core_file_matches_executable_p
PARAMS ( ( bfd * core_bfd , bfd * exec_bfd ) ) ;
/* Handle 4.2-style (and perhaps also sysV-style) core dump file. */
@ -63,16 +69,10 @@ struct core_data {
bfd_target *
trad_unix_core_file_p ( abfd )
bfd * abfd ;
{
int val ;
struct user u ;
unsigned int reg_offset , fp_reg_offset ;
/* This struct is just for allocating two things with one zalloc, so
they will be freed together , without violating alignment constraints . */
struct core_user {
struct core_data coredata ;
struct user u ;
} * rawptr ;
val = bfd_read ( ( void * ) & u , 1 , sizeof u , abfd ) ;
if ( val ! = sizeof u )
@ -89,34 +89,35 @@ trad_unix_core_file_p (abfd)
/* Allocate both the upage and the struct core_data at once, so
a single free ( ) will free them both . */
rawptr = ( struct core_user * ) bfd_zalloc ( abfd , sizeof ( struct core_user ) ) ;
rawptr = ( struct trad_core_struct * )
bfd_zalloc ( abfd , sizeof ( struct trad_core_struct ) ) ;
if ( rawptr = = NULL ) {
bfd_error = no_memory ;
return 0 ;
}
set_tdata ( abfd , & rawptr - > coredata ) ;
core_upage ( abfd ) = & rawptr - > u ;
* core_upage ( abfd ) = u ; /* Save that upage! */
abfd - > tdata . trad_core_data = rawptr ;
rawptr - > u = u ; /*Copy the uarea into the tdata part of the bfd */
/* Create the sections. This is raunchy, but bfd_close wants to free
them separately . */
core_stacksec ( abfd ) = ( asection * ) zalloc ( sizeof ( asection ) ) ;
core_stacksec ( abfd ) = ( asection * ) zalloc ( sizeof ( asection ) ) ;
if ( core_stacksec ( abfd ) = = NULL ) {
loser :
loser :
bfd_error = no_memory ;
free ( ( void * ) rawptr ) ;
return 0 ;
}
core_datasec ( abfd ) = ( asection * ) zalloc ( sizeof ( asection ) ) ;
if ( core_datasec ( abfd ) = = NULL ) {
loser1 :
loser1 :
free ( ( void * ) core_stacksec ( abfd ) ) ;
goto loser ;
}
core_regsec ( abfd ) = ( asection * ) zalloc ( sizeof ( asection ) ) ;
if ( core_regsec ( abfd ) = = NULL ) {
loser2 :
free ( ( void * ) core_datasec ( abfd ) ) ;
goto loser1 ;
}
@ -129,9 +130,9 @@ loser2:
core_datasec ( abfd ) - > flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS ;
core_regsec ( abfd ) - > flags = SEC_ALLOC + SEC_HAS_CONTENTS ;
core_datasec ( abfd ) - > size = NBPG * u . u_dsize ;
core_stacksec ( abfd ) - > size = NBPG * u . u_ssize ;
core_regsec ( abfd ) - > size = NBPG * UPAGES ; /* Larger than sizeof struct u */
core_datasec ( abfd ) - > _raw_ size = NBPG * u . u_dsize ;
core_stacksec ( abfd ) - > _raw_ size = NBPG * u . u_ssize ;
core_regsec ( abfd ) - > _raw_ size = NBPG * UPAGES ; /* Larger than sizeof struct u */
/* What a hack... we'd like to steal it from the exec file,
since the upage does not seem to provide it . FIXME . */
@ -148,7 +149,7 @@ loser2:
from * u_ar0 . The other is that u_ar0 is sometimes an absolute address
in kernel memory , and on other systems it is an offset from the beginning
of the ` struct user ' .
As a practical matter , we don ' t know where the registers actually are ,
so we have to pass the whole area to GDB . We encode the value of u_ar0
by setting the . regs section up so that its virtual memory address
@ -159,7 +160,7 @@ loser2:
core_datasec ( abfd ) - > filepos = NBPG * UPAGES ;
core_stacksec ( abfd ) - > filepos = ( NBPG * UPAGES ) + NBPG * u . u_dsize ;
core_regsec ( abfd ) - > filepos = 0 ; /* Register segment is the upage */
core_regsec ( abfd ) - > filepos = 0 ; /* Register segment is the upage */
/* Align to word at least */
core_stacksec ( abfd ) - > alignment_power = 2 ;
@ -178,9 +179,12 @@ char *
trad_unix_core_file_failing_command ( abfd )
bfd * abfd ;
{
if ( * core_upage ( abfd ) - > u_comm )
return core_upage ( abfd ) - > u_comm ;
# ifndef NO_CORE_COMMAND
char * com = abfd - > tdata . trad_core_data - > u . u_comm ;
if ( * com )
return com ;
else
# endif
return 0 ;
}
@ -205,55 +209,56 @@ trad_unix_core_file_matches_executable_p (core_bfd, exec_bfd)
# define trad_unix_generic_stat_arch_elt bfd_generic_stat_arch_elt
# define trad_unix_slurp_armap bfd_false
# define trad_unix_slurp_extended_name_table bfd_true
# define trad_unix_write_armap (PROTO (boolean, (*), \
( bfd * arch , unsigned int elength , struct orl * map , int orl_count , \
int stridx ) ) ) bfd_false
# define trad_unix_write_armap (boolean (*) PARAMS \
( ( bfd * arch , unsigned int elength , struct orl * map , \
unsigned int orl_count , int stridx ) ) ) bfd_false
# define trad_unix_truncate_arname bfd_dont_truncate_arname
# define aout_32_openr_next_archived_file bfd_generic_openr_next_archived_file
# define trad_unix_close_and_cleanup bfd_generic_close_and_cleanup
# define trad_unix_set_section_contents (PROTO(boolean, (*), \
( bfd * abfd , asection * section , PTR data , file_ptr offset , \
bfd_size_type count ) ) ) bfd_false
# define trad_unix_set_section_contents (boolean (*) PARAMS \
( ( bfd * abfd , asection * section , PTR data , file_ptr offset , \
bfd_size_type count ) ) ) bfd_false
# define trad_unix_get_section_contents bfd_generic_get_section_contents
# define trad_unix_new_section_hook (PROTO (boolean, (*), \
( bfd * , sec_ptr ) ) ) bfd_true
# define trad_unix_new_section_hook (boolean (*) PARAMS \
( ( bfd * , sec_ptr ) ) ) bfd_true
# define trad_unix_get_symtab_upper_bound bfd_0u
# define trad_unix_get_symtab (PROTO (unsigned int, (*), \
( bfd * , struct symbol_cache_entry * * ) ) ) bfd_0u
# define trad_unix_get_reloc_upper_bound (PROTO (unsigned int, (*), \
( bfd * , sec_ptr ) ) ) bfd_0u
# define trad_unix_canonicalize_reloc (PROTO (unsigned int, (*), \
( bfd * , sec_ptr , arelent * * , struct symbol_cache_entry * * ) ) ) bfd_0u
# define trad_unix_make_empty_symbol (PROTO ( \
struct symbol_cache_entry * , ( * ) , ( bfd * ) ) ) bfd_false
# define trad_unix_print_symbol (PROTO (void, (*), \
( bfd * , PTR , struct symbol_cache_entry * , \
bfd_print_symbol_type ) ) ) bfd_false
# define trad_unix_get_lineno (PROTO (alent *, (*), \
( bfd * , struct symbol_cache_entry * ) ) ) bfd_nullvoidptr
# define trad_unix_set_arch_mach (PROTO (boolean, (*), \
# define trad_unix_get_symtab (unsigned int (*) PARAMS \
( ( bfd * , struct symbol_cache_entry * * ) ) ) bfd_0u
# define trad_unix_get_reloc_upper_bound (unsigned int (*) PARAMS \
( ( bfd * , sec_ptr ) ) ) bfd_0u
# define trad_unix_canonicalize_reloc (unsigned int (*) PARAMS \
( ( bfd * , sec_ptr , arelent * * , struct symbol_cache_entry * * ) ) ) bfd_0u
# define trad_unix_make_empty_symbol (struct symbol_cache_entry * \
( * ) ( ( bfd * ) ) ) bfd_false
# define trad_unix_print_symbol (void (*) PARAMS \
( ( bfd * , PTR , struct symbol_cache_entry * , \
bfd_print_symbol_type ) ) ) bfd_false
# define trad_unix_get_lineno (alent * (*) PARAMS \
( ( bfd * , struct symbol_cache_entry * ) ) ) bfd_nullvoidptr
# define trad_unix_set_arch_mach (boolean (*) PARAMS \
( bfd * , enum bfd_architecture , unsigned long ) ) ) bfd_false
# define trad_unix_find_nearest_line (PROTO (boolean, (*), \
# define trad_unix_find_nearest_line (boolean (*) PARAMS \
( bfd * abfd , struct sec * section , \
struct symbol_cache_entry * * symbols , bfd_vma offset , \
CONST char * * file , CONST char * * func , unsigned int * line ) ) ) bfd_false
# define trad_unix_sizeof_headers (PROTO (int, (*), \
# define trad_unix_sizeof_headers (int (*) PARAMS \
( bfd * , boolean ) ) ) bfd_0
# define trad_unix_bfd_debug_info_start bfd_void
# define trad_unix_bfd_debug_info_end bfd_void
# define trad_unix_bfd_debug_info_accumulate (PROTO (void, (*), \
# define trad_unix_bfd_debug_info_accumulate (void (*) PARAMS \
( bfd * , struct sec * ) ) ) bfd_void
# define trad_unix_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
# define trad_unix_bfd_relax_section bfd_generic_relax_section
/* If somebody calls any byte-swapping routines, shoot them. */
void
swap_abort ( )
{
abort ( ) ; /* This way doesn't require any declaration for ANSI to fuck up */
}
# define NO_GET ((PROTO( bfd_vma, (*), ( bfd_byte *))) swap_abort )
# define NO_PUT ((PROTO( void, (*), (bfd_vma, bfd_byte *))) swap_abort )
# define NO_GET ((bfd_vma (*) PARAMS ( ( bfd_byte *))) swap_abort )
# define NO_PUT ((void (*) PARAMS ( (bfd_vma, bfd_byte *))) swap_abort )
bfd_target trad_core_vec =
{
@ -265,6 +270,7 @@ bfd_target trad_core_vec =
HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED ) ,
( SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC ) , /* section flags */
' _ ' , /* symbol prefix */
' ' , /* ar_pad_char */
16 , /* ar_max_namelen */
3 , /* minimum alignment power */