diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 8 | ||||
-rw-r--r-- | gdb/gdbserver/remote-utils.c | 56 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 10 | ||||
-rw-r--r-- | gdb/gdbserver/server.h | 1 | ||||
-rw-r--r-- | gdb/gdbserver/target.h | 7 |
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; |