From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lndn.lancelotsix.com (vps-42846194.vps.ovh.net [IPv6:2001:41d0:801:2000::2400]) by sourceware.org (Postfix) with ESMTPS id 8EBBE385801A for ; Sat, 27 Mar 2021 17:28:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 8EBBE385801A Received: from Plymouth.lan (unknown [IPv6:2a02:390:9086:0:8cf9:5080:a6bb:5153]) by lndn.lancelotsix.com (Postfix) with ESMTPSA id A6D038182E; Sat, 27 Mar 2021 17:28:04 +0000 (UTC) From: Lancelot SIX To: gdb-patches@sourceware.org Cc: Lancelot SIX Subject: [PATCH v3] [PR gdb/27614] gdb-add-index fails on symlinks. Date: Sat, 27 Mar 2021 17:27:58 +0000 Message-Id: <20210327172758.30356-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]); Sat, 27 Mar 2021 17:28:04 +0000 (UTC) X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org 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: , X-List-Received-Date: Sat, 27 Mar 2021 17:28:10 -0000 Since V2: - Use GDB to follow symlink instead of readlink. Unlike readlink, GDB is guaranteed to be available. Since V1: - Replace '&>/dev/null' with '>/dev/null 2>&1' -- 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). The common option to solve such issue would be to use readlink to follow the symlink. Unfortunately, this command is not available in the POSIX standard. This commit therefore proposes to use GDB itself to identify where the symlink points to. This requires some parsing of GDB output. The added test should be enough to detect regression if GDB where to change the way it formats its output. 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 | 18 ++++++- .../gdb.dwarf2/gdb-add-index-symlink.exp | 47 +++++++++++++++++++ 2 files changed, 64 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 2ac3fddbf26..3f53937e1bb 100755 --- a/gdb/contrib/gdb-add-index.sh +++ b/gdb/contrib/gdb-add-index.sh @@ -35,7 +35,23 @@ if test $# != 1; then exit 1 fi -file="$1" +if test -L "$1"; then + # Since readlink is not available in POSIX, use GDB to follow the + # link. + file=$(${GDB} --batch -nx \ + -iex 'set auto-load no' \ + -iex "file '$1'" \ + -iex 'maint info bfds' | + awk -F/ 'BEGIN { OFS=FS } { $1=""; fname=$0 } END { print fname }'| + sed 's/ *$//') + + if ! test -f "$file"; then + echo "$myname: Failed to follow symlink $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