From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14895 invoked by alias); 28 May 2018 10:50:31 -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 14870 invoked by uid 89); 28 May 2018 10:50:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.2 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=Javaid, Omair, javaid, omair 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; Mon, 28 May 2018 10:50:28 +0000 Received: by mail-qk0-f193.google.com with SMTP id j12-v6so5478660qkk.4 for ; Mon, 28 May 2018 03:50:27 -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:in-reply-to:references:from:date :message-id:subject:to:cc; bh=cGo5fvUllqrPwNjZHBojaFfwQIYk+SnDjR3XI+e3AQQ=; b=Yu/gpyU4B4U6nRM0GISmEFOeX1TmzCouRn/wKhFNfbhHi7h6gRMdBzM/NnWfaE91JY nX8xysvsJuS/7Exxyrnk95nYI/joAuKKSnnxUgUy/YuKX/vmhEvgfQSEc92AgK5xRaF1 p8ZqIpdDHaeV/uB5NySy/q3+A+8Fcca5XSw1jr1+6/pCKc2hyNLuEbBOKDCjGlaPtzTs x/SvYGcRJEN5cvO2JVFG9F070eHeTdBTdwXPbwExG1/I8jMPg3Q5KrDfDPf9HlN8cT2f 3yBwBfAtPZXOMxHxumwlmOCqgBz7GOoT0+QPssl5wAn5uwwB8+rEnPvb2Ipu/5/ch2ck Cs2A== X-Gm-Message-State: ALKqPwecw4qyHZ7+/k+NMxY7ZzoPySI3whu2tUhe1HIEkRSUp2sJKtrc wNZ/8gUjqk/vINjNQXgql81izP6dIUReJvvxlMtJpEpA X-Google-Smtp-Source: ADUXVKJs18OUICjIQlkZXfYysh7XdyFunID3Y0YfSQU4gJTdlBl8sZRyqATNvDhlNZrQ/fWiKeXSmE+HqAECL1cnwpc= X-Received: by 2002:a37:3ca:: with SMTP id 193-v6mr10595645qkd.432.1527504626028; Mon, 28 May 2018 03:50:26 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:ac8:33d8:0:0:0:0:0 with HTTP; Mon, 28 May 2018 03:49:55 -0700 (PDT) In-Reply-To: <1526393061-18039-1-git-send-email-omair.javaid@linaro.org> References: <1526393061-18039-1-git-send-email-omair.javaid@linaro.org> From: Omair Javaid Date: Mon, 28 May 2018 12:36:00 -0000 Message-ID: Subject: Re: [PATCH] [PR gdb/21695] Fix lost line info for symbol at addr zero To: GDB Patches Cc: Omair Javaid Content-Type: text/plain; charset="UTF-8" X-IsSubscribed: yes X-SW-Source: 2018-05/txt/msg00731.txt.bz2 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!