X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-low.c;h=2dc903dd12221acf4dab822a0fd368fea4b1e0b0;hb=485f1ee4f6b7f8ae37640b65966ad82eeced8f9a;hp=4734f159067b56b3fd613b64770df573db02cb01;hpb=f24fcb9dad8d6883b0f2dfe302c87557aae3bd1e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 4734f15906..2dc903dd12 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