From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3765 invoked by alias); 20 Jul 2010 21:45:08 -0000 Received: (qmail 3749 invoked by uid 22791); 20 Jul 2010 21:45:06 -0000 X-SWARE-Spam-Status: No, hits=-5.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_BJ,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 20 Jul 2010 21:44:56 +0000 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o6KLit0i013223 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 20 Jul 2010 17:44:55 -0400 Received: from host1.dyn.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o6KLiq4N015854 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 20 Jul 2010 17:44:54 -0400 Received: from host1.dyn.jankratochvil.net (localhost [127.0.0.1]) by host1.dyn.jankratochvil.net (8.14.4/8.14.4) with ESMTP id o6KLiprk018337 for ; Tue, 20 Jul 2010 23:44:51 +0200 Received: (from jkratoch@localhost) by host1.dyn.jankratochvil.net (8.14.4/8.14.4/Submit) id o6KLipMj018335 for gdb-patches@sourceware.org; Tue, 20 Jul 2010 23:44:51 +0200 Date: Tue, 20 Jul 2010 21:45:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patch] Fix internal error on library without dirname Message-ID: <20100720214451.GA28276@host1.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-12-10) X-IsSubscribed: yes 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 X-SW-Source: 2010-07/txt/msg00321.txt.bz2 Hi, in some special cases ld.so can provide library name without any slash (/). Starting program: [...] ../../gdb/symfile.c:1326: internal-error: find_separate_debug_file_by_debuglink: Assertion `i >= 0 && IS_DIR_SEPARATOR (dir[i])' failed. A problem internal to GDB has been detected, No regressions on {x86_64,x86_64-m32,i686}-fedora13-linux-gnu. I believe it could go for 7.2. I tried to step through find_separate_debug_file_by_debuglink in this case and the code seems OK with DIR eq "". Thanks, Jan gdb/ 2010-07-20 Jan Kratochvil * symfile.c (find_separate_debug_file_by_debuglink): Remove a gdb_assert call, new comment. gdb/testsuite/ 2010-07-20 Jan Kratochvil * gdb.base/solib-nodir.exp: New file. * lib/gdb.exp (runto): New case for a GDB internal error. --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1382,7 +1382,7 @@ find_separate_debug_file_by_debuglink (struct objfile *objfile) if (IS_DIR_SEPARATOR (dir[i])) break; } - gdb_assert (i >= 0 && IS_DIR_SEPARATOR (dir[i])); + /* If I is -1 then no directory is present there and DIR will be "". */ dir[i+1] = '\0'; /* Set I to max (strlen (canon_name), strlen (dir)). */ --- /dev/null +++ b/gdb/testsuite/gdb.base/solib-nodir.exp @@ -0,0 +1,54 @@ +# Copyright 2010 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 . */ + +# are we on a target board +if {![isnative] || [skip_shlib_tests]} { + return +} + +set testfile "solib-nodir" +# Arbitrary file, possibly not containing main, even an empty one. +set srclibfile foo.c +# Arbitrary file containing main. +set srcfile start.c +set binlibfilebase ${testfile}.so +set binlibfiledir ${objdir}/${subdir} +set binlibfile ${binlibfiledir}/${binlibfilebase} +set executable ${testfile} +set objfile ${objdir}/${subdir}/${executable}.o +set binfile ${objdir}/${subdir}/${executable} + +# build the first test case +if { [get_compiler_info unused] + || [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" "${binlibfile}" [list debug additional_flags=-Wl,-soname,${binlibfilebase}]] != "" + || [gdb_gnu_strip_debug $binlibfile] + || [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != "" + || [gdb_compile "${objfile} ${binlibfile}" "${binfile}" executable {}] != "" } { + untested ${testfile}.exp + return -1 +} + +clean_restart $executable +gdb_load_shlibs ${binlibfile} + +gdb_test_no_output "set env LD_LIBRARY_PATH=:" +gdb_test "cd ${binlibfiledir}" "Working directory [string_to_regexp ${binlibfiledir}]\\." + +set test "library loaded" +if [runto_main] { + pass $test +} else { + fail $test +} --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -423,6 +423,11 @@ proc runto { function args } { unsupported "Non-stop mode not supported" return 0 } + -re ".*A problem internal to GDB has been detected" { + fail "running to $function in runto (GDB internal error)" + gdb_internal_error_resync + return 0 + } -re "$gdb_prompt $" { fail "running to $function in runto" return 0