* 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>
+
+ * 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.
return 0;
}
+
+static void
+linux_look_up_symbols (void)
+{
+ /* Don't need to look up any symbols yet. */
+}
+
\f
static struct target_ops linux_target_ops = {
linux_create_inferior,
linux_store_registers,
linux_read_memory,
linux_write_memory,
+ linux_look_up_symbols,
};
void
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
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;
+}
+
{
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;
}
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);
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;