From patchwork Tue May 15 14:04:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Omair Javaid X-Patchwork-Id: 135880 Delivered-To: patch@linaro.org Received: by 2002:a2e:9706:0:0:0:0:0 with SMTP id r6-v6csp1061960lji; Tue, 15 May 2018 07:05:05 -0700 (PDT) X-Google-Smtp-Source: AB8JxZot/5g7DtNdgm6oGjhlgGwV++agtSGG0R3xSlaf1/yMcNaYnnr9rIrN+FenIuEazHENLVqZ X-Received: by 2002:a63:41c1:: with SMTP id o184-v6mr12306524pga.393.1526393105505; Tue, 15 May 2018 07:05:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526393105; cv=none; d=google.com; s=arc-20160816; b=ZIVT345PZm3OKGOJnGOK2Y7HOJ+Y/KcSn74WlVe0PsmX9JnzKC0/vRGjcaIQTbUqqr yH4YX01rgoPEC2NdkibqaIO6WQykMP6HhWAYm9siJy02OEq247TEriHrvhyeeIhbrYOb oJSNA/7E/PRloJOj+neLxE+a1fxze0O2HfZMFGwpoBH90RjOz2kOVAh9Pgyu9ZfOOz5o myVR+o5dnWcbiPlYsIiWWXxFsJ0KivF1y9s1EyQMX6D4fpZ7b2mEaT6fa35M/Rgnx4pM qt8GyytUVIkkAPIpTDfhPkvYowS3xLeuKFKdVN2AhmN2ETfGlGFm4INL21p0Ev2WsslD laCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:cc:to:from:delivered-to:sender:list-help :list-post:list-archive:list-subscribe:list-unsubscribe:list-id :precedence:mailing-list:dkim-signature:domainkey-signature :arc-authentication-results; bh=Qu8ZN/nnXpQ47Uw030mKF6EdbtsuLXKnW8Cy4RCzvdo=; b=WsdWezXDKIYG/RDbe5t9OrP1tgoJA42slgVds17KGiEQ91zuQRR3XPGYj3Iu7EkC3k x9QCwYxhbeXjvd9eXG2bXFZGKz7f7RPLxOjadOTeHuIAhoIyslADyt1Jy/Deg59Yu7/A Cp9dttQ6idhqoSf5qCdGpzsWTEV+uhqp55/gOJVml3T7iKS7tzaHqGoxWuQaQ3LTHjn+ gdaHzErfmEWaKYrLQAufm4JhQxFfTJrheEha7GlAaqegXHRR6n3EnyQfEVBvctME5a6s RGLmVe4KEU/aYwyD+ENZllZJYER0H6YJ9Ea+OwGbhOR2FkbaqiLWdhgFA/3RH+/CxmsC jRFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=AZAPg24W; spf=pass (google.com: domain of gdb-patches-return-147309-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gdb-patches-return-147309-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id z12-v6si93659pgr.376.2018.05.15.07.04.57 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 May 2018 07:05:05 -0700 (PDT) Received-SPF: pass (google.com: domain of gdb-patches-return-147309-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=AZAPg24W; spf=pass (google.com: domain of gdb-patches-return-147309-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gdb-patches-return-147309-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id; q=dns; s= default; b=cmsFOTNCWZkqn9CKauYJCcH7+GnPEC6MrHrFr2yM837HDDFg0oJTu x9hE835JCGpbp4H9QTxeo6jSEt6BPB1HCFZpznfo0PM4P1BI9mmZ3HCaMJIxSx45 cwhWHnuWq10Zm0kyxkeSOBlegsCpc4Ip/UbcDs8hugHAdvRQxYDEHw= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id; s=default; bh=UsY37WvCeTKGxuUf8CORxhqSGdc=; b=AZAPg24WxJ+mDfMrT6kIt2La5wR2 q4rdRmfC7wb266ZjFwbN6REMjIqU2EBuGn1u3Kc7d7RXAgfZEMRfmjdfbPm1klL/ Oirr5+LiVFvBKBdS4YDX3FHLiaeR8xDd/L3nOvC6PwgFiqi499Tmm2gLJmdt18Qk OF6fzw8gN3dqdyA= Received: (qmail 48152 invoked by alias); 15 May 2018 14:04:50 -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 47680 invoked by uid 89); 15 May 2018 14:04:49 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=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-wr0-f196.google.com Received: from mail-wr0-f196.google.com (HELO mail-wr0-f196.google.com) (209.85.128.196) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 15 May 2018 14:04:47 +0000 Received: by mail-wr0-f196.google.com with SMTP id q3-v6so281324wrj.6 for ; Tue, 15 May 2018 07:04:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Qu8ZN/nnXpQ47Uw030mKF6EdbtsuLXKnW8Cy4RCzvdo=; b=COvLYphW2wjffrLbF4UokNe6j56wmWGbimBneITMXniU7rfMpevWHkI4AaYgQ6y5Dn DDdgagXGFLdrJ4wvmyTLRaEaWvgyQjb58dClAm7DMtQTc8zmOgqUP+75U2Dg0EIYUVGv 9O9HQ7iptREH5eLH1ml/E+0FNGODu5a5/uBSMTuwM4LVRRS2DKdqI0KK30UJFwN3B5AG NXagQSXWibYfCd8+24575ytc99yJklvmCZRqdq0tt2sRbDIL+V9LsI6JJaBsJmgYyU1o 8d3VvMCSLGZCgFZ3y5B3LEWskkjqQTyq/k6SD9jkOCJTkD5Xk/+066vz2n+ngy5dVNER L7ew== X-Gm-Message-State: ALKqPwdRJbT/DqP30px3TlwgiUrWvhDFjGOSEwRdbDa48SIB1EAJKv3s SpywQmzcu+Xxyf2SD/noTh9bO4XDqSc= X-Received: by 2002:adf:8323:: with SMTP id 32-v6mr11379154wrd.174.1526393084753; Tue, 15 May 2018 07:04:44 -0700 (PDT) Received: from localhost.localdomain ([39.55.222.72]) by smtp.gmail.com with ESMTPSA id x17-v6sm263168wmd.46.2018.05.15.07.04.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 15 May 2018 07:04:44 -0700 (PDT) From: Omair Javaid To: gdb-patches@sourceware.org Cc: Omair Javaid Subject: [PATCH] [PR gdb/21695] Fix lost line info for symbol at addr zero Date: Tue, 15 May 2018 19:04:21 +0500 Message-Id: <1526393061-18039-1-git-send-email-omair.javaid@linaro.org> X-IsSubscribed: yes 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 -- 2.7.4 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.*"