target.c: Add target_preopen and target_command.
Remove target_info.
(add_target): Call add_cmd and mess with targetlist->doc.
core.c, exec.c, remote-eb.c, remote-nindy.c, remote-vx.c,
remote-vx.68.c, inftarg.c, remote.c: Add doc field to target struct.
Call target_preopen from open routine.
bfd *temp_bfd;
int ontop;
+ target_preopen (from_tty);
if (!filename)
{
error (core_bfd?
\f
struct target_ops core_ops = {
"core", "Local core dump file",
+ "Use a core file as a target. Specify the filename of the core file.",
core_open, core_close,
child_attach, core_detach, 0, 0, /* resume, wait */
get_core_registers,
char *filename;
int from_tty;
{
+ target_preopen (from_tty);
/* Remove any previous exec file. */
unpush_target (&exec_ops);
bfd_section_name (exec_bfd, p->sec_ptr));
}
+static void
+set_section_command (args, from_tty)
+ char *args;
+ int from_tty;
+{
+ struct section_table *p;
+ char *secname;
+ unsigned seclen;
+ unsigned long secaddr;
+ char secprint[100];
+ long offset;
+
+ if (args == 0)
+ error ("Must specify section name and its virtual address");
+
+ /* Parse out section name */
+ for (secname = args; !isspace(*args); args++) ;
+ seclen = args - secname;
+
+ /* Parse out new virtual address */
+ secaddr = parse_and_eval_address (args);
+
+ for (p = exec_sections; p < exec_sections_end; p++) {
+ if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen)
+ && bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') {
+ offset = secaddr - p->addr;
+ p->addr += offset;
+ p->endaddr += offset;
+ exec_files_info();
+ return;
+ }
+ }
+ if (seclen >= sizeof (secprint))
+ seclen = sizeof (secprint) - 1;
+ strncpy (secprint, secname, seclen);
+ secprint[seclen] = '\0';
+ error ("Section %s not found", secprint);
+}
+
struct target_ops exec_ops = {
"exec", "Local exec file",
+ "Use an executable file as a target.\n\
+Specify the filename of the executable file.",
exec_file_command, exec_close, /* open, close */
child_attach, 0, 0, 0, /* attach, detach, resume, wait, */
0, 0, /* fetch_registers, store_registers, */
is searched for a command of that name.\n\
No arg means have no executable file.");
+ add_com ("section", class_files, set_section_command,
+ "Change the base address of section SECTION of the exec file to ADDR.\n\
+This can be used if the exec file does not contain section addresses,\n\
+(such as in the a.out format), or when the addresses specified in the\n\
+file itself are wrong. Each section must be changed separately. The\n\
+``info files'' command lists all the sections and their addresses.");
+
add_target (&exec_ops);
}
char *p;
+ target_preopen (from_tty);
+
/* Find the first whitespace character, it separates dev_name from
prog_name. */
if (name == 0)
struct target_ops eb_ops = {
"amd-eb", "Remote serial AMD EBMON target",
+ "Use a remote computer running EBMON connected by a serial line.\n\
+Arguments are the name of the device for the serial line,\n\
+the speed to connect at in bits per second, and the filename of the\n\
+executable as it exists on the remote computer. For example,\n\
+ target amd-eb /dev/ttya 9600 demo",
eb_open, eb_close,
0, eb_detach, eb_resume, eb_wait,
eb_fetch_register, eb_store_register,
if (!name)
error_no_arg ("serial port device name");
+ target_preopen (from_tty);
+
nindy_close (0);
have_regs = regs_changed = 0;
struct target_ops nindy_ops = {
"nindy", "Remote serial target in i960 NINDY-specific protocol",
+ "Use a remote i960 system running NINDY connected by a serial line.\n\
+Specify the name of the device the serial line is connected to.\n\
+The speed (baud rate), whether to use the old NINDY protocol,\n\
+and whether to send a break on startup, are controlled by options\n\
+specified when you started GDB.",
nindy_open, nindy_close,
0, nindy_detach, nindy_resume, nindy_wait,
nindy_fetch_registers, nindy_store_registers,
"To open a remote debug connection, you need to specify what serial\n\
device is attached to the remote system (e.g. /dev/ttya).");
+ target_preopen (from_tty);
+
remote_close (0);
#if 0
struct target_ops remote_ops = {
"remote", "Remote serial target in gdb-specific protocol",
+ "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
+Specify the serial device it is connected to (e.g. /dev/ttya).",
remote_open, remote_close,
0, remote_detach, remote_resume, remote_wait, /* attach */
remote_fetch_registers, remote_store_registers,
/* The initial current target, so that there is always a semi-valid
current target. */
-struct target_ops dummy_target = {"None", "None",
+struct target_ops dummy_target = {"None", "None", "",
0, 0, 0, 0, /* open, close, attach, detach */
0, 0, /* resume, wait */
0, 0, 0, 0, 0, /* registers */
struct target_ops **current_target_stack;
+/* Command list for target. */
+
+static struct cmd_list_element *targetlist = NULL;
+
+/* Docstring for target (as in "help target"). */
+
+static char *target_doc = NULL;
+
+/* The user just typed 'target' without the name of a target. */
+
+static void
+target_command (arg, from_tty)
+ char *arg;
+ int from_tty;
+{
+ fputs_filtered ("Argument required (target name).", stdout);
+}
/* Add a possible target architecture to the list. */
}
target_structs[target_struct_size++] = t;
cleanup_target (t);
+
+ if (targetlist == NULL)
+ add_prefix_cmd ("target", class_run, target_command,
+ "Connect to a target machine or process.\n\
+The first argument is the type or protocol of the target machine.\n\
+Remaining arguments are interpreted by the target protocol. For more\n\
+information on the arguments for a particular protocol, type\n\
+`help target ' followed by the protocol name.",
+ &targetlist, "target ", 0, &cmdlist);
+ add_cmd (t->to_shortname, no_class, t->to_open, t->to_doc, &targetlist);
}
/* Stub functions */
push_target (&dummy_target);
}
-/* Print things about the whole set of targets and about the
- current target stack. */
-static void
-targets_info ()
-{
- int i;
-
- printf("Possible targets:\n\n");
- for (i = 0; i < target_struct_size; i++)
- printf ("%-15s %s\n",
- target_structs[i]->to_shortname,
- target_structs[i]->to_longname);
-}
-
/* Move memory to or from the targets. Iterate until all of it has
been moved, if necessary. The top target gets priority; anything
it doesn't want, is offered to the next one down, etc. Note the
}
}
-/* The target command selects a target and calls its open routine.
- The open routine takes the rest of the parameters from the command,
- and (if successful) pushes a new target onto the stack. */
+/* This is to be called by the open routine before it does
+ anything. */
-static void
-target_command (args, from_tty)
- char *args;
+void
+target_preopen (from_tty)
int from_tty;
{
- int i, possible;
- char *rest;
- char *argend;
-
dont_repeat();
- if (!args)
- error (
- "Argument required (target name). `info targets' lists possible targets");
-
if (target_has_execution)
{
if (query ("A program is being debugged already. Kill it? "))
else
error ("Program not killed.");
}
-
- /* Skip to first space, or end of args */
- for (rest = args; *rest && !isspace(*rest); rest++) ;
- argend = rest;
- if (*rest == '\0')
- rest = 0; /* Only one word in args */
- else
- {
- for (rest++; isspace (*rest); rest++) ;
- if (*rest == '\0') /* Only one word w/trailing blanks */
- rest = 0;
- }
-
- /* Search target list for a match */
-
- possible = -1;
- for (i = 0; i < target_struct_size; i++)
- {
- if (!strncmp (args, target_structs[i]->to_shortname, argend - args)) {
- /* If we have an exact match, it's time to quit. */
- if (target_structs[i]->to_shortname[args-argend] == '\0') {
- possible = i;
- break;
- }
- if (possible > 0)
- error ("Ambiguous target. `info targets' will list all targets");
- possible = i;
- }
- }
- if (possible < 0)
- error ("No such target. `info targets' will list all targets");
-
- (*target_structs[possible]->to_open) (rest, from_tty);
}
static char targ_desc[] =
current_target = &dummy_target;
cleanup_target (current_target);
- add_info ("targets", targets_info,
- "Names of all possible targets.\n\
-A target is typically a protocol for talking to debugging facilities;\n\
-for example, `child' for Unix child processes, or `vxworks' for a\n\
-TCP/IP link to a VxWorks system.");
-
add_info ("target", target_info, targ_desc);
add_info ("files", target_info, targ_desc);
-
- add_com ("target", class_run, target_command,
-"Connect to a target machine or process.\n\
-The first argument is the type or protocol of the target machine. Remaining\n\
-arguments are interpreted by the target protocol, but typically include\n\
-things like device names or host names to connect with, process numbers,\n\
-baud rates, etc. You can list all possible targets with the `info targets'\n\
-command.");
}