diff options
author | Steve Chamberlain <sac@cygnus> | 1992-10-08 16:02:09 +0000 |
---|---|---|
committer | Steve Chamberlain <sac@cygnus> | 1992-10-08 16:02:09 +0000 |
commit | 294eaca479e9ced9a87b958c37feb2c570aa1595 (patch) | |
tree | bb7a6bb0ac1df535df9c7fe230c1a0bc81b85ab3 /bfd/coff-rs6000.c | |
parent | 0da7012441eaccf157dc44c8cc110fbf2d3f8376 (diff) | |
download | gdb-294eaca479e9ced9a87b958c37feb2c570aa1595.zip gdb-294eaca479e9ced9a87b958c37feb2c570aa1595.tar.gz gdb-294eaca479e9ced9a87b958c37feb2c570aa1595.tar.bz2 |
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
Diffstat (limited to 'bfd/coff-rs6000.c')
-rw-r--r-- | bfd/coff-rs6000.c | 246 |
1 files changed, 17 insertions, 229 deletions
diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index 44cbfda..8ee70d6 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -33,8 +33,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "sysdep.h" #include "libbfd.h" #include "obstack.h" -#include "internalcoff.h" -#include "coff-rs6000.h" +#include "coff/internal.h" +#include "coff/rs6000.h" #include "libcoff.h" /* The main body of code is in coffcode.h. */ @@ -234,7 +234,8 @@ rs6000coff_archive_p (abfd) /* * bfd_ardata() accesses the bfd->tdata field. */ - abfd->tdata = (void *) bfd_zalloc(abfd, sizeof (*art) + sizeof (hdr)); + abfd->tdata.aout_ar_data = + (void *) bfd_zalloc(abfd, sizeof (*art) + sizeof (hdr)); if ((art = bfd_ardata (abfd)) == NULL) { bfd_error = no_memory; return 0; @@ -292,7 +293,11 @@ rs6000coff_write_armap (arch, elength, map, orl_count, stridx) } #endif /* ARCHIVES_PLEASE */ -#ifdef COREFILES_PLEASE + +#ifdef COREFILES_PLEASE +extern bfd_target * rs6000coff_core_p (); +extern boolean rs6000coff_get_section_contents (); +extern boolean rs6000coff_core_file_matches_executable_p (); #undef coff_core_file_matches_executable_p #define coff_core_file_matches_executable_p \ @@ -300,232 +305,8 @@ rs6000coff_write_armap (arch, elength, map, orl_count, stridx) #undef coff_get_section_contents #define coff_get_section_contents rs6000coff_get_section_contents - - -/* AOUTHDR is defined by the above. We need another defn of it, from the - system include files. Punt the old one and get us a new name for the - typedef in the system include files. */ -#ifdef AOUTHDR -#undef AOUTHDR #endif -#define AOUTHDR second_AOUTHDR - -#undef SCNHDR - - -/* ------------------------------------------------------------------------ */ -/* Support for core file stuff.. */ -/* ------------------------------------------------------------------------ */ - -#include <sys/user.h> -#include <sys/ldr.h> -#include <sys/core.h> - - -/* Number of special purpose registers supported by gdb. This value - should match `tm.h' in gdb directory. Clean this mess up and use - the macros in sys/reg.h. FIXMEmgo. */ - -#define NUM_OF_SPEC_REGS 7 -#define STACK_END_ADDR 0x2ff80000 - -#define core_hdr(bfd) (((Rs6kCorData*)(bfd->tdata))->hdr) -#define core_datasec(bfd) (((Rs6kCorData*)(bfd->tdata))->data_section) -#define core_stacksec(bfd) (((Rs6kCorData*)(bfd->tdata))->stack_section) -#define core_regsec(bfd) (((Rs6kCorData*)(bfd->tdata))->reg_section) -#define core_reg2sec(bfd) (((Rs6kCorData*)(bfd->tdata))->reg2_section) - -/* These are stored in the bfd's tdata */ -typedef struct { - struct core *hdr; /* core file header */ - asection *data_section, - *stack_section, - *reg_section, /* section for GPRs and special registers. */ - *reg2_section; /* section for FPRs. */ -} Rs6kCorData; - -/* Decide if a given bfd represents a `core' file or not. There really is no - magic number or anything like, in rs6000coff. */ - -static bfd_target * -rs6000coff_core_p (abfd) - bfd *abfd; -{ - int fd; - struct core_dump coredata; - struct stat statbuf; - char *tmpptr; - - /* Use bfd_xxx routines, rather than O/S primitives to read coredata. FIXMEmgo */ - fd = open (abfd->filename, O_RDONLY); - - fstat (fd, &statbuf); - read (fd, &coredata, sizeof (struct core_dump)); - - close (fd); - - if (coredata.c_tab < (sizeof (coredata.c_u) + (int)&coredata.c_u - (int)&coredata.c_signo) || - coredata.c_tab >= statbuf.st_size || - (long)coredata.c_stack <= (long)coredata.c_tab ) { - return NULL; - } - -/* - If it looks like core file, then..... - read core file header..... (maybe you've done it above..) -*/ - - /* maybe you should alloc space for the whole core chunk over here!! FIXMEmgo */ - tmpptr = (char*)bfd_zalloc (abfd, sizeof (Rs6kCorData)); - set_tdata (abfd, tmpptr); - - /* .stack section. */ - if ((core_stacksec (abfd) = (asection*) bfd_zalloc (abfd, sizeof (asection))) - == NULL) { - bfd_error = no_memory; - /* bfd_release (abfd, ???? ) */ - return NULL; - } - core_stacksec (abfd)->name = ".stack"; - core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD; - core_stacksec (abfd)->size = coredata.c_size; - core_stacksec (abfd)->vma = STACK_END_ADDR - coredata.c_size; - core_stacksec (abfd)->filepos = coredata.c_stack; /*???? */ - - /* .reg section for GPRs and special registers. */ - if ((core_regsec (abfd) = (asection*) bfd_zalloc (abfd, sizeof (asection))) - == NULL) { - bfd_error = no_memory; - /* bfd_release (abfd, ???? ) */ - return NULL; - } - core_regsec (abfd)->name = ".reg"; - core_regsec (abfd)->flags = SEC_ALLOC; - core_regsec (abfd)->size = (32 + NUM_OF_SPEC_REGS) * 4; - core_regsec (abfd)->vma = NULL; /* not used?? */ - core_regsec (abfd)->filepos = - (char*)&coredata.c_u.u_save - (char*)&coredata; - - /* .reg2 section for FPRs (floating point registers). */ - if ((core_reg2sec (abfd) = (asection*) bfd_zalloc (abfd, sizeof (asection))) - == NULL) { - bfd_error = no_memory; - /* bfd_release (abfd, ???? ) */ - return NULL; - } - core_reg2sec (abfd)->name = ".reg2"; - core_reg2sec (abfd)->flags = SEC_ALLOC; - core_reg2sec (abfd)->size = 8 * 32; /* 32 FPRs. */ - core_reg2sec (abfd)->vma = NULL; /* not used?? */ - core_reg2sec (abfd)->filepos = - (char*)&coredata.c_u.u_save.fpr[0] - (char*)&coredata; - - /* set up section chain here. */ - abfd->section_count = 3; - abfd->sections = core_stacksec (abfd); - core_stacksec (abfd)->next = core_regsec(abfd); - core_regsec (abfd)->next = core_reg2sec (abfd); - core_reg2sec (abfd)->next = NULL; - - return abfd->xvec; /* this is garbage for now. */ -} - - - -/* return `true' if given core is from the given executable.. */ -static boolean -rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd; - bfd *exec_bfd; -{ - FILE *fd; - struct core_dump coredata; - struct ld_info ldinfo; - char pathname [1024]; - char *str1, *str2; - - /* Use bfd_xxx routines, rather than O/S primitives, do error checking!! - FIXMEmgo */ - fd = fopen (core_bfd->filename, "r"); - - fread (&coredata, sizeof (struct core_dump), 1, fd); - fseek (fd, (long)coredata.c_tab, 0); - fread (&ldinfo, (char*)&ldinfo.ldinfo_filename[0] - (char*)&ldinfo.ldinfo_next, - 1, fd); - fscanf (fd, "%s", pathname); - printf ("path: %s\n", pathname); - - str1 = strrchr (pathname, '/'); - str2 = strrchr (exec_bfd->filename, '/'); - - /* step over character '/' */ - str1 = str1 ? str1+1 : &pathname[0]; - str2 = str2 ? str2+1 : exec_bfd->filename; - - fclose (fd); - return strcmp (str1, str2); -} - - -static boolean -rs6000coff_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - int count; -{ - if (count == 0) - return true; - - /* Reading a core file's sections will be slightly different. For the - rest of them we can use bfd_generic_get_section_contents () I suppose. */ - /* Make sure this routine works for any bfd and any section. FIXMEmgo. */ - - if (abfd->format == bfd_core && strcmp (section->name, ".reg") == 0) { - - struct mstsave mstatus; - int regoffset = (char*)&mstatus.gpr[0] - (char*)&mstatus; - - /* Assert that the only way this code will be executed is reading the - whole section. */ - if (offset || count != (sizeof(mstatus.gpr) + (4 * NUM_OF_SPEC_REGS))) - printf ("ERROR! in rs6000coff_get_section_contents()\n"); - - /* for `.reg' section, `filepos' is a pointer to the `mstsave' structure - in the core file. */ - - /* read GPR's into the location. */ - if ( bfd_seek(abfd, section->filepos + regoffset, SEEK_SET) == -1 - || bfd_read(location, sizeof (mstatus.gpr), 1, abfd) != sizeof (mstatus.gpr)) - return (false); /* on error */ - - /* increment location to the beginning of special registers in the section, - reset register offset value to the beginning of first special register - in mstsave structure, and read special registers. */ - - location = (PTR) ((char*)location + sizeof (mstatus.gpr)); - regoffset = (char*)&mstatus.iar - (char*)&mstatus; - - if ( bfd_seek(abfd, section->filepos + regoffset, SEEK_SET) == -1 - || bfd_read(location, 4 * NUM_OF_SPEC_REGS, 1, abfd) != - 4 * NUM_OF_SPEC_REGS) - return (false); /* on error */ - - /* increment location address, and read the special registers.. */ - /* FIXMEmgo */ - return (true); - } - - /* else, use default bfd section content transfer. */ - else - return bfd_generic_get_section_contents - (abfd, section, location, offset, count); -} - -#endif /* COREFILES_PLEASE */ - /* The transfer vector that leads the outside world to all of the above. */ bfd_target rs6000coff_vec = @@ -540,6 +321,7 @@ bfd_target rs6000coff_vec = HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT), (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ + 0, /* leading char */ '/', /* ar_pad_char */ 15, /* ar_max_namelen??? FIXMEmgo */ 3, /* default alignment power */ @@ -548,7 +330,13 @@ bfd_target rs6000coff_vec = _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs */ {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - coff_archive_p, _bfd_dummy_target}, + coff_archive_p, +#ifdef COREFILES_PLEASE + rs6000coff_core_p +#else + _bfd_dummy_target +#endif + }, {bfd_false, coff_mkobject, coff_mkarchive, /* bfd_set_format */ bfd_false}, {bfd_false, coff_write_object_contents, /* bfd_write_contents */ |