This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
PATCH: Improve gdbserver access to remote symbol lookup
- From: Daniel Jacobowitz <drow at mvista dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Tue, 9 Apr 2002 19:52:45 -0400
- Subject: PATCH: Improve gdbserver access to remote symbol lookup
This gives gdbserver's brand new target stack a hook to query GDB for
symbols via 'qSymbol' - which works great, by the way. Committed after
testing.
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer
2002-04-09 Daniel Jacobowitz <drow@mvista.com>
* linux-low.c (linux_look_up_symbols): New hook.
(linux_target_ops): Add linux_look_up_symbols.
* remote-utils.c (decode_address): New function.
(look_up_one_symbol): New function.
* server.c (handle_query): Call target look_up_symbols hook.
* server.h (look_up_one_symbol): Add prototype.
* target.h (struct target_ops): Add look_up_symbols hook.
Index: linux-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-low.c,v
retrieving revision 1.12
diff -u -p -r1.12 linux-low.c
--- linux-low.c 9 Apr 2002 22:44:43 -0000 1.12
+++ linux-low.c 9 Apr 2002 23:44:52 -0000
@@ -481,6 +481,13 @@ linux_write_memory (CORE_ADDR memaddr, c
return 0;
}
+
+static void
+linux_look_up_symbols (void)
+{
+ /* Don't need to look up any symbols yet. */
+}
+
static struct target_ops linux_target_ops = {
linux_create_inferior,
@@ -493,6 +500,7 @@ static struct target_ops linux_target_op
linux_store_registers,
linux_read_memory,
linux_write_memory,
+ linux_look_up_symbols,
};
void
Index: remote-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/remote-utils.c,v
retrieving revision 1.13
diff -u -p -r1.13 remote-utils.c
--- remote-utils.c 9 Apr 2002 21:16:16 -0000 1.13
+++ remote-utils.c 9 Apr 2002 23:44:52 -0000
@@ -205,6 +205,23 @@ unhexify (char *bin, const char *hex, in
return i;
}
+static void
+decode_address (CORE_ADDR *addrp, const char *start, int len)
+{
+ CORE_ADDR addr;
+ char ch;
+ int i;
+
+ addr = 0;
+ for (i = 0; i < len; i++)
+ {
+ ch = start[i];
+ addr = addr << 4;
+ addr = addr | (fromhex (ch) & 0x0f);
+ }
+ *addrp = addr;
+}
+
/* Convert number NIB to a hex digit. */
static int
@@ -581,3 +598,42 @@ decode_M_packet (char *from, CORE_ADDR *
convert_ascii_to_int (&from[i++], to, *len_ptr);
}
+
+int
+look_up_one_symbol (const char *name, CORE_ADDR *addrp)
+{
+ char own_buf[266], *p, *q;
+ int len;
+
+ /* Send the request. */
+ strcpy (own_buf, "qSymbol:");
+ hexify (own_buf + strlen ("qSymbol:"), name, strlen (name));
+ if (putpkt (own_buf) < 0)
+ return -1;
+
+ /* FIXME: Eventually add buffer overflow checking (to getpkt?) */
+ len = getpkt (own_buf);
+ if (len < 0)
+ return -1;
+
+ if (strncmp (own_buf, "qSymbol:", strlen ("qSymbol:")) != 0)
+ {
+ /* Malformed response. */
+ if (remote_debug)
+ fprintf (stderr, "Malformed response to qSymbol, ignoring.\n");
+ return -1;
+ }
+
+ p = own_buf + strlen ("qSymbol:");
+ q = p;
+ while (*q && *q != ':')
+ q++;
+
+ /* Make sure we found a value for the symbol. */
+ if (p == q || *q == '\0')
+ return 0;
+
+ decode_address (addrp, p, q - p);
+ return 1;
+}
+
Index: server.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/server.c,v
retrieving revision 1.9
diff -u -p -r1.9 server.c
--- server.c 9 Apr 2002 21:16:16 -0000 1.9
+++ server.c 9 Apr 2002 23:44:53 -0000
@@ -63,13 +63,9 @@ handle_query (char *own_buf)
{
if (strcmp ("qSymbol::", own_buf) == 0)
{
-#if 0
- strcpy (own_buf, "qSymbol:");
- hexify (own_buf + strlen ("qSymbol:"), "main", 4);
- putpkt (own_buf);
- getpkt (own_buf);
- fprintf (stderr, "Got %s", own_buf);
-#endif
+ if (the_target->look_up_symbols != NULL)
+ (*the_target->look_up_symbols) ();
+
strcpy (own_buf, "OK");
return;
}
Index: server.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/server.h,v
retrieving revision 1.8
diff -u -p -r1.8 server.h
--- server.h 9 Apr 2002 22:58:00 -0000 1.8
+++ server.h 9 Apr 2002 23:44:53 -0000
@@ -106,6 +106,7 @@ void decode_M_packet (char *from, CORE_A
int unhexify (char *bin, const char *hex, int count);
int hexify (char *hex, const char *bin, int count);
+int look_up_one_symbol (const char *name, CORE_ADDR *addrp);
/* Functions from ``signals.c''. */
enum target_signal target_signal_from_host (int hostsig);
Index: target.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/target.h,v
retrieving revision 1.1
diff -u -p -r1.1 target.h
--- target.h 9 Apr 2002 21:17:45 -0000 1.1
+++ target.h 9 Apr 2002 23:44:53 -0000
@@ -94,6 +94,13 @@ struct target_ops
Returns 0 on success and errno on failure. */
int (*write_memory) (CORE_ADDR memaddr, char *myaddr, int len);
+
+ /* Query GDB for the values of any symbols we're interested in.
+ This function is called whenever we receive a "qSymbols::"
+ query, which corresponds to every time more symbols (might)
+ become available. */
+
+ void (*look_up_symbols) (void);
};
extern struct target_ops *the_target;