2001-01-26 Fernando Nasser <fnasser@redhat.com>

Fix double parsing of filenames passed as command line arguments
        to GDB (causes weird handling of escape characters).
        Also, remove dependencies on the CLI from libgdb.
        * call-cmds.h: Remove declaration of exec_file_command().
        * gdbcore.h: Remove declaration of exec_file_command().
        Add declarations for exec_open() and exec_file_clear().
        * symfile.h: Add declarations for symbol_file_add_main() and
        symbol_file_clear().
        * exec.c (exec_open): New function. Implements to_open for exec
        targets.
        (exec_file_clear): New function. Makes GDB forget about a previously
        specified executable file.
        (exec_file_attach): Move parsing of arguments from here ...
        (exec_file_command): ... to here.
        (init_exec_ops): Use exec_open(), not exec_file_command() to
        implement to_open for exec targets.
        * symfile.c (symbol_file_add_main): New function. Call symbol_file_add()        with default values.  Used when the file name has already been parsed.
        (symbol_file_clear): New function. Makes GDB forget about previously
        read symbols.
        (symbol_file_command): Call the above function instead of inline code.
        * main.c: Include "symfile.h" and "gdbcore.h" instead of the deprecated
        "call-cmds.h".
        (captured_main): Call exec_file_attach() and symbol_file_add_main()
        instead of exec_file_command() and symbol_file_command().
        (captured_main): Add comment.
        * corefile.c: Include "symfile.h".
        (core_file_command): Call symbol_file_add_main() instead of
        symbol_file_command().
        (reopen_exec_file): Call exec_open() instead of exec_file_command().
        * infcmd.c: Include "symfile.h".
        (attach_command): Call symbol_file_add_main() instead of
        symbol_file_command().
        * infrun.c: Remove comment about the inclusion of "symfile.h",
        not any longer appropriate.
        (follow_exec): Call symbol_file_add_main() instead of
        symbol_file_command().
        * remote-es.c: Include "symfile.h".
        (es1800_load): Call symbol_file_add_main() instead of
        symbol_file_command().
        * remote-vx.c: Remove comment about the inclusion of "symfile.h",
        not any longer appropriate.
        (vx-wait): Call symbol_file_add_main() instead of
        symbol_file_command().
        * solib-svr4.c (open_symbol_file_object): Call symbol_file_add_main()
        instead of symbol_file_command().
        * v850ice.c (ice_file): Call exec_open(), exec_file_attach() and
        symbol_file_add_main() instead of exec_file_command() and
        symbol_file_command().
        * Makefile.in: Update dependencies.
This commit is contained in:
Fernando Nasser 2001-01-27 00:43:26 +00:00
parent 8fb35fedd5
commit 1adeb98a32
14 changed files with 183 additions and 71 deletions

View File

@ -1,3 +1,56 @@
2001-01-26 Fernando Nasser <fnasser@redhat.com>
Fix double parsing of filenames passed as command line arguments
to GDB (causes weird handling of escape characters).
Also, remove dependencies on the CLI from libgdb.
* call-cmds.h: Remove declaration of exec_file_command().
* gdbcore.h: Remove declaration of exec_file_command().
Add declarations for exec_open() and exec_file_clear().
* symfile.h: Add declarations for symbol_file_add_main() and
symbol_file_clear().
* exec.c (exec_open): New function. Implements to_open for exec
targets.
(exec_file_clear): New function. Makes GDB forget about a previously
specified executable file.
(exec_file_attach): Move parsing of arguments from here ...
(exec_file_command): ... to here.
(init_exec_ops): Use exec_open(), not exec_file_command() to
implement to_open for exec targets.
* symfile.c (symbol_file_add_main): New function. Call symbol_file_add()
with default values. Used when the file name has already been parsed.
(symbol_file_clear): New function. Makes GDB forget about previously
read symbols.
(symbol_file_command): Call the above function instead of inline code.
* main.c: Include "symfile.h" and "gdbcore.h" instead of the deprecated
"call-cmds.h".
(captured_main): Call exec_file_attach() and symbol_file_add_main()
instead of exec_file_command() and symbol_file_command().
(captured_main): Add comment.
* corefile.c: Include "symfile.h".
(core_file_command): Call symbol_file_add_main() instead of
symbol_file_command().
(reopen_exec_file): Call exec_open() instead of exec_file_command().
* infcmd.c: Include "symfile.h".
(attach_command): Call symbol_file_add_main() instead of
symbol_file_command().
* infrun.c: Remove comment about the inclusion of "symfile.h",
not any longer appropriate.
(follow_exec): Call symbol_file_add_main() instead of
symbol_file_command().
* remote-es.c: Include "symfile.h".
(es1800_load): Call symbol_file_add_main() instead of
symbol_file_command().
* remote-vx.c: Remove comment about the inclusion of "symfile.h",
not any longer appropriate.
(vx-wait): Call symbol_file_add_main() instead of
symbol_file_command().
* solib-svr4.c (open_symbol_file_object): Call symbol_file_add_main()
instead of symbol_file_command().
* v850ice.c (ice_file): Call exec_open(), exec_file_attach() and
symbol_file_add_main() instead of exec_file_command() and
symbol_file_command().
* Makefile.in: Update dependencies.
2001-01-26 Jeff Holcomb <jeffh@redhat.com> 2001-01-26 Jeff Holcomb <jeffh@redhat.com>
* remote-udi.c (udi_open): Change strdup to xstrdup. * remote-udi.c (udi_open): Change strdup to xstrdup.

