2012-03-23 Pedro Alves <palves@redhat.com>
authorPedro Alves <palves@redhat.com>
Fri, 23 Mar 2012 20:26:14 +0000 (20:26 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 23 Mar 2012 20:26:14 +0000 (20:26 +0000)
* 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.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c

index 155dbb18e99eab8339877a3e73b8261883708ab7..d141bac70eb9bb23ce02c9f6226d67e14412e819 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2012-03-21  Thomas Schwinge  <thomas@codesourcery.com>
 
        * linux-arm-low.c (arm_stopped_by_watchpoint): Use siginfo_t instead of
index 4734f159067b56b3fd613b64770df573db02cb01..2dc903dd12221acf4dab822a0fd368fea4b1e0b0 100644 (file)
@@ -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