From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12024 invoked by alias); 5 Sep 2013 13:18:48 -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 12011 invoked by uid 89); 5 Sep 2013 13:18:48 -0000 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 05 Sep 2013 13:18:48 +0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.4 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r85DIhWI016480 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 09:18:43 -0400 Received: from host2.jankratochvil.net (ovpn-116-16.ams2.redhat.com [10.36.116.16]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r85DIdIe007032 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Thu, 5 Sep 2013 09:18:42 -0400 Date: Thu, 05 Sep 2013 13:18:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Cc: Doug Evans Subject: [patchv2] Support .dwp with the name of symlinked binary file Message-ID: <20130905131839.GA8618@host2.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes X-SW-Source: 2013-09/txt/msg00167.txt.bz2 Hi Doug, this patch obsoletes the series: [patch 0/3] Support .dwp with the name of symlinked binary file https://sourceware.org/ml/gdb-patches/2013-08/msg00837.html Message-ID: <20130828160529.GA23977@host2.jankratochvil.net> When bfd->filename no longer contains the canonical form then we could use it as its original filename, couldn't we? No, we can't because it can be shared from cache so it may be original filename of an unrelated file. As long as bfds are shared (based on their canonical name) it does not make sense to put to bfd->filename anything besides the canonical name. So this patch solves the problem much easier. The problem is that is solves it only for executables and not for shared libraries. Does it matter? Also currently GDB code seems to use bfd->filename and its objfile->name interchangeably so I did not want to change either. Jan gdb/ 2013-09-05 Jan Kratochvil * dwarf2read.c (open_and_init_dwp_file): Initialize dwp_name, dbfd and cleanups. Try to find .dwp also before any symbolic links resolving. gdb/testsuite/ 2013-09-05 Jan Kratochvil * gdb.base/dwp-symlink.c: New file. * gdb.base/dwp-symlink.exp: New file. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4b30e6e..fab59ea 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -9643,14 +9643,25 @@ open_and_init_dwp_file (void) { struct objfile *objfile = dwarf2_per_objfile->objfile; struct dwp_file *dwp_file; - char *dwp_name; - bfd *dbfd; - struct cleanup *cleanups; + char *dwp_name = NULL; + bfd *dbfd = NULL; + struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); - dwp_name = xstrprintf ("%s.dwp", dwarf2_per_objfile->objfile->name); - cleanups = make_cleanup (xfree, dwp_name); - - dbfd = open_dwp_file (dwp_name); + if (objfile->obfd == exec_bfd && get_exec_file (0) != NULL) + { + /* Try to find .dwp for the binary file before any symbolic links + resolving. */ + dwp_name = xstrprintf ("%s.dwp", get_exec_file (1)); + make_cleanup (xfree, dwp_name); + dbfd = open_dwp_file (dwp_name); + } + if (dbfd == NULL) + { + /* Try to find .dwp for the binary file after gdb_realpath resolving. */ + dwp_name = xstrprintf ("%s.dwp", objfile->name); + make_cleanup (xfree, dwp_name); + dbfd = open_dwp_file (dwp_name); + } if (dbfd == NULL) { if (dwarf2_read_debug) diff --git a/gdb/testsuite/gdb.base/dwp-symlink.c b/gdb/testsuite/gdb.base/dwp-symlink.c new file mode 100644 index 0000000..5be12fb --- /dev/null +++ b/gdb/testsuite/gdb.base/dwp-symlink.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013 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 . */ + +int +main (int argc, char **argv) +{ + return 0; +} diff --git a/gdb/testsuite/gdb.base/dwp-symlink.exp b/gdb/testsuite/gdb.base/dwp-symlink.exp new file mode 100644 index 0000000..ad0522b --- /dev/null +++ b/gdb/testsuite/gdb.base/dwp-symlink.exp @@ -0,0 +1,77 @@ +# Copyright 2013 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 . + +standard_testfile + +if [is_remote host] { + untested "remote host" + return 0 +} + +file delete [standard_output_file ${testfile}.dwp] +if [file exists [standard_output_file ${testfile}.dwp]] { + unsupported "dwp file cannot be deleted" + return 0 +} +if { [build_executable ${testfile}.exp ${testfile} ${srcfile}] == -1 } { + return -1 +} +if ![file exists [standard_output_file ${testfile}.dwp]] { + unsupported "testsuite run does not produce dwp files" + return 0 +} + +set thelink "${testfile}-thelink" + +file delete [standard_output_file ${thelink}] +file delete [standard_output_file ${thelink}.dwp] +# file link is only Tcl 8.4+. +exec "ln" "-sf" "${testfile}" "[standard_output_file $thelink]" +if ![file exists [standard_output_file $thelink]] { + unsupported "host does not support symbolic links (binary symlink is missing)" + return 0 +} +if [file exists [standard_output_file $thelink.dwp]] { + unsupported "host does not support symbolic links (we tried to delete a file and it is still there)" + return 0 +} + +clean_restart "$testfile" + +gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary default, dwp default" + +clean_restart "$thelink" + +gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp default" + +gdb_exit +file rename [standard_output_file ${testfile}.dwp] [standard_output_file ${thelink}.dwp] +if [file exists [standard_output_file ${testfile}.dwp]] { + unsupported "host does not support symbolic links (binary symlink exists)" + return 0 +} +if ![file exists [standard_output_file ${thelink}.dwp]] { + unsupported "host does not support symbolic links (dwp symlink is missing)" + return 0 +} + +clean_restart "$testfile" + +# This case cannot work. +gdb_test "ptype main" {type = int \(\)} "binary default, dwp at symlink" + +clean_restart "$thelink" + +gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp at symlink"