From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9496 invoked by alias); 4 Jul 2010 10:19:03 -0000 Received: (qmail 9485 invoked by uid 22791); 4 Jul 2010 10:19:02 -0000 X-SWARE-Spam-Status: No, hits=-5.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,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; Sun, 04 Jul 2010 10:18:57 +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 o64AIiwM030121 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 4 Jul 2010 06:18:44 -0400 Received: from host0.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 o64AIgof018868 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 4 Jul 2010 06:18:44 -0400 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.4/8.14.4) with ESMTP id o64AIgSw006050; Sun, 4 Jul 2010 12:18:42 +0200 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.4/8.14.4/Submit) id o64AIg3d006049; Sun, 4 Jul 2010 12:18:42 +0200 Date: Sun, 04 Jul 2010 10:19:00 -0000 From: Jan Kratochvil To: Joel Brobecker Cc: gdb-patches@sourceware.org Subject: Re: ping: [patch 5/6] testsuite: Fix prelink-support.exp without prelink installed Message-ID: <20100704101842.GE6875@host0.dyn.jankratochvil.net> References: <20100329161831.GD2940@host0.dyn.jankratochvil.net> <20100609150954.GE7183@host0.dyn.jankratochvil.net> <20100629220904.GV2595@adacore.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100629220904.GV2595@adacore.com> 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/msg00069.txt.bz2 On Wed, 30 Jun 2010 00:09:04 +0200, Joel Brobecker wrote: > I'm just concerned about matching the output > from the prelink command, since it is assuming that it is going to > be in English. Do you know if we force the language in the testsuite? GDB testsuite does not force English, neither dejagnu. But TCL seems to ignore locale: $ LANG=cs_CZ LC_ALL=cs_CZ tclsh % exec /foo couldn't execute "/foo": no such file or directory Which may match: 3/30/99 (bug fix) Tcl no longer calls setlocale(). It looks at env(LANG) and env(LC_TYPE) instead. (stanton) And some tcl grepping of sources I have done now. (tcl8.5.8-src.tar.gz) sprintf(errSpace, "%dcouldn't execute \"%.150s\": ", errno, argv[0]); - no _() / gettext() there. > I'm just wondering whether a more straightforward/brutal approach might > be simpler and as effective: What if we searched for prelink in the PATH > and skipped the entire test if not found? There is explicitly executed /usr/sbin/prelink because on some systems /usr/sbin is not in the default non-root $PATH. This also fixes: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=225783 http://cvs.fedoraproject.org/viewvc/rpms/gdb/F-13/gdb-6.6-bz225783-prelink-path.patch?content-type=text%2Fplain&view=co = gdb.base/prelink.exp: prelink -> /usr/sbin/prelink It is true I did not ask if it is cross-OS compatible enough (Debian is OK). Do you suggest /usr/sbin/prelink existence check, $PATH search (with explicitly appended `/usr/sbin') or the current error message check? Thanks, Jan gdb/testsuite/ 2010-07-04 Jan Kratochvil Joel Brobecker Cope with missing /usr/sbin/prelink. * lib/prelink-support.exp (prelink_no): : New. (prelink_yes): Likewise. Return on failed prelink_no. --- a/gdb/testsuite/lib/prelink-support.exp +++ b/gdb/testsuite/lib/prelink-support.exp @@ -187,6 +187,30 @@ proc prelink_no {arg {name {}}} { set result [catch $command output] verbose -log "result is $result" verbose -log "output is $output" + if {$result == 1 && [regexp {^(couldn't execute "/usr/sbin/prelink[^\r\n]*": no such file or directory\n?)*$} $output]} { + # Without prelink, at least verify that all the binaries do not + # contain the ".gnu.prelink_undo" section (which would mean that they + # have already been prelinked). + set test "$test (missing /usr/sbin/prelink)" + foreach bin [split $arg] { + if [string match "-*" $bin] { + # Skip prelink options. + continue + } + set readelf_program [transform readelf] + set command "exec $readelf_program -WS $bin" + verbose -log "command is $command" + set result [catch $command output] + verbose -log "result is $result" + verbose -log "output is $output" + if {$result != 0 || [string match {* .gnu.prelink_undo *} $output]} { + fail "$test ($bin is already prelinked)" + return 0 + } + } + pass $test + return 1 + } if {$result == 0 && $output == ""} { verbose -log "$name has been now unprelinked" set command "exec /usr/sbin/prelink -uN $arg" @@ -217,7 +241,9 @@ proc prelink_yes {arg {name ""}} { # Try to unprelink it first so that, if it has been already prelinked # before, we get a different address now, making the new result unaffected # by any previous prelinking. - prelink_no $arg "$name pre-unprelink" + if ![prelink_no $arg "$name pre-unprelink"] { + return 0 + } set test "prelink $name" @@ -239,6 +265,19 @@ proc prelink_yes {arg {name ""}} { set result [catch $command output] verbose -log "result is $result" verbose -log "output is $output" + if {$result == 1 && [regexp {^(couldn't execute "/usr/sbin/prelink[^\r\n]*": no such file or directory\n?)*$} $output]} { + set test "$test (missing /usr/sbin/prelink)" + + # We could not find prelink. We could check whether $args is already + # prelinked but we don't, because: + # - It is unlikely that someone uninstalls prelink after having + # prelinked the system ld.so; + # - We still cannot change its prelinked address. + # Therefore, we just skip the test. + + xfail $test + return 0 + } if {$result == 0 && $output == ""} { pass $test return 1