From: Tom de Vries <tdevries@suse.de>
To: gdb-patches@sourceware.org
Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
Subject: [PATCH][gdb] Fix gdb.arch/amd64-tailcall-*.exp with -fPIE/-pie
Date: Fri, 09 Aug 2019 10:48:00 -0000 [thread overview]
Message-ID: <20190809104848.GA6563@delia> (raw)
Hi,
When running gdb.arch/amd64-tailcall-*.exp with target board
unix/-fPIE/-pie, we get:
...
FAIL: gdb.arch/amd64-tailcall-cxx.exp: bt
FAIL: gdb.arch/amd64-tailcall-noret.exp: bt
FAIL: gdb.arch/amd64-tailcall-self.exp: bt
...
The first FAIL in more detail, compared to a nopie run:
...
(gdb) bt
#0 b ()
-#1 0x00000000004004df in a (q=<optimized out>)
+#1 0x0000000000000672 in ?? ()
-#2 0x00000000004003d5 in main (argc=<optimized out>, argv=<optimized out>)
+#2 0x0000555555554535 in main (argc=<optimized out>, argv=<optimized out>)
-(gdb) PASS: gdb.arch/amd64-tailcall-self.exp: bt
+(gdb) FAIL: gdb.arch/amd64-tailcall-self.exp: bt
...
shows an unrelocated address for function a.
The problem is that pretend_pc uses the pc field from a struct call_site
without adding the missing relocation offset.
Fix this by adding the appropriate offset.
Tested on x86_64-linux, with and without -fPIE/-pie.
OK for trunk?
Thanks,
- Tom
[gdb] Fix gdb.arch/amd64-tailcall-*.exp with -fPIE/-pie
gdb/ChangeLog:
2019-08-09 Tom de Vries <tdevries@suse.de>
* dwarf2-frame-tailcall.c (pretend_pc): Add relocation offset to pc
field of struct call_site.
---
gdb/dwarf2-frame-tailcall.c | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c
index e8f5aaf9c7..02c50db3af 100644
--- a/gdb/dwarf2-frame-tailcall.c
+++ b/gdb/dwarf2-frame-tailcall.c
@@ -29,6 +29,8 @@
#include "value.h"
#include "dwarf2-frame.h"
#include "gdbarch.h"
+#include "dwarf2read.h"
+#include "objfiles.h"
/* Contains struct tailcall_cache indexed by next_bottom_frame. */
static htab_t cache_htab;
@@ -240,14 +242,38 @@ pretend_pc (struct frame_info *this_frame, struct tailcall_cache *cache)
gdb_assert (next_levels >= 0);
if (next_levels < chain->callees)
- return chain->call_site[chain->length - next_levels - 1]->pc;
+ {
+ struct call_site *call_site
+ = chain->call_site[chain->length - next_levels - 1];
+ CORE_ADDR addr = call_site->pc;
+ struct dwarf2_per_objfile *dwarf2_per_objfile
+ = call_site->per_cu->dwarf2_per_objfile;
+ struct objfile *objfile = dwarf2_per_objfile->objfile;
+ CORE_ADDR baseaddr
+ = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+ struct gdbarch *gdbarch = get_objfile_arch (objfile);
+ addr = gdbarch_adjust_dwarf2_addr (gdbarch, addr + baseaddr);
+ return addr;
+ }
next_levels -= chain->callees;
/* Otherwise CHAIN->CALLEES are already covered by CHAIN->CALLERS. */
if (chain->callees != chain->length)
{
if (next_levels < chain->callers)
- return chain->call_site[chain->callers - next_levels - 1]->pc;
+ {
+ struct call_site *call_site
+ = chain->call_site[chain->callers - next_levels - 1];
+ CORE_ADDR addr = call_site->pc;
+ struct dwarf2_per_objfile *dwarf2_per_objfile
+ = call_site->per_cu->dwarf2_per_objfile;
+ struct objfile *objfile = dwarf2_per_objfile->objfile;
+ CORE_ADDR baseaddr
+ = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+ struct gdbarch *gdbarch = get_objfile_arch (objfile);
+ addr = gdbarch_adjust_dwarf2_addr (gdbarch, addr + baseaddr);
+ return addr;
+ }
next_levels -= chain->callers;
}
next reply other threads:[~2019-08-09 10:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-09 10:48 Tom de Vries [this message]
[not found] ` <57ada901-a8d8-b632-f7d8-e42283314b5a@redhat.com>
[not found] ` <38825791-ad92-3f7e-d3ae-2ac123dd6422@suse.de>
2019-08-09 17:38 ` Pedro Alves
2019-08-10 5:44 ` Tom de Vries
2019-08-16 18:34 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190809104848.GA6563@delia \
--to=tdevries@suse.de \
--cc=gdb-patches@sourceware.org \
--cc=jan.kratochvil@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox