This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Show function address in 'info address func' instead of function descriptor
- From: Yao Qi <qiyaoltc at gmail dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 27 Oct 2016 10:25:49 +0100
- Subject: [PATCH] Show function address in 'info address func' instead of function descriptor
- Authentication-results: sourceware.org; auth=none
If we debug a program with debug information, we get the function
address of main shown below,
(gdb) p &main
$1 = (int (*)(void)) 0x10000554 <main>
(gdb) info address main
Symbol "main" is a function at address 0x10000554.
however, if we debug a program without debug information, "info address"
shows function descriptor address, while "p &main" shows function
address.
(gdb) p &main
$1 = (<text variable, no debug info> *) 0x10000554 <.main>
(gdb) info address main
Symbol "main" is at 0x10020078 in a file compiled without debugging.
IMO, it is more reasonable to show function address instead of function
descriptor address. Secondly, in GDB manual,
info address symbol
Describe where the data for symbol is stored. For a register variable,
this says which register it is kept in. For a non-register local
variable, this prints the stack-frame offset at which the variable is
always stored.
Note the contrast with 'print &symbol', which does not work at all for
a register variable, and for a stack local variable prints the exact
address of the current instantiation of the variable.
we can tell that "info address symbol" and "print &symbol" should print
the same address but in different formats. In case of no debug
information, "print &symbol" shows function address, so
"info address symbol" should show function address too.
with this patch applied, if we debug program without debug information,
it becomes:
(gdb) p &main
$1 = (<text variable, no debug info> *) 0x10000554 <.main>
(gdb) info address main
Symbol "main" is at 0x10000554 in a file compiled without debugging.
Regression tested on ppc64-linux (gcc110.fsffrance.org).
gdb:
2016-10-27 Yao Qi <yao.qi@linaro.org>
* printcmd.c (address_info): Call
gdbarch_convert_from_func_ptr_addr.
---
gdb/printcmd.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index 7180fda..a256bed 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -1489,7 +1489,10 @@ address_info (char *exp, int from_tty)
gdbarch = get_objfile_arch (objfile);
load_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
-
+ /* The minimal symbol might point to a function descriptor;
+ resolve it to the actual code address instead. */
+ load_addr = gdbarch_convert_from_func_ptr_addr (gdbarch, load_addr,
+ ¤t_target);
printf_filtered ("Symbol \"");
fprintf_symbol_filtered (gdb_stdout, exp,
current_language->la_language, DMGL_ANSI);
--
1.9.1