This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 1/2] GDBserver: qXfer:libraries-svr4:read, and big endian hosts
- From: Pedro Alves <palves at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Fri, 23 Mar 2012 21:11:00 +0000
- Subject: [PATCH 1/2] GDBserver: qXfer:libraries-svr4:read, and big endian hosts
- References: <20120323211054.23826.11742.stgit@brno.lan>
read_one_ptr doesn't work correctly on big endian machines, in the
case of a 64-bit GDBserver debugging a 32-bit inferior, which means
read_one_ptr is given a PTR_SIZE which is narrower than the size of
CORE_ADDR. With patch #2 applied before this patch, GDBserver would
fail to walk the DSO list correctly (e.g., the lm_next pointer would
be misread with a 32-bit shift), and GDBserver would end up always
sending an empty DSO list to GDB.
This patch fixes it.
--
Pedro Alves
2012-03-23 Pedro Alves <palves@redhat.com>
* linux-low.c (read_one_ptr): Read the inferior's pointer through
a variable whose type size is the same as the inferior's pointer
size.
---
0 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 4734f15..2dc903d 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -5428,8 +5428,30 @@ get_r_debug (const int pid, const int is_elf64)
static int
read_one_ptr (CORE_ADDR memaddr, CORE_ADDR *ptr, int ptr_size)
{
- *ptr = 0;
- return linux_read_memory (memaddr, (unsigned char *) ptr, ptr_size);
+ int ret;
+
+ /* Go through a union so this works on either big or little endian
+ hosts, when the inferior's pointer size is smaller than the size
+ of CORE_ADDR. It is assumed the inferior's endianness is the
+ same of the superior's. */
+ union
+ {
+ CORE_ADDR core_addr;
+ unsigned int ui;
+ unsigned char uc;
+ } addr;
+
+ ret = linux_read_memory (memaddr, &addr.uc, ptr_size);
+ if (ret == 0)
+ {
+ if (ptr_size == sizeof (CORE_ADDR))
+ *ptr = addr.core_addr;
+ else if (ptr_size == sizeof (unsigned int))
+ *ptr = addr.ui;
+ else
+ gdb_assert_not_reached ("unhandled pointer size");
+ }
+ return ret;
}
struct link_map_offsets