From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 118064 invoked by alias); 12 Jun 2018 02:26:03 -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 117957 invoked by uid 89); 12 Jun 2018 02:25:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.7 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= X-HELO: mail-qt0-f196.google.com Received: from mail-qt0-f196.google.com (HELO mail-qt0-f196.google.com) (209.85.216.196) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 12 Jun 2018 02:25:45 +0000 Received: by mail-qt0-f196.google.com with SMTP id x34-v6so22356485qtk.5 for ; Mon, 11 Jun 2018 19:25:41 -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=mny2ONMQC4sQupoZVboW7rkQ24PlcGTyZ2QyVoIAkg0=; b=scKDgbFvLEoyflUV2GdAKRSocIWpEO6hXxTxZ3plMy3qAiGtf0yKpA5TkzPgLqhNyC wkEYD6aJ04velwQZjfrieHN499YNdAR8ODq0MoBm0BhWVxHvHxenKf8y8aDPA4dyZv+z POOJ/Kh0KRO5QwF9RmI1LQObaKSe2nvj0JJtImecVCgvikyssO7w9CvVkqv77kjhmAY6 YVg/oLOvjpGakQhOS+1J6Yf7tZDzOzsimmT/Iwhq/kicsVJUi06cpUXJEwghPqD2N+u1 J8G0RY8cGcPi8yEKGPOzjIqir/VKXSy0fO1RqcZbjRK5qWqnadlswrbjsAKWSel6Lx2P PsoQ== X-Gm-Message-State: APt69E2Q5Ysjs0cwWqZrISRzExLDF9ujW6gddIZ8fgTSjCJdBm5O1NQs wlluaGqIJwRisthMsyc0SOx0C9z549oXT8x0rLq/UUPf X-Google-Smtp-Source: ADUXVKLpYuPFuX+M1tslOEwlWEp75F1BLF8qg2x7Vgn46qjlvJ6bCdmxojWMGrZF/8ZSiMfVXfJQaskDRVD2Hwl4AoQ= X-Received: by 2002:aed:238d:: with SMTP id j13-v6mr1639092qtc.384.1528770340135; Mon, 11 Jun 2018 19:25:40 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:ac8:325:0:0:0:0:0 with HTTP; Mon, 11 Jun 2018 19:25:09 -0700 (PDT) In-Reply-To: References: <1526393061-18039-1-git-send-email-omair.javaid@linaro.org> From: Omair Javaid Date: Tue, 12 Jun 2018 02:26: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-06/txt/msg00302.txt.bz2 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!