From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 126942 invoked by alias); 20 Jun 2018 07:53:58 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 126820 invoked by uid 89); 20 Jun 2018 07:53:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=HX-Received:Wed, sk:infolin, calculated, H*r:209.85.220 X-HELO: mail-qk0-f193.google.com Received: from mail-qk0-f193.google.com (HELO mail-qk0-f193.google.com) (209.85.220.193) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 20 Jun 2018 07:53:44 +0000 Received: by mail-qk0-f193.google.com with SMTP id y4-v6so1349448qka.5 for ; Wed, 20 Jun 2018 00:53:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=LpwgpQf1GeEVyCF2iS74aJ1WBnV8xMe7GiysNkuMMNA=; b=aE97y1dfgJqxh81EDafoTaQ8+RODeywLrZLMIMzTGPIPkZzUcr2xMhDV9W+9EfpEQP gC3TQPJK+wDPc4OwO/XGl5HA71tuTi8c0HRQh7LCg6A+kGQAdQDMfa/aSeBVeDkytBwM iABtowgy2ca6+6D+xffVzDgkaxE2ScDc20FQHAFEoG9HUZNAbOQLi3cAZOZ9d3ndEYQM cVsdMTfIbUvW5g1YjPBlPtSXo17y9EzpBFR9+BCSiYLEGvWRjBVMCMX7VBCDAMHmdlC1 8bVl36t6sMOJAH1vay1ReGTvzOXLUO0gGPMavzxSTqd0105031oDOmxIHgzalllwT7Qr N3ag== X-Gm-Message-State: APt69E3tqG70wM16gKJzqGjGkbUvHQRLmc2Rb8jKRlGnzEmLlAcdojlL QRsKU6EUaGkm/lBSjZNH5t/z51bGHmQV4IJuzukYYxT7 X-Google-Smtp-Source: ADUXVKJ7FLVHY04HmfrjQIT9vSaPbZeeUn5RRdIMsTJM9omx7sPRCTZQmEHfgr+xyNLthLBYHP7rIOJJLMMpF0BcYk8= X-Received: by 2002:a37:2999:: with SMTP id p25-v6mr16584139qkp.61.1529481222044; Wed, 20 Jun 2018 00:53:42 -0700 (PDT) MIME-Version: 1.0 References: <1526393061-18039-1-git-send-email-omair.javaid@linaro.org> In-Reply-To: From: Omair Javaid Date: Wed, 20 Jun 2018 07:53:00 -0000 Message-ID: Subject: Re: [PATCH] [PR gdb/21695] Fix lost line info for symbol at addr zero To: GDB Patches Content-Type: text/plain; charset="UTF-8" X-IsSubscribed: yes X-SW-Source: 2018-06/txt/msg00488.txt.bz2 On Tue, 12 Jun 2018 at 07:25, Omair Javaid wrote: > > On 28 May 2018 at 15:49, Omair Javaid wrote: > > On 15 May 2018 at 19:04, Omair Javaid wrote: > >> This patch fixes a unique condition where GDB fails to provide line > >> information of symbol at address zero when code is compiled with text > >> address zero but loaded at an offset > 0. > >> > >> For example lets compile following code snippet: > >> > >> int main() { > >> return 0; > >> } > >> > >> gcc -O0 -g3 -nostdlib -emain -Wl,-Ttext=0x00 -o file.out file.c > >> > >> Start gdb and run: > >> > >> add-symbol-file file.out 0xffff0000 > >> info line main > >> > >> GDB will return error saying no line info is available for the symbol. > >> > >> This is a direct consequence of the fix for PR 12528 where GDB tries to ignore > >> line table for a function which has been garbage collected by the linker. > >> > >> As the garbage collected symbols are sent to address zero GDB assumes a symbol > >> actually placed at address zero as garbage collected. > >> > >> This was fixed with an additional check address < lowpc. But when symbol is > >> loaded at an offset lowpc becomes lowpc + offset while no offset is added to > >> address rather final symbol address is calculated based on baseaddr and address > >> added together. So in case where symbols are loaded at an offset the condition > >> address < lowpc will always return true. > >> > >> This patch fixes this by comparing address against a non offset lowpc. > >> This patch also adds a GDB test case to replicate this behavior. > >> > >> gdb: > >> > >> 2018-05-15 Omair Javaid > >> > >> PR gdb/21695 > >> * dwarf2read.c (lnp_state_machine::check_line_address): Update declaration. > >> (dwarf_decode_lines_1): Adjust. > >> > >> gdb/testsuite: > >> > >> 2018-05-15 Omair Javaid > >> > >> PR gdb/21695 > >> * gdb.base/infoline-reloc-main-from-zero.exp: New test. > >> * gdb.base/infoline-reloc-main-from-zero.c: New file. > >> --- > >> gdb/dwarf2read.c | 8 ++-- > >> .../gdb.base/infoline-reloc-main-from-zero.c | 24 ++++++++++ > >> .../gdb.base/infoline-reloc-main-from-zero.exp | 51 ++++++++++++++++++++++ > >> 3 files changed, 79 insertions(+), 4 deletions(-) > >> create mode 100644 gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.c > >> create mode 100644 gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp > >> > >> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c > >> index 575d316..b171bb2 100644 > >> --- a/gdb/dwarf2read.c > >> +++ b/gdb/dwarf2read.c > >> @@ -20411,7 +20411,7 @@ public: > >> sequence. */ > >> void check_line_address (struct dwarf2_cu *cu, > >> const gdb_byte *line_ptr, > >> - CORE_ADDR lowpc, CORE_ADDR address); > >> + CORE_ADDR lowpc_minus_base, CORE_ADDR address); > >> > >> void handle_set_discriminator (unsigned int discriminator) > >> { > >> @@ -20755,14 +20755,14 @@ lnp_state_machine::lnp_state_machine (gdbarch *arch, line_header *lh, > >> void > >> lnp_state_machine::check_line_address (struct dwarf2_cu *cu, > >> const gdb_byte *line_ptr, > >> - CORE_ADDR lowpc, CORE_ADDR address) > >> + CORE_ADDR lowpc_minus_base, CORE_ADDR address) > >> { > >> /* If address < lowpc then it's not a usable value, it's outside the > >> pc range of the CU. However, we restrict the test to only address > >> values of zero to preserve GDB's previous behaviour which is to > >> handle the specific case of a function being GC'd by the linker. */ > >> > >> - if (address == 0 && address < lowpc) > >> + if (address == 0 && address < lowpc_minus_base) > >> { > >> /* This line table is for a function which has been > >> GCd by the linker. Ignore it. PR gdb/12528 */ > >> @@ -20857,7 +20857,7 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, > >> line_ptr += bytes_read; > >> > >> state_machine.check_line_address (cu, line_ptr, > >> - lowpc, address); > >> + lowpc - baseaddr, address); > >> state_machine.handle_set_address (baseaddr, address); > >> } > >> break; > >> diff --git a/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.c b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.c > >> new file mode 100644 > >> index 0000000..8902051 > >> --- /dev/null > >> +++ b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.c > >> @@ -0,0 +1,24 @@ > >> +/* This testcase is part of GDB, the GNU debugger. > >> + > >> + Copyright 2011-2018 Free Software Foundation, Inc. > >> + > >> + This program is free software; you can redistribute it and/or modify > >> + it under the terms of the GNU General Public License as published by > >> + the Free Software Foundation; either version 3 of the License, or > >> + (at your option) any later version. > >> + > >> + This program is distributed in the hope that it will be useful, > >> + but WITHOUT ANY WARRANTY; without even the implied warranty of > >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > >> + GNU General Public License for more details. > >> + > >> + You should have received a copy of the GNU General Public License > >> + along with this program. If not, see . */ > >> + > >> +// Test case for PR gdb/21695 > >> + > >> +int > >> +main () > >> +{ > >> + return 0; > >> +} > >> diff --git a/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp > >> new file mode 100644 > >> index 0000000..68564688 > >> --- /dev/null > >> +++ b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp > >> @@ -0,0 +1,51 @@ > >> +# Copyright 2011-2018 Free Software Foundation, Inc. > >> + > >> +# This program is free software; you can redistribute it and/or modify > >> +# it under the terms of the GNU General Public License as published by > >> +# the Free Software Foundation; either version 3 of the License, or > >> +# (at your option) any later version. > >> +# > >> +# This program is distributed in the hope that it will be useful, > >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of > >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > >> +# GNU General Public License for more details. > >> +# > >> +# You should have received a copy of the GNU General Public License > >> +# along with this program. If not, see . > >> + > >> +# This file is part of the gdb testsuite > >> + > >> +# > >> +# test running programs > >> +# > >> + > >> +standard_testfile .c > >> + > >> +if [get_compiler_info] { > >> + return -1 > >> +} > >> + > >> +# Build executable with stripped startup code and text section starting at zero > >> + > >> +set opts {debug "additional_flags=-nostdlib -emain -Wl,-Ttext=0x00"} > >> + > >> +if {[build_executable $testfile.exp $testfile $srcfile $opts] == -1} { > >> + untested "failed to compile" > >> + return -1 > >> +} > >> + > >> +gdb_exit > >> +gdb_start > >> +gdb_reinitialize_dir $srcdir/$subdir > >> + > >> +# Load symbols at an offset 0xffff0000 using add-symbol-file > >> + > >> +gdb_test "add-symbol-file [standard_output_file ${testfile}] 0xffff000" \ > >> + "Reading symbols from .*" \ > >> + "add-symbol-file" \ > >> + "add symbol table from file \".*\" at.*\\(y or n\\) " "y" > >> + > >> +# Check if we are able to read offset adjusted line information of main > >> + > >> +gdb_test "info line main" \ > >> + "Line.*starts at address.*and ends at.*" > >> -- > >> 2.7.4 > >> > > > > > > Ping! > > Ping! Ping!