View File

@ -25,8 +25,6 @@
extern void initialize_all_files (void); extern void initialize_all_files (void);
extern void exec_file_command (char *, int);
extern void core_file_command (char *, int); extern void core_file_command (char *, int);
extern void break_command (char *, int); extern void break_command (char *, int);

View File

@ -29,6 +29,7 @@
#include "symtab.h" #include "symtab.h"
#include "command.h" #include "command.h"
#include "gdbcmd.h" #include "gdbcmd.h"
#include "symfile.h"
#include "bfd.h" #include "bfd.h"
#include "target.h" #include "target.h"
#include "gdbcore.h" #include "gdbcore.h"
@ -92,7 +93,7 @@ core_file_command (char *filename, int from_tty)
char *symfile_copy = xstrdup (symfile); char *symfile_copy = xstrdup (symfile);
make_cleanup (xfree, symfile_copy); make_cleanup (xfree, symfile_copy);
symbol_file_command (symfile_copy, from_tty); symbol_file_add_main (symfile_copy, from_tty);
} }
else else
warning ("Unknown symbols for '%s'; use the 'symbol-file' command.", filename); warning ("Unknown symbols for '%s'; use the 'symbol-file' command.", filename);
@ -188,7 +189,9 @@ reopen_exec_file (void)
res = stat (filename, &st); res = stat (filename, &st);
if (mtime && mtime != st.st_mtime) if (mtime && mtime != st.st_mtime)
exec_file_command (filename, 0); {
exec_open (filename, 0);
}
#endif #endif
} }

View File

