From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id aTpHMtvcW2ACcgAAWB0awg (envelope-from ) for ; Wed, 24 Mar 2021 20:44:11 -0400 Received: by simark.ca (Postfix, from userid 112) id C05801EF7C; Wed, 24 Mar 2021 20:44:11 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RDNS_DYNAMIC,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id BC5271E789 for ; Wed, 24 Mar 2021 20:44:10 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A55FA38515DB; Thu, 25 Mar 2021 00:44:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A55FA38515DB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1616633049; bh=9tszyjGHzX/axOo+KOx/J6W4kDGM6OCUD3vZyLGAWIk=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=uqx0NSjRUHtd5A4Kw3ra9GheRYIKIOx4rTo0GDbXxqzJFeqH1Zdn4WkGmldILvK0n FAuBF0t+zN08S8YN9NBhfw40MRbLNbWeq+uEcd5Cu5wmuZEDNZPs/Xi4yPJBppnSzA StrqwIfYryeiS9x85F6ANUAnqzc8nSFD3w2R8QB4= Received: from lndn.lancelotsix.com (lndn.lancelotsix.com [51.195.220.111]) by sourceware.org (Postfix) with ESMTPS id 1E8E93857C73 for ; Thu, 25 Mar 2021 00:44:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 1E8E93857C73 Received: from Plymouth.lan (unknown [IPv6:2a02:390:9086:0:c9d3:63eb:4238:9a8a]) by lndn.lancelotsix.com (Postfix) with ESMTPSA id AAA97818F3; Thu, 25 Mar 2021 00:44:03 +0000 (UTC) To: gdb-patches@sourceware.org Subject: [PATCH] [PR gdb/27614] gdb-add-index fails on symlinks. Date: Thu, 25 Mar 2021 00:43:58 +0000 Message-Id: <20210325004358.31291-1-lsix@lancelotsix.com> X-Mailer: git-send-email 2.30.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.5.11 (lndn.lancelotsix.com [0.0.0.0]); Thu, 25 Mar 2021 00:44:03 +0000 (UTC) X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Lancelot SIX via Gdb-patches Reply-To: Lancelot SIX Cc: Lancelot SIX Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" PR 27614 shows that gdb-add-index fails to generate the index when its argument is a symlink. The following one liner illustrates the reported problem: $ echo 'int main(){}'|gcc -g -x c -;ln -s a.out symlink;gdb-add-index symlink gdb-add-index: No index was created for symlink gdb-add-index: [Was there no debuginfo? Was there already an index?] $ ls -l -rwxr-xr-x 1 25712 Mar 19 23:05 a.out* -rw------- 1 8277 Mar 19 23:05 a.out.gdb-index lrwxrwxrwx 1 5 Mar 19 23:05 symlink -> a.out* GDB generates the .gdb-index file with a name that matches the name of the actual program (a.out.gdb-index here), not the symlink that references it. The remaining of the script is looking for a file named after the provided argument (would be 'symlink.gdb-index' in our example). To fix this, this commit proposes to use 'readlink' when available. This command is not part of the standard POSIX tools, so this fix might not work in all situations. It will at least provide an error message to the user. There are no straightforward solution to go around the problem. The .gdb-index, .debug_names and .debug_str files could be generated and then identified by matching *.gdb-index, *.debug_names or *.debug_str. This would be problematic if other files where to match this pattern. Generating those index files in a dedicated directory raise the problem of generating a unique dirname, and mkdtemp is not a standard POSIX command so we cannot rely on it either. It could also be possible to use something like "gdb --batch -nx -iex 'set auto-load no' -iex 'file $file' -iex 'maint info bfds" and parse its output, but I am not sure how future-proof this is. Long story short, I went for the simple option that fixes the reported issue most of the time instead of trying to come with something too complicated for limited added-value. I can change that if required. gdb/ChangeLog: PR gdb/27614 * contrib/gdb-add-index.sh: Fix when called with a symlink as an argument. gdb/testsuite/ChangeLog: PR gdb/27614 * gdb.dwarf2/gdb-add-index-symlink.exp: New test. --- gdb/contrib/gdb-add-index.sh | 15 +++++- .../gdb.dwarf2/gdb-add-index-symlink.exp | 47 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.dwarf2/gdb-add-index-symlink.exp diff --git a/gdb/contrib/gdb-add-index.sh b/gdb/contrib/gdb-add-index.sh index 60287b97fba..c27f772f5c5 100755 --- a/gdb/contrib/gdb-add-index.sh +++ b/gdb/contrib/gdb-add-index.sh @@ -35,7 +35,20 @@ if test $# != 1; then exit 1 fi -file="$1" +if test -L "$1"; then + # This script will most likely fail if the argument is a symlink to a + # program. In order to avoid that, try to follow the symlink. However, + # readlink is not a standard POSIX tool so we have to check if it is + # available. + if command -v readlink &>/dev/null; then + file="$(readlink -e "$1")" + else + echo "$myname: unable to follow link: $1" 1>&2 + exit 1 + fi +else + file="$1" +fi if test ! -r "$file"; then echo "$myname: unable to access: $file" 1>&2 diff --git a/gdb/testsuite/gdb.dwarf2/gdb-add-index-symlink.exp b/gdb/testsuite/gdb.dwarf2/gdb-add-index-symlink.exp new file mode 100644 index 00000000000..eaeddec0250 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/gdb-add-index-symlink.exp @@ -0,0 +1,47 @@ +# Copyright 2021 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 . + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2. +if {![dwarf2_support]} { + return 0 +} + +standard_testfile main.c + +if { [prepare_for_testing "failed to prepare" "${testfile}" \ + [list ${srcfile}]] } { + return -1 +} + +set symlink [file dirname $binfile]/symlink + +if { ![file exists $symlink] } { + file link -symbolic $symlink $binfile +} + +if { [ensure_gdb_index $symlink] == -1 } { + fail "Unable to call gdb-add-index with a symlink to a symfile" + return -1 +} + +# Ok, we have a copy of $binfile with an index. +# Restart gdb and verify the index was used. + +clean_restart $symlink +gdb_test "mt print objfiles ${testfile}" \ + "(gdb_index|debug_names).*" \ + "index used" -- 2.30.1