X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/ead291d4c3651415005fa289491c30e0526a4601..e1eaa37962cbaca1a03722e5ec614c65c335cfad:/gdb/coff-solib.c diff --git a/gdb/coff-solib.c b/gdb/coff-solib.c index d6ea6455ac..0af6a4f917 100644 --- a/gdb/coff-solib.c +++ b/gdb/coff-solib.c @@ -1,58 +1,62 @@ /* Handle COFF SVR3 shared libraries for GDB, the GNU Debugger. - Copyright 1993 Free Software Foundation, Inc. - -This file is part of GDB. + Copyright (C) 1993, 1994, 1998, 1999, 2000 Free Software Foundation, Inc. -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 file is part of GDB. -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. + 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. -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. */ + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "defs.h" +#include "frame.h" #include "bfd.h" #include "gdbcore.h" #include "symtab.h" +#include "symfile.h" +#include "objfiles.h" /* -GLOBAL FUNCTION + GLOBAL FUNCTION - coff_solib_add -- add a shared library files to the symtab list. We - examine the `.lib' section of the exec file and determine the names of - the shared libraries. + coff_solib_add -- add a shared library files to the symtab list. We + examine the `.lib' section of the exec file and determine the names of + the shared libraries. - This function is responsible for discovering those names and - addresses, and saving sufficient information about them to allow - their symbols to be read at a later time. + This function is responsible for discovering those names and + addresses, and saving sufficient information about them to allow + their symbols to be read at a later time. -SYNOPSIS + SYNOPSIS - void coff_solib_add (char *arg_string, int from_tty, - struct target_ops *target) + void coff_solib_add (char *arg_string, int from_tty, + struct target_ops *target, int readsyms) -DESCRIPTION + DESCRIPTION -*/ + */ void -coff_solib_add (arg_string, from_tty, target) - char *arg_string; - int from_tty; - struct target_ops *target; -{ +coff_solib_add (char *arg_string, int from_tty, struct target_ops *target, int readsyms) +{ asection *libsect; + if (!readsyms) + return; + libsect = bfd_get_section_by_name (exec_bfd, ".lib"); if (libsect) @@ -61,14 +65,13 @@ coff_solib_add (arg_string, from_tty, target) unsigned char *lib; struct libent { - long len; - long unk; - char filename[1]; + bfd_byte len[4]; + bfd_byte nameoffset[4]; }; libsize = bfd_section_size (exec_bfd, libsect); - lib = alloca (libsize); + lib = (unsigned char *) alloca (libsize); bfd_get_section_contents (exec_bfd, libsect, lib, 0, libsize); @@ -76,44 +79,56 @@ coff_solib_add (arg_string, from_tty, target) { struct libent *ent; struct objfile *objfile; + int len, nameoffset; + char *filename; + + ent = (struct libent *) lib; - ent = (struct libent *)lib; + len = bfd_get_32 (exec_bfd, ent->len); - if (ent->len <= 0) + nameoffset = bfd_get_32 (exec_bfd, ent->nameoffset); + + if (len <= 0) break; - objfile = symbol_file_add (ent->filename, from_tty, - 0, /* addr */ - 0, /* not mainline */ - 0, /* not mapped */ - 0); /* Not readnow */ - libsize -= ent->len * 4; - lib += ent->len * 4; + filename = (char *) ent + nameoffset * 4; + + objfile = symbol_file_add (filename, from_tty, + NULL, /* no offsets */ + 0, /* not mainline */ + OBJF_SHARED); /* flags */ + + libsize -= len * 4; + lib += len * 4; } + + /* Getting new symbols may change our opinion about what is + frameless. */ + reinit_frame_cache (); } } /* - -GLOBAL FUNCTION - - coff_solib_create_inferior_hook -- shared library startup support - -SYNOPSIS - - void coff_solib_create_inferior_hook() - -DESCRIPTION - - When gdb starts up the inferior, the kernel maps in the shared - libraries. We get here with the target stopped at it's first - instruction, and the libraries already mapped. At this point, this - function gets called via expansion of the macro - SOLIB_CREATE_INFERIOR_HOOK. - */ - -void -coff_solib_create_inferior_hook() + + GLOBAL FUNCTION + + coff_solib_create_inferior_hook -- shared library startup support + + SYNOPSIS + + void coff_solib_create_inferior_hook () + + DESCRIPTION + + When gdb starts up the inferior, the kernel maps in the shared + libraries. We get here with the target stopped at it's first + instruction, and the libraries already mapped. At this point, this + function gets called via expansion of the macro + SOLIB_CREATE_INFERIOR_HOOK. + */ + +void +coff_solib_create_inferior_hook (void) { - coff_solib_add ((char *) 0, 0, (struct target_ops *) 0); + coff_solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add); }