diff options
author | Roland McGrath <roland@gnu.org> | 2004-02-25 20:41:29 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2004-02-25 20:41:29 +0000 |
commit | aa691b87c2317cc90bbe4964d79e5a29c29f348e (patch) | |
tree | 3148fc04a3808796f45d697c37aa827f71830170 /gdb/gdbserver/linux-low.c | |
parent | 802188a76ca9ff156990952648232e279aa157b9 (diff) | |
download | gdb-aa691b87c2317cc90bbe4964d79e5a29c29f348e.zip gdb-aa691b87c2317cc90bbe4964d79e5a29c29f348e.tar.gz gdb-aa691b87c2317cc90bbe4964d79e5a29c29f348e.tar.bz2 |
2004-02-25 Roland McGrath <roland@redhat.com>
* target.h (struct target_ops): New member `read_auxv'.
* server.c (handle_query): Handle qPart:auxv:read: query using that.
* linux-low.c (linux_read_auxv): New function.
(linux_target_ops): Initialize `read_auxv' member to that.
Diffstat (limited to 'gdb/gdbserver/linux-low.c')
-rw-r--r-- | gdb/gdbserver/linux-low.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 501bb58..90efd01 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -597,7 +597,7 @@ linux_wait_for_event (struct thread_info *child) /* If we were single-stepping, we definitely want to report the SIGTRAP. The single-step operation has completed, so also - clear the stepping flag; in general this does not matter, + clear the stepping flag; in general this does not matter, because the SIGTRAP will be reported to the client, which will give us a new action for this thread, but clear it for consistency anyway. It's safe to clear the stepping flag @@ -841,7 +841,7 @@ linux_resume_one_process (struct inferior_list_entry *entry, check_removed_breakpoint (process); - if (debug_threads && the_low_target.get_pc != NULL) + if (debug_threads && the_low_target.get_pc != NULL) { fprintf (stderr, " "); (long) (*the_low_target.get_pc) (); @@ -1283,11 +1283,11 @@ linux_read_memory (CORE_ADDR memaddr, char *myaddr, int len) /* Round starting address down to longword boundary. */ register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE); /* Round ending address up; get number of longwords that makes. */ - register int count - = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) + register int count + = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) / sizeof (PTRACE_XFER_TYPE); /* Allocate buffer of that many longwords. */ - register PTRACE_XFER_TYPE *buffer + register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE)); /* Read all the longwords */ @@ -1381,6 +1381,32 @@ linux_send_signal (int signum) kill (signal_pid, signum); } +/* Copy LEN bytes from inferior's auxiliary vector starting at OFFSET + to debugger memory starting at MYADDR. */ + +static int +linux_read_auxv (CORE_ADDR offset, char *myaddr, unsigned int len) +{ + char filename[PATH_MAX]; + int fd, n; + + snprintf (filename, sizeof filename, "/proc/%d/auxv", inferior_pid); + + fd = open (filename, O_RDONLY); + if (fd < 0) + return -1; + + if (offset != (CORE_ADDR) 0 + && lseek (fd, (off_t) offset, SEEK_SET) != (off_t) offset) + n = -1; + else + n = read (fd, myaddr, len); + + close (fd); + + return n; +} + static struct target_ops linux_target_ops = { linux_create_inferior, @@ -1396,6 +1422,7 @@ static struct target_ops linux_target_ops = { linux_write_memory, linux_look_up_symbols, linux_send_signal, + linux_read_auxv, }; static void |