From patchwork Wed Jun 27 09:09:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Omair Javaid X-Patchwork-Id: 140310 Delivered-To: patch@linaro.org Received: by 2002:a2e:9754:0:0:0:0:0 with SMTP id f20-v6csp610757ljj; Wed, 27 Jun 2018 02:10:00 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcALeJdRZG1s9EBA+lv4IyJymAY7iveSZEokNp05F9F2TQTWyuUVJVGJXl9EhOx3t/gK0xS X-Received: by 2002:a62:2253:: with SMTP id i80-v6mr4993571pfi.11.1530090600417; Wed, 27 Jun 2018 02:10:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530090600; cv=none; d=google.com; s=arc-20160816; b=uoi4oiHzrVZYM7IJplvxq3J4yl4P58ywVzCHoaJ7v0LY3O6pTmZhzVEXKNx8U2UNHr TdpfcQveCdhJx8oVPkt9bPhG511DKycp41S10TzrLH22qwEX40nuKSKkphTD77DjoWP9 BfyNp5OiJ1CDxKyrP8nEUMVUw5mh1U2faL+leRm3HcUjbEFqGXMl10PR5O1wEuZw5BNY EmXaaHOvzJRRK0jftdGhjdOgfEwzN7NNqwRoVy63QHhAFZW42n7WGlb7C6ynNh+AyKQd WugwQZTmqvOVtrWDxZt5huK4uphreRrrEpvzZqvvIZnCNhs4qpTX6lSS0CGugyMuoukW WuEw== 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:dkim-signature: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=M+W8p7kyRz+IbMdFk+ljNpdnpUNIapvPP8jAQl7ZupU=; b=odAZNTA3eDhb7t+cR7CMdqrbHKtWTdcnwhNwtMT6VhY90XHA98E1hVlGhXSmQqQBqN grwgFdy7s8QoFgNao7wQzlLhqXPyg391r+L1IeFgB83dUFcrX2T/xHuMoTkaAnFP6S63 5hhvkJQqq5+6VHSdHKv1xsbSoDGhfkqzvEtcyaXJeg6N1JunP8IMMbemYyGORzLOXr2u PO0kYZxUQ0P+P+MBXNg89ZLRqg+pvQD+JljKM47w83lrUalXTqQm/5EiQjtrHRNH1hL8 zlOrra14USWzYXK+iQsxe6iyjMVjZD0Rg+B8pFYzj+vBP9/oQyF/oJ3x7FF99056mCyh N3eA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=gX75s2KT; dkim=pass header.i=@linaro.org header.s=google header.b=Z1cW57Px; spf=pass (google.com: domain of gdb-patches-return-148490-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="gdb-patches-return-148490-patch=linaro.org@sourceware.org"; dmarc=pass (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 f6-v6si2916287pgc.73.2018.06.27.02.09.59 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Jun 2018 02:10:00 -0700 (PDT) Received-SPF: pass (google.com: domain of gdb-patches-return-148490-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=gX75s2KT; dkim=pass header.i=@linaro.org header.s=google header.b=Z1cW57Px; spf=pass (google.com: domain of gdb-patches-return-148490-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="gdb-patches-return-148490-patch=linaro.org@sourceware.org"; dmarc=pass (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=JtysRw4SoblgEljHk4sK3N3nJX0xPoXbuR8tmCAhR9JuLj7j3OrWh pM0xCdZmZ9TSgGWXptsAgM+xB/XT7nwJRHcIwJCuSC2t5qSCMDv7/+r5mqbbl8oa n+JpXAGMn8itdkNslOKz/Yawj3LPbpssmj+7LukFq3o3veUEvDbbfM= 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=zZpw9qr7ZBfNSQPo+G/sijqdlGw=; b=gX75s2KT6VNSR74VO6t74Zcss7Bq V9/LPt8GNl8GA3mJFoKehM3b1YmulxDQo2V1Uo9BFGf5zF9rAYN0zVcJw6vUkv56 HTpMA/1JGKvCKR/Vog0AhZj03rOWThVvd0gMSumt/PS6+hfJ+QW/lwyDPDYxpWvr TfaIMdJdufSu4O0= Received: (qmail 69333 invoked by alias); 27 Jun 2018 09:09:53 -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 69240 invoked by uid 89); 27 Jun 2018 09:09:52 -0000 Authentication-Results: sourceware.org; auth=none 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-wm0-f67.google.com Received: from mail-wm0-f67.google.com (HELO mail-wm0-f67.google.com) (74.125.82.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 27 Jun 2018 09:09:44 +0000 Received: by mail-wm0-f67.google.com with SMTP id v16-v6so4912679wmv.5 for ; Wed, 27 Jun 2018 02:09:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=M+W8p7kyRz+IbMdFk+ljNpdnpUNIapvPP8jAQl7ZupU=; b=Z1cW57PxCokIoDQo1XllXvWRR4J06nJpP+6UKuycM6WwUwe9yNd9lU8ToYRFM/McRf gnDALRJfUdSUQLZ8iiR9hogLQASHD7enrcPpSMNvdrh8D2SksXBrhVRU75OZfakJYixQ Ngsamkyj4rEpmz+EEz5HbbJkfGlm/oQ1nTQ0w= Return-Path: Received: from localhost.localdomain ([182.179.131.242]) by smtp.gmail.com with ESMTPSA id j10-v6sm5165232wrr.47.2018.06.27.02.09.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Jun 2018 02:09:40 -0700 (PDT) From: Omair Javaid To: gdb-patches@sourceware.org Cc: simon.marchi@polymtl.ca, tom@tromey.com, Omair Javaid Subject: [PATCH v2] Fix lost line info for symbol at addr zero Date: Wed, 27 Jun 2018 14:09:27 +0500 Message-Id: <1530090567-26491-1-git-send-email-omair.javaid@linaro.org> X-IsSubscribed: yes This fixes corrections highlighted during review. LGTM? 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-06-27 Omair Javaid PR gdb/21695 * dwarf2read.c (lnp_state_machine::check_line_address): Update declaration. (dwarf_decode_lines_1): Adjust. gdb/testsuite: 2018-06-27 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 | 20 ++++----- .../gdb.base/infoline-reloc-main-from-zero.c | 24 ++++++++++ .../gdb.base/infoline-reloc-main-from-zero.exp | 51 ++++++++++++++++++++++ 3 files changed, 85 insertions(+), 10 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 4ad0527..083ec91 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -20305,11 +20305,11 @@ public: we're processing the end of a sequence. */ void record_line (bool end_sequence); - /* Check address and if invalid nop-out the rest of the lines in this - sequence. */ + /* Check ADDRESS is zero and less than UNRELOCATED_LOWPC and if true + nop-out rest of the lines in this sequence. */ void check_line_address (struct dwarf2_cu *cu, const gdb_byte *line_ptr, - CORE_ADDR lowpc, CORE_ADDR address); + CORE_ADDR unrelocated_lowpc, CORE_ADDR address); void handle_set_discriminator (unsigned int discriminator) { @@ -20653,14 +20653,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 unrelocated_lowpc, 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 < UNRELOCATED_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 < unrelocated_lowpc) { /* This line table is for a function which has been GCd by the linker. Ignore it. PR gdb/12528 */ @@ -20754,7 +20754,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..f5e5c26 --- /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 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..7e9b4c0 --- /dev/null +++ b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp @@ -0,0 +1,51 @@ +# Copyright 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 + +# +# PR gdb/21695 +# This tests if gdb can display line information of relocated symbols in the +# case where executable text section was at address zero before relocation. +# + +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 +} + +clean_restart + +# Load symbols at an offset 0xffff0000 using add-symbol-file + +gdb_test "add-symbol-file $binfile 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.*"