/* Top level stuff for GDB, the GNU debugger.
- Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+ Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
Free Software Foundation, Inc.
This file is part of GDB.
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
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "top.h"
struct captured_main_args *context = data;
int argc = context->argc;
char **argv = context->argv;
- int count;
static int quiet = 0;
static int batch = 0;
static int set_args = 0;
/* Pointers to various arguments from command line. */
char *symarg = NULL;
char *execarg = NULL;
+ char *pidarg = NULL;
char *corearg = NULL;
+ char *pid_or_core_arg = NULL;
char *cdarg = NULL;
char *ttyarg = NULL;
lim_at_start = (char *) sbrk (0);
#endif
-#if defined (ALIGN_STACK_ON_STARTUP)
- i = (int) &count & 0x3;
- if (i != 0)
- alloca (4 - i);
-#endif
-
cmdsize = 1;
cmdarg = (struct cmdarg *) xmalloc (cmdsize * sizeof (*cmdarg));
ncmd = 0;
if (res == 0)
{
xfree (gdb_sysroot);
- gdb_sysroot = TARGET_SYSTEM_ROOT;
+ gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
}
}
else
- gdb_sysroot = TARGET_SYSTEM_ROOT;
+ gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
#else
-#if defined (TARGET_SYSTEM_ROOT)
- gdb_sysroot = TARGET_SYSTEM_ROOT;
-#else
- gdb_sysroot = "";
+ gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
#endif
+
+ /* Canonicalize the sysroot path. */
+ if (*gdb_sysroot)
+ {
+ char *canon_sysroot = lrealpath (gdb_sysroot);
+ if (canon_sysroot)
+ {
+ xfree (gdb_sysroot);
+ gdb_sysroot = canon_sysroot;
+ }
+ }
+
+#ifdef DEBUGDIR_RELOCATABLE
+ debug_file_directory = make_relative_prefix (argv[0], BINDIR, DEBUGDIR);
+ if (debug_file_directory)
+ {
+ struct stat s;
+ int res = 0;
+
+ if (stat (debug_file_directory, &s) == 0)
+ if (S_ISDIR (s.st_mode))
+ res = 1;
+
+ if (res == 0)
+ {
+ xfree (debug_file_directory);
+ debug_file_directory = xstrdup (DEBUGDIR);
+ }
+ }
+ else
+ debug_file_directory = xstrdup (DEBUGDIR);
+#else
+ debug_file_directory = xstrdup (DEBUGDIR);
#endif
+ /* Canonicalize the debugfile path. */
+ if (*debug_file_directory)
+ {
+ char *canon_debug = lrealpath (debug_file_directory);
+ if (canon_debug)
+ {
+ xfree (debug_file_directory);
+ debug_file_directory = canon_debug;
+ }
+ }
+
/* There will always be an interpreter. Either the one passed into
this captured main, or one specified by the user at start up, or
the console. Initialize the interpreter to the one requested by
};
static struct option long_options[] =
{
-#if defined(TUI)
{"tui", no_argument, 0, OPT_TUI},
-#endif
{"xdb", no_argument, &xdb_commands, 1},
{"dbx", no_argument, &dbx_commands, 1},
{"readnow", no_argument, &readnow_symbol_files, 1},
break;
case OPT_TUI:
/* --tui is equivalent to -i=tui. */
+#ifdef TUI
xfree (interpreter_p);
interpreter_p = xstrdup (INTERP_TUI);
+#else
+ fprintf_unfiltered (gdb_stderr,
+ _("%s: TUI mode is not supported\n"),
+ argv[0]);
+ exit (1);
+#endif
break;
case OPT_WINDOWS:
/* FIXME: cagney/2003-03-01: Not sure if this option is
corearg = optarg;
break;
case 'p':
- /* "corearg" is shared by "--core" and "--pid" */
- corearg = optarg;
+ pidarg = optarg;
break;
case 'x':
cmdarg[ncmd].type = CMDARG_FILE;
}
else
{
- /* OK, that's all the options. The other arguments are filenames. */
- count = 0;
- for (; optind < argc; optind++)
- switch (++count)
- {
- case 1:
- symarg = argv[optind];
- execarg = argv[optind];
- break;
- case 2:
- /* The documentation says this can be a "ProcID" as well.
- We will try it as both a corefile and a pid. */
- corearg = argv[optind];
- break;
- case 3:
- fprintf_unfiltered (gdb_stderr,
- _("Excess command line arguments ignored. (%s%s)\n"),
- argv[optind], (optind == argc - 1) ? "" : " ...");
- break;
- }
+ /* OK, that's all the options. */
+
+ /* The first argument, if specified, is the name of the
+ executable. */
+ if (optind < argc)
+ {
+ symarg = argv[optind];
+ execarg = argv[optind];
+ optind++;
+ }
+
+ /* If the user hasn't already specified a PID or the name of a
+ core file, then a second optional argument is allowed. If
+ present, this argument should be interpreted as either a
+ PID or a core file, whichever works. */
+ if (pidarg == NULL && corearg == NULL && optind < argc)
+ {
+ pid_or_core_arg = argv[optind];
+ optind++;
+ }
+
+ /* Any argument left on the command line is unexpected and
+ will be ignored. Inform the user. */
+ if (optind < argc)
+ fprintf_unfiltered (gdb_stderr, _("\
+Excess command line arguments ignored. (%s%s)\n"),
+ argv[optind],
+ (optind == argc - 1) ? "" : " ...");
}
if (batch)
quiet = 1;
if (symarg)
printf_filtered ("..");
wrap_here ("");
+ printf_filtered ("\n");
gdb_flush (gdb_stdout); /* Force to screen during slow operations */
}
if (interp == NULL)
error (_("Interpreter `%s' unrecognized"), interpreter_p);
/* Install it. */
- if (!interp_set (interp))
+ if (!interp_set (interp, 1))
{
fprintf_unfiltered (gdb_stderr,
"Interpreter `%s' failed to initialize.\n",
if (symarg)
printf_filtered ("..");
wrap_here ("");
+ printf_filtered ("\n");
gdb_flush (gdb_stdout); /* Force to screen during slow operations */
}
- error_pre_print = "\n\n";
+ /* Set off error and warning messages with a blank line. */
+ error_pre_print = "\n";
quit_pre_print = error_pre_print;
-
- /* We may get more than one warning, don't double space all of them... */
warning_pre_print = _("\nwarning: ");
/* Read and execute $HOME/.gdbinit file, if it exists. This is done
if (!inhibit_gdbinit)
{
- catch_command_errors (source_command, homeinit, 0, RETURN_MASK_ALL);
+ catch_command_errors (source_script, homeinit, 0, RETURN_MASK_ALL);
}
/* Do stats; no need to do them elsewhere since we'll only
}
for (i = 0; i < ndir; i++)
- catch_command_errors (directory_command, dirarg[i], 0, RETURN_MASK_ALL);
+ catch_command_errors (directory_switch, dirarg[i], 0, RETURN_MASK_ALL);
xfree (dirarg);
if (execarg != NULL
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
- beyond the copyright line... But errors should still set off
- the error message with a (single) blank line. */
- if (!quiet)
- printf_filtered ("\n");
- error_pre_print = "\n";
- quit_pre_print = error_pre_print;
- warning_pre_print = _("\nwarning: ");
+ if (corearg && pidarg)
+ error (_("\
+Can't attach to process and specify a core file at the same time."));
if (corearg != NULL)
+ catch_command_errors (core_file_command, corearg,
+ !batch, RETURN_MASK_ALL);
+ else if (pidarg != NULL)
+ catch_command_errors (attach_command, pidarg,
+ !batch, RETURN_MASK_ALL);
+ else if (pid_or_core_arg)
{
- /* corearg may be either a corefile or a pid.
- If its first character is a digit, try attach first
- and then corefile. Otherwise try corefile first. */
+ /* The user specified 'gdb program pid' or gdb program core'.
+ If pid_or_core_arg's first character is a digit, try attach
+ first and then corefile. Otherwise try just corefile. */
- if (isdigit (corearg[0]))
+ if (isdigit (pid_or_core_arg[0]))
{
- if (catch_command_errors (attach_command, corearg,
+ if (catch_command_errors (attach_command, pid_or_core_arg,
!batch, RETURN_MASK_ALL) == 0)
- catch_command_errors (core_file_command, corearg,
+ catch_command_errors (core_file_command, pid_or_core_arg,
!batch, RETURN_MASK_ALL);
}
- else /* Can't be a pid, better be a corefile. */
- catch_command_errors (core_file_command, corearg,
+ else /* Can't be a pid, better be a corefile. */
+ catch_command_errors (core_file_command, pid_or_core_arg,
!batch, RETURN_MASK_ALL);
}
|| memcmp ((char *) &homebuf, (char *) &cwdbuf, sizeof (struct stat)))
if (!inhibit_gdbinit)
{
- catch_command_errors (source_command, gdbinit, 0, RETURN_MASK_ALL);
+ catch_command_errors (source_script, gdbinit, 0, RETURN_MASK_ALL);
}
for (i = 0; i < ncmd; i++)
read_command_file (stdin);
else
#endif
- source_command (cmdarg[i], !batch);
+ source_script (cmdarg[i], !batch);
do_cleanups (ALL_CLEANUPS);
}
#endif
if (cmdarg[i].type == CMDARG_FILE)
- catch_command_errors (source_command, cmdarg[i].string,
+ catch_command_errors (source_script, cmdarg[i].string,
!batch, RETURN_MASK_ALL);
else /* cmdarg[i].type == CMDARG_COMMAND */
catch_command_errors (execute_command, cmdarg[i].string,