aboutsummaryrefslogtreecommitdiff
path: root/gdb/symfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/symfile.c')
-rw-r--r--gdb/symfile.c151
1 files changed, 62 insertions, 89 deletions
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 7629fd8..93815b5 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -18,7 +18,6 @@ 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 <stdio.h>
#include "defs.h"
#include "symtab.h"
#include "gdbtypes.h"
@@ -29,7 +28,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "symfile.h"
#include "gdbcmd.h"
#include "breakpoint.h"
-#include "state.h"
#include <obstack.h>
#include <assert.h>
@@ -43,6 +41,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
CORE_ADDR entry_point; /* Where execution starts in symfile */
struct sym_fns *symtab_fns = NULL; /* List of all available sym_fns. */
+int readnow_symbol_files; /* Read full symbols immediately */
/* External variables and functions referenced. */
@@ -59,9 +58,6 @@ load_command PARAMS ((char *, int));
static void
add_symbol_file_command PARAMS ((char *, int));
-static struct objfile *
-symbol_file_add_digested PARAMS ((sfd *, int));
-
static void
cashier_psymtab PARAMS ((struct partial_symtab *));
@@ -428,48 +424,10 @@ syms_from_objfile (objfile, addr, mainline, verbo)
/* We're done reading the symbol file; finish off complaints. */
clear_complaints(0, verbo);
- /* Setup the breakpoint(s) for trapping longjmp(), as it may have been
- defined by this new file. */
- create_longjmp_breakpoint();
-}
-
-/* Reload a predigested symbol file from a dumped state file.
-
- FIXME: For now, we load only the first dumped objfile that we
- find, for two reasons. (1) Our custom malloc and mmap'd sbrk
- implementation only supports one mmap'd objfile at a time, so we
- can only create state files with one dumped objfile in them and
- would have no way to deal with multiple dumped objfiles when reading
- the state file back in even if we could create them. (2) We currently
- have no way to select a specific objfile to load from a state file
- containing a dump of more than one objfile, so we just select the
- first one we encounter. */
-
-static struct objfile *
-symbol_file_add_digested (asfd, from_tty)
- sfd *asfd;
- int from_tty;
-{
- struct objfile *objfile;
- bfd *sym_bfd;
-
- /* First locate and map in the dumped symbol information */
-
- objfile = objfile_from_statefile (asfd);
-
- /* Push this file onto the head of the linked list of other such files. */
-
- objfile -> next = object_files;
- object_files = objfile;
-
-#if 0 /* FIXME: Things to deal with... */
- objfile -> obfd = abfd;
- objfile -> mtime = bfd_get_mtime (abfd);
- obstack_full_begin (&objfile -> psymbol_obstack, 0, 0, xmalloc, free);
- obstack_full_begin (&objfile -> symbol_obstack, 0, 0, xmalloc, free);
- obstack_full_begin (&objfile -> type_obstack, 0, 0, xmalloc, free);
-#endif
+ /* Fixup all the breakpoints that may have been redefined by this
+ symbol file. */
+ breakpoint_re_set ();
}
/* Process a symbol file, as either the main file or as a dynamically
@@ -486,17 +444,17 @@ symbol_file_add_digested (asfd, from_tty)
Upon failure, jumps back to command level (never returns). */
struct objfile *
-symbol_file_add (name, from_tty, addr, mainline, dumpable)
+symbol_file_add (name, from_tty, addr, mainline, mapped)
char *name;
int from_tty;
CORE_ADDR addr;
int mainline;
- int dumpable;
+ int mapped;
{
struct objfile *objfile;
bfd *sym_bfd;
- objfile = symfile_open (name, dumpable);
+ objfile = symfile_open (name, mapped);
sym_bfd = objfile->obfd;
/* There is a distinction between having no symbol table
@@ -510,25 +468,39 @@ symbol_file_add (name, from_tty, addr, mainline, dumpable)
error ("%s has no symbol-table", name);
}
- if ((have_full_symbols () || have_partial_symbols ())
- && mainline
- && from_tty
- && !query ("Load new symbol table from \"%s\"? ", name))
- error ("Not confirmed.");
+ /* If the objfile uses a mapped symbol file, and we have a psymtab for
+ it, then skip reading any symbols at this time. */
- if (from_tty || info_verbose)
+ if ((objfile -> psymtabs != NULL) && (objfile -> flags & OBJF_MAPPED))
{
- printf_filtered ("Reading symbols from %s...", name);
- wrap_here ("");
- fflush (stdout);
+ if (from_tty || info_verbose)
+ {
+ printf_filtered ("Mapped symbols for %s.\n", name);
+ fflush (stdout);
+ }
}
-
- syms_from_objfile (objfile, addr, mainline, from_tty);
-
- if (from_tty || info_verbose)
+ else
{
- printf_filtered ("done.\n");
- fflush (stdout);
+ if ((have_full_symbols () || have_partial_symbols ())
+ && mainline
+ && from_tty
+ && !query ("Load new symbol table from \"%s\"? ", name))
+ error ("Not confirmed.");
+
+ if (from_tty || info_verbose)
+ {
+ printf_filtered ("Reading symbols from %s...", name);
+ wrap_here ("");
+ fflush (stdout);
+ }
+
+ syms_from_objfile (objfile, addr, mainline, from_tty);
+
+ if (from_tty || info_verbose)
+ {
+ printf_filtered ("done.\n");
+ fflush (stdout);
+ }
}
return (objfile);
}
@@ -546,8 +518,7 @@ symbol_file_command (args, from_tty)
struct cleanup *cleanups;
struct objfile *objfile;
struct partial_symtab *psymtab;
- sfd *sym_sfd;
- int dumpable = 0;
+ int mapped = 0;
int readnow = 0;
dont_repeat ();
@@ -575,16 +546,16 @@ symbol_file_command (args, from_tty)
{
if ((argv = buildargv (args)) == NULL)
{
- fatal ("virtual memory exhausted.", 0);
+ nomem (0);
}
cleanups = make_cleanup (freeargv, (char *) argv);
name = *argv;
while (*++argv != NULL)
{
- if (!strcmp (*argv, "dumpable"))
+ if (!strcmp (*argv, "mapped"))
{
- dumpable = 1;
+ mapped = 1;
}
else if (!strcmp (*argv, "readnow"))
{
@@ -594,25 +565,19 @@ symbol_file_command (args, from_tty)
if (name != NULL)
{
- if ((sym_sfd = sfd_fopen (name, "r")) != NULL)
+ /* Getting new symbols may change our opinion about what is
+ frameless. */
+ reinit_frame_cache ();
+ objfile = symbol_file_add (name, from_tty, (CORE_ADDR)0, 1,
+ mapped);
+ readnow |= readnow_symbol_files;
+ if (readnow)
{
- (void) symbol_file_add_digested (sym_sfd, from_tty);
- }
- else
- {
- /* Getting new symbols may change our opinion about what is
- frameless. */
- reinit_frame_cache ();
- objfile = symbol_file_add (name, from_tty, (CORE_ADDR)0, 1,
- dumpable);
- if (readnow)
+ for (psymtab = objfile -> psymtabs;
+ psymtab != NULL;
+ psymtab = psymtab -> next)
{
- for (psymtab = objfile -> psymtabs;
- psymtab != NULL;
- psymtab = psymtab -> next)
- {
- (void) psymtab_to_symtab (psymtab);
- }
+ (void) psymtab_to_symtab (psymtab);
}
}
}
@@ -626,9 +591,9 @@ symbol_file_command (args, from_tty)
In case of trouble, error() is called. */
static struct objfile *
-symfile_open (name, dumpable)
+symfile_open (name, mapped)
char *name;
- int dumpable;
+ int mapped;
{
bfd *sym_bfd;
int desc;
@@ -662,7 +627,7 @@ symfile_open (name, dumpable)
name, bfd_errmsg (bfd_error));
}
- objfile = allocate_objfile (sym_bfd, name, dumpable);
+ objfile = allocate_objfile (sym_bfd, name, mapped);
return objfile;
}
@@ -778,6 +743,14 @@ reread_symbols ()
the_big_top:
for (objfile = object_files; objfile; objfile = objfile->next) {
if (objfile->obfd) {
+#ifdef IBM6000
+ /* If this object is from a shared library, then you should
+ stat on the library name, not member name. */
+
+ if (objfile->obfd->my_archive)
+ res = stat (objfile->obfd->my_archive->filename, &new_statbuf);
+ else
+#endif
res = stat (objfile->name, &new_statbuf);
if (res != 0) {
/* FIXME, should use print_sys_errmsg but it's not filtered. */