@ -94,6 +94,13 @@ CORE_ADDR text_end = 0;
struct vmap *vmap; struct vmap *vmap;
void
exec_open (char *args, int from_tty)
{
target_preopen (from_tty);
exec_file_attach (args, from_tty);
}
/* ARGSUSED */ /* ARGSUSED */
static void static void
exec_close (int quitting) exec_close (int quitting)
@ -150,6 +157,16 @@ exec_close (int quitting)
} }
} }
void
exec_file_clear (int from_tty)
{
/* Remove exec file. */
unpush_target (&exec_ops);
if (from_tty)
printf_unfiltered ("No executable file now.\n");
}
/* Process the first arg in ARGS as the new exec file. /* Process the first arg in ARGS as the new exec file.
This function is intended to be behave essentially the same This function is intended to be behave essentially the same
@ -165,42 +182,28 @@ exec_close (int quitting)
given a pid but not a exec pathname, and the attach command could given a pid but not a exec pathname, and the attach command could
figure out the pathname from the pid. (In this case, we shouldn't figure out the pathname from the pid. (In this case, we shouldn't
ask the user whether the current target should be shut down -- ask the user whether the current target should be shut down --
we're supplying the exec pathname late for good reason.) */ we're supplying the exec pathname late for good reason.)
ARGS is assumed to be the filename. */
void void
exec_file_attach (char *args, int from_tty) exec_file_attach (char *filename, int from_tty)
{ {
char **argv;
char *filename;
/* Remove any previous exec file. */ /* Remove any previous exec file. */
unpush_target (&exec_ops); unpush_target (&exec_ops);
/* Now open and digest the file the user requested, if any. */ /* Now open and digest the file the user requested, if any. */
if (args) if (!filename)
{
if (from_tty)
printf_unfiltered ("No executable file now.\n");
}
else
{ {
char *scratch_pathname; char *scratch_pathname;
int scratch_chan; int scratch_chan;
/* Scan through the args and pick up the first non option arg
as the filename. */
argv = buildargv (args);
if (argv == NULL)
nomem (0);
make_cleanup_freeargv (argv);
for (; (*argv != NULL) && (**argv == '-'); argv++)
{;
}
if (*argv == NULL)
error ("No executable file name was specified");
filename = tilde_expand (*argv);
make_cleanup (xfree, filename);
scratch_chan = openp (getenv ("PATH"), 1, filename, scratch_chan = openp (getenv ("PATH"), 1, filename,
write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0, write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0,
&scratch_pathname); &scratch_pathname);
@ -298,21 +301,47 @@ exec_file_attach (char *args, int from_tty)
if (exec_file_display_hook) if (exec_file_display_hook)
(*exec_file_display_hook) (filename); (*exec_file_display_hook) (filename);
} }
else if (from_tty)
printf_unfiltered ("No executable file now.\n");
} }
/* Process the first arg in ARGS as the new exec file. /* Process the first arg in ARGS as the new exec file.
Note that we have to explicitly ignore additional args, since we can Note that we have to explicitly ignore additional args, since we can
be called from file_command(), which also calls symbol_file_command() be called from file_command(), which also calls symbol_file_command()
which can take multiple args. */ which can take multiple args.
void If ARGS is NULL, we just want to close the exec file. */
static void
exec_file_command (char *args, int from_tty) exec_file_command (char *args, int from_tty)
{ {
char **argv;
char *filename;
target_preopen (from_tty); target_preopen (from_tty);
exec_file_attach (args, from_tty);
if (args)
{
/* Scan through the args and pick up the first non option arg
as the filename. */
argv = buildargv (args);
if (argv == NULL)
nomem (0);
make_cleanup_freeargv (argv);
for (; (*argv != NULL) && (**argv == '-'); argv++)
{;
}
if (*argv == NULL)
error ("No executable file name was specified");
filename = tilde_expand (*argv);
make_cleanup (xfree, filename);
exec_file_attach (filename, from_tty);
}
else
exec_file_attach (NULL, from_tty);
} }
/* Set both the exec file and the symbol file, in one command. /* Set both the exec file and the symbol file, in one command.
@ -666,7 +695,7 @@ init_exec_ops (void)
exec_ops.to_longname = "Local exec file"; exec_ops.to_longname = "Local exec file";
exec_ops.to_doc = "Use an executable file as a target.\n\ exec_ops.to_doc = "Use an executable file as a target.\n\
Specify the filename of the executable file."; Specify the filename of the executable file.";
exec_ops.to_open = exec_file_command; exec_ops.to_open = exec_open;
exec_ops.to_close = exec_close; exec_ops.to_close = exec_close;
exec_ops.to_attach = find_default_attach; exec_ops.to_attach = find_default_attach;
exec_ops.to_require_attach = find_default_require_attach; exec_ops.to_require_attach = find_default_require_attach;

View File

@ -98,9 +98,11 @@ extern int write_files;
extern void core_file_command (char *filename, int from_tty); extern void core_file_command (char *filename, int from_tty);
extern void exec_open (char *filename, int from_tty);
extern void exec_file_attach (char *filename, int from_tty); extern void exec_file_attach (char *filename, int from_tty);
extern void exec_file_command (char *filename, int from_tty); extern void exec_file_clear (int from_tty);
extern void validate_files (void); extern void validate_files (void);

View File

@ -29,6 +29,7 @@
#include "environ.h" #include "environ.h"
#include "value.h" #include "value.h"
#include "gdbcmd.h" #include "gdbcmd.h"
#include "symfile.h"
#include "gdbcore.h" #include "gdbcore.h"
#include "target.h" #include "target.h"
#include "language.h" #include "language.h"
@ -1701,7 +1702,7 @@ attach_command (char *args, int from_tty)
full_exec_path = savestring (exec_file, strlen (exec_file)); full_exec_path = savestring (exec_file, strlen (exec_file));
exec_file_attach (full_exec_path, from_tty); exec_file_attach (full_exec_path, from_tty);
symbol_file_command (full_exec_path, from_tty); symbol_file_add_main (full_exec_path, from_tty);
} }
} }

View File

@ -31,7 +31,7 @@
#include "target.h" #include "target.h"
#include "gdbthread.h" #include "gdbthread.h"
#include "annotate.h" #include "annotate.h"
#include "symfile.h" /* for overlay functions */ #include "symfile.h"
#include "top.h" #include "top.h"
#include <signal.h> #include <signal.h>
#include "inf-loop.h" #include "inf-loop.h"
@ -650,6 +650,8 @@ follow_vfork (int parent_pid, int child_pid)
} }
} }
/* EXECD_PATHNAME is assumed to be non-NULL. */
static void static void
follow_exec (int pid, char *execd_pathname) follow_exec (int pid, char *execd_pathname)
{ {
@ -727,7 +729,7 @@ follow_exec (int pid, char *execd_pathname)
exec_file_attach (execd_pathname, 0); exec_file_attach (execd_pathname, 0);
/* And also is where symbols can be found. */ /* And also is where symbols can be found. */
symbol_file_command (execd_pathname, 0); symbol_file_add_main (execd_pathname, 0);
/* Reset the shared library package. This ensures that we get /* Reset the shared library package. This ensures that we get
a shlib event when the child reaches "_start", at which point a shlib event when the child reaches "_start", at which point

View File

@ -22,7 +22,8 @@
#include "top.h" #include "top.h"
#include "target.h" #include "target.h"
#include "inferior.h" #include "inferior.h"
#include "call-cmds.h" #include "symfile.h"
#include "gdbcore.h"
#include "getopt.h" #include "getopt.h"
@ -474,6 +475,7 @@ extern int gdbtk_test (char *);
execarg = argv[optind]; execarg = argv[optind];
break; break;
case 2: case 2:
/* FIXME: The documentation says this can be a "ProcID". as well. */
corearg = argv[optind]; corearg = argv[optind];
break; break;
case 3: case 3:
@ -592,15 +594,15 @@ extern int gdbtk_test (char *);
/* The exec file and the symbol-file are the same. If we can't /* The exec file and the symbol-file are the same. If we can't
open it, better only print one error message. open it, better only print one error message.
catch_command_errors returns non-zero on success! */ catch_command_errors returns non-zero on success! */
if (catch_command_errors (exec_file_command, execarg, !batch, RETURN_MASK_ALL)) if (catch_command_errors (exec_file_attach, execarg, !batch, RETURN_MASK_ALL))
catch_command_errors (symbol_file_command, symarg, 0, RETURN_MASK_ALL); catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
} }
else else
{ {
if (execarg != NULL) if (execarg != NULL)
catch_command_errors (exec_file_command, execarg, !batch, RETURN_MASK_ALL); catch_command_errors (exec_file_attach, execarg, !batch, RETURN_MASK_ALL);
if (symarg != NULL) if (symarg != NULL)
catch_command_errors (symbol_file_command, symarg, 0, RETURN_MASK_ALL); catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
} }
/* After the symbol file has been read, print a newline to get us /* After the symbol file has been read, print a newline to get us

View File

@ -106,6 +106,7 @@
#include "target.h" #include "target.h"
#include "gdb_wait.h" #include "gdb_wait.h"
#include "command.h" #include "command.h"
#include "symfile.h"
#include "remote-utils.h" #include "remote-utils.h"
#include "gdbcore.h" #include "gdbcore.h"
#include "serial.h" #include "serial.h"
@ -1318,7 +1319,7 @@ es1800_load (char *filename, int from_tty)
system (buf); system (buf);
} }
symbol_file_command (filename, from_tty); /* reading symbol table */ symbol_file_add_main (filename, from_tty); /* reading symbol table */
immediate_quit--; immediate_quit--;
} }

