aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/gdbserver/linux-low.c8
-rw-r--r--gdb/gdbserver/remote-utils.c56
-rw-r--r--gdb/gdbserver/server.c10
-rw-r--r--gdb/gdbserver/server.h1
-rw-r--r--gdb/gdbserver/target.h7
6 files changed, 85 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 330793f..5b1be44 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
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.
+
+2002-04-09 Daniel Jacobowitz <drow@mvista.com>
+
* gdbserver/server.h: Include <string.h> if HAVE_STRING_H.
* ChangeLog: Correct paths in last ChangeLog entry.
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 307fab2..8c729df 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -481,6 +481,13 @@ linux_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
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_ops = {
linux_store_registers,
linux_read_memory,
linux_write_memory,
+ linux_look_up_symbols,
};
void
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index c61f1e0..14734f1 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -205,6 +205,23 @@ unhexify (char *bin, const char *hex, int count)
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 *mem_addr_ptr, unsigned int *len_ptr,
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;
+}
+
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 94c27d3..3afab2b 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -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;
}
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 0d9ec4e..3f0a543 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -106,6 +106,7 @@ void decode_M_packet (char *from, CORE_ADDR * mem_addr_ptr,
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);
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
index 094f4ce..685a801 100644
--- a/gdb/gdbserver/target.h
+++ b/gdb/gdbserver/target.h
@@ -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;