From: Pedro Franco de Carvalho Date: Fri, 5 Apr 2019 17:19:08 +0000 (-0300) Subject: Use linux_get_auxv to get AT_PHDR in the PPC stub X-Git-Tag: binutils-2_33~1663 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0570503dd31bc20294e228339fcbdd39b19608cc;p=platform%2Fupstream%2Fbinutils.git Use linux_get_auxv to get AT_PHDR in the PPC stub This patch fixes a build error due to a call to ppc_get_auxv that was left over after linux_get_hwcap and linux_get_hwcap2 were introduced in: 974c89e0882ddb03e294eca76a9e3d3bef90eacf gdbserver: Add linux_get_hwcap Because the missing call fetched AT_PHDR and not AT_HWCAP, linux_get_auxv is now visible. This use also required ppc_get_auxv to return a status variable indicating that the AT_PHDR entry was not found separately from the actual value of of the auxv entry. Therefore, the new linux_get_auxv function is changed to return a status variable and write the entry value to a pointer passed as an argument. Note that linux_get_hwcap and linux_get_hwcap2 still use the return value as both an indicator of that the entry wasn't found and as the actual value of the entry. gdb/gdbserver/ChangeLog: 2019-04-05 Pedro Franco de Carvalho * linux-low.c (linux_get_auxv): Remove static. Return auxv entry value in argument pointer, return 1 if the entry is found and 0 otherwise. Move comment. (linux_get_hwcap, linux_get_hwcap2): Use modified linux_get_auxv. * linux-low.h (linux_get_auxv): Declare. * linux-ppc-low.c (is_elfv2_inferior): Use linux_get_auxv. --- diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index a1627ce..3871ca0 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,12 @@ +2019-04-05 Pedro Franco de Carvalho + + * linux-low.c (linux_get_auxv): Remove static. Return auxv entry + value in argument pointer, return 1 if the entry is found and 0 + otherwise. Move comment. + (linux_get_hwcap, linux_get_hwcap2): Use modified linux_get_auxv. + * linux-low.h (linux_get_auxv): Declare. + * linux-ppc-low.c (is_elfv2_inferior): Use linux_get_auxv. + 2019-04-05 Tom Tromey * server.c (gdbserver_usage): Use upper-case for metasyntactic diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 265043f..65919c3 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -7427,11 +7427,10 @@ linux_get_pc_64bit (struct regcache *regcache) return pc; } -/* Fetch the entry MATCH from the auxv vector, where entries are length - WORDSIZE. If no entry was found, return zero. */ +/* See linux-low.h. */ -static CORE_ADDR -linux_get_auxv (int wordsize, CORE_ADDR match) +int +linux_get_auxv (int wordsize, CORE_ADDR match, CORE_ADDR *valp) { gdb_byte *data = (gdb_byte *) alloca (2 * wordsize); int offset = 0; @@ -7442,15 +7441,21 @@ linux_get_auxv (int wordsize, CORE_ADDR match) { if (wordsize == 4) { - uint32_t *data_p = (uint32_t *)data; + uint32_t *data_p = (uint32_t *) data; if (data_p[0] == match) - return data_p[1]; + { + *valp = data_p[1]; + return 1; + } } else { - uint64_t *data_p = (uint64_t *)data; + uint64_t *data_p = (uint64_t *) data; if (data_p[0] == match) - return data_p[1]; + { + *valp = data_p[1]; + return 1; + } } offset += 2 * wordsize; @@ -7464,7 +7469,9 @@ linux_get_auxv (int wordsize, CORE_ADDR match) CORE_ADDR linux_get_hwcap (int wordsize) { - return linux_get_auxv (wordsize, AT_HWCAP); + CORE_ADDR hwcap = 0; + linux_get_auxv (wordsize, AT_HWCAP, &hwcap); + return hwcap; } /* See linux-low.h. */ @@ -7472,7 +7479,9 @@ linux_get_hwcap (int wordsize) CORE_ADDR linux_get_hwcap2 (int wordsize) { - return linux_get_auxv (wordsize, AT_HWCAP2); + CORE_ADDR hwcap2 = 0; + linux_get_auxv (wordsize, AT_HWCAP2, &hwcap2); + return hwcap2; } static struct target_ops linux_target_ops = { diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h index d825184..d5d074e 100644 --- a/gdb/gdbserver/linux-low.h +++ b/gdb/gdbserver/linux-low.h @@ -435,6 +435,14 @@ bool thread_db_thread_handle (ptid_t ptid, gdb_byte **handle, int *handle_len); extern int have_ptrace_getregset; +/* Search for the value with type MATCH in the auxv vector with + entries of length WORDSIZE bytes. If found, store the value in + *VALP and return 1. If not found or if there is an error, return + 0. */ + +int linux_get_auxv (int wordsize, CORE_ADDR match, + CORE_ADDR *valp); + /* Fetch the AT_HWCAP entry from the auxv vector, where entries are length WORDSIZE. If no entry was found, return zero. */ diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c index 8deb0ce..f17f05a 100644 --- a/gdb/gdbserver/linux-ppc-low.c +++ b/gdb/gdbserver/linux-ppc-low.c @@ -1107,10 +1107,13 @@ is_elfv2_inferior (void) #else const int def_res = 0; #endif - unsigned long phdr; + CORE_ADDR phdr; Elf64_Ehdr ehdr; - if (!ppc_get_auxv (AT_PHDR, &phdr)) + const struct target_desc *tdesc = current_process ()->tdesc; + int wordsize = register_size (tdesc, 0); + + if (!linux_get_auxv (wordsize, AT_PHDR, &phdr)) return def_res; /* Assume ELF header is at the beginning of the page where program headers