View File

@ -30,7 +30,7 @@
#include "complaints.h" #include "complaints.h"
#include "gdbcmd.h" #include "gdbcmd.h"
#include "bfd.h" /* Required by objfiles.h. */ #include "bfd.h" /* Required by objfiles.h. */
#include "symfile.h" /* Required by objfiles.h. */ #include "symfile.h"
#include "objfiles.h" #include "objfiles.h"
#include "gdb-stabs.h" #include "gdb-stabs.h"
@ -1039,7 +1039,7 @@ vx_wait (int pid_to_wait_for, struct target_waitstatus *status)
static int static int
symbol_stub (char *arg) symbol_stub (char *arg)
{ {
symbol_file_command (arg, 0); symbol_file_add_main (arg, 0);
return 1; return 1;
} }

View File

@ -940,7 +940,7 @@ open_symbol_file_object (void *from_ttyp)
make_cleanup (xfree, filename); make_cleanup (xfree, filename);
/* Have a pathname: read the symbol file. */ /* Have a pathname: read the symbol file. */
symbol_file_command (filename, from_tty); symbol_file_add_main (filename, from_tty);
return 1; return 1;
} }

View File

@ -897,6 +897,41 @@ symbol_file_add (char *name, int from_tty, struct section_addr_info *addrs,
return (objfile); return (objfile);
} }
/* Just call the above with default values.
Used when the file is supplied in the gdb command line. */
void
symbol_file_add_main (char *args, int from_tty)
{
symbol_file_add (args, from_tty, NULL, 1, 0);
}
void
symbol_file_clear (int from_tty)
{
if ((have_full_symbols () || have_partial_symbols ())
&& from_tty
&& !query ("Discard symbol table from `%s'? ",
symfile_objfile->name))
error ("Not confirmed.");
free_all_objfiles ();
/* solib descriptors may have handles to objfiles. Since their
storage has just been released, we'd better wipe the solib
descriptors as well.
*/
#if defined(SOLIB_RESTART)
SOLIB_RESTART ();
#endif
symfile_objfile = NULL;
if (from_tty)
printf_unfiltered ("No symbol file now.\n");
#ifdef HPUXHPPA
RESET_HP_UX_GLOBALS ();
#endif
}
/* This is the symbol-file command. Read the file, analyze its /* This is the symbol-file command. Read the file, analyze its
symbols, and add a struct symtab to a symtab list. The syntax of symbols, and add a struct symtab to a symtab list. The syntax of
the command is rather bizarre--(1) buildargv implements various the command is rather bizarre--(1) buildargv implements various
@ -923,27 +958,7 @@ symbol_file_command (char *args, int from_tty)
if (args == NULL) if (args == NULL)
{ {
if ((have_full_symbols () || have_partial_symbols ()) symbol_file_clear (from_tty);
&& from_tty
&& !query ("Discard symbol table from `%s'? ",
symfile_objfile->name))
error ("Not confirmed.");
free_all_objfiles ();
/* solib descriptors may have handles to objfiles. Since their
storage has just been released, we'd better wipe the solib
descriptors as well.
*/
#if defined(SOLIB_RESTART)
SOLIB_RESTART ();
#endif
symfile_objfile = NULL;
if (from_tty)
printf_unfiltered ("No symbol file now.\n");
#ifdef HPUXHPPA
RESET_HP_UX_GLOBALS ();
#endif
} }
else else
{ {

View File

@ -273,6 +273,12 @@ extern CORE_ADDR overlay_unmapped_address (CORE_ADDR, asection *);
/* convert an address in an overlay section (force into VMA range) */ /* convert an address in an overlay section (force into VMA range) */
extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, asection *); extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, asection *);
/* Load symbols from a file. */
extern void symbol_file_add_main (char *args, int from_tty);
/* Clear GDB symbol tables. */
extern void symbol_file_clear (int from_tty);
/* From dwarfread.c */ /* From dwarfread.c */
extern void extern void

View File

@ -794,11 +794,11 @@ ice_file (char *arg)
/* Must supress from_tty, otherwise we could start asking if the /* Must supress from_tty, otherwise we could start asking if the
user really wants to load a new symbol table, etc... */ user really wants to load a new symbol table, etc... */
printf_unfiltered ("Reading symbols from %s...", arg); printf_unfiltered ("Reading symbols from %s...", arg);
exec_file_command (arg, 0); exec_open (arg, 0);
symbol_file_command (arg, 0); symbol_file_add_main (arg, 0);
printf_unfiltered ("done\n"); printf_unfiltered ("done\n");
/* exec_file_command will kill our target, so reinstall the ICE as /* exec_open will kill our target, so reinstall the ICE as
the target. */ the target. */
v850ice_open (NULL, 0); v850ice_open (NULL, 0);