From patchwork Fri Aug 9 07:54:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 34012 Received: (qmail 89995 invoked by alias); 9 Aug 2019 07:54:32 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 89986 invoked by uid 89); 9 Aug 2019 07:54:31 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy=UD:amd64-entry-value-param.exp, sk:amd64-e, sk:amd64e, *die X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 09 Aug 2019 07:54:29 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id C162AACEF; Fri, 9 Aug 2019 07:54:27 +0000 (UTC) Date: Fri, 9 Aug 2019 09:54:26 +0200 From: Tom de Vries To: gdb-patches@sourceware.org Cc: Jan Kratochvil Subject: [PATCH][gdb] Fix gdb.dwarf2/amd64-entry-value-param.exp with -fPIE/-pie Message-ID: <20190809075424.GA15972@delia> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-IsSubscribed: yes Hi, When running gdb.dwarf2/amd64-entry-value-param.exp with target board unix/-fPIE/-pie, we get: ... FAIL: gdb.arch/amd64-entry-value-param.exp: call 1: p y ... The problem is that read_call_site_scope attempts to put relocated addresses in cu->call_site_htab, for both the pc field: ... baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); ... pc = attr_value_as_address (attr) + baseaddr; pc = gdbarch_adjust_dwarf2_addr (gdbarch, pc); ... call_site->pc = pc; ... and the target field: ... lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr); SET_FIELD_PHYSADDR (call_site->target, lowpc); ... but fails to do so because it is called before objfile_relocate, making baseaddr 0. Fix this by eliminating baseaddr from read_call_site_scope, and handling the relocation offset at the use sites in call_site_for_pc and call_site_to_target_addr. Tested on x86_64-linux, both with and without -fPIE/-pie. OK for trunk? Thanks, - Tom [gdb] Fix gdb.dwarf2/amd64-entry-value-param.exp with -fPIE/-pie gdb/ChangeLog: 2019-08-09 Tom de Vries PR gdb/24892 * block.c (call_site_for_pc): Substract relocation offset before finding pc in COMPUNIT_CALL_SITE_HTAB. * dwarf2loc.c (call_site_to_target_addr): Add relocation offset to FIELD_STATIC_PHYSADDR (call_site->target). * dwarf2read.c (read_call_site_scope): Eliminate baseaddr. --- gdb/block.c | 17 ++++++++++++++++- gdb/dwarf2loc.c | 12 +++++++++++- gdb/dwarf2read.c | 12 +++--------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/gdb/block.c b/gdb/block.c index 5c6faa8504..eece1c5171 100644 --- a/gdb/block.c +++ b/gdb/block.c @@ -226,7 +226,22 @@ call_site_for_pc (struct gdbarch *gdbarch, CORE_ADDR pc) cust = find_pc_compunit_symtab (pc - 1); if (cust != NULL && COMPUNIT_CALL_SITE_HTAB (cust) != NULL) - slot = htab_find_slot (COMPUNIT_CALL_SITE_HTAB (cust), &pc, NO_INSERT); + { + struct obj_section *sec; + sec = find_pc_section (pc); + if (sec != NULL) + { + struct objfile *objfile = sec->objfile; + CORE_ADDR baseaddr + = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); + CORE_ADDR pc_unrelocated + = gdbarch_adjust_dwarf2_addr (gdbarch, pc - baseaddr); + + slot = htab_find_slot (COMPUNIT_CALL_SITE_HTAB (cust), + &pc_unrelocated, NO_INSERT); + } + } + if (slot == NULL) { diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 63643cb45d..885412f7ef 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -855,7 +855,17 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch, } case FIELD_LOC_KIND_PHYSADDR: - return FIELD_STATIC_PHYSADDR (call_site->target); + { + CORE_ADDR addr = FIELD_STATIC_PHYSADDR (call_site->target); + 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)); + addr + = gdbarch_adjust_dwarf2_addr (call_site_gdbarch, addr + baseaddr); + return addr; + } default: internal_error (__FILE__, __LINE__, _("invalid call site target kind")); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index de9755f6ce..a3ae7c93e2 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -13844,15 +13844,13 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->per_cu->dwarf2_per_objfile->objfile; struct gdbarch *gdbarch = get_objfile_arch (objfile); - CORE_ADDR pc, baseaddr; + CORE_ADDR pc; struct attribute *attr; struct call_site *call_site, call_site_local; void **slot; int nparams; struct die_info *child_die; - baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - attr = dwarf2_attr (die, DW_AT_call_return_pc, cu); if (attr == NULL) { @@ -13867,8 +13865,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) sect_offset_str (die->sect_off), objfile_name (objfile)); return; } - pc = attr_value_as_address (attr) + baseaddr; - pc = gdbarch_adjust_dwarf2_addr (gdbarch, pc); + pc = attr_value_as_address (attr); if (cu->call_site_htab == NULL) cu->call_site_htab = htab_create_alloc_ex (16, core_addr_hash, core_addr_eq, @@ -14019,10 +14016,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) "low pc, for referencing DIE %s [in module %s]"), sect_offset_str (die->sect_off), objfile_name (objfile)); else - { - lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr); - SET_FIELD_PHYSADDR (call_site->target, lowpc); - } + SET_FIELD_PHYSADDR (call_site->target, lowpc); } } else