From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25751 invoked by alias); 20 Aug 2012 15:08:04 -0000 Received: (qmail 25693 invoked by uid 22791); 20 Aug 2012 15:08:00 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS,TW_BJ,TW_CP 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; Mon, 20 Aug 2012 15:07:39 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q7KF7aGu002217 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 20 Aug 2012 11:07:36 -0400 Received: from host2.jankratochvil.net (ovpn-116-37.ams2.redhat.com [10.36.116.37]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q7KF7VWT001811 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 20 Aug 2012 11:07:33 -0400 Date: Mon, 20 Aug 2012 15:08:00 -0000 From: Jan Kratochvil To: Eli Zaretskii Cc: Joel Brobecker , gdb-patches@sourceware.org Subject: Re: GDB 7.5: Problems with the auto-load safe-path feature Message-ID: <20120820150725.GA2310@host2.jankratochvil.net> References: <83d32ogz3g.fsf@gnu.org> <20120818161049.GI2798@adacore.com> <834no0gmca.fsf@gnu.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <834no0gmca.fsf@gnu.org> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 2012-08/txt/msg00543.txt.bz2 On Sat, 18 Aug 2012 19:07:49 +0200, Eli Zaretskii wrote: > Like in the patch below? I can drop the #ifdef, if no one objects (it > could surprise Unix users who call their programs FOO.exe for some > reason). Yes, Joel also was for dropping the #ifdef. Also I believe GDB should test the .exe-less filenames even in 'set auto-load scripts-directory' entries. What about the patch below? Going to run a regression test (but auto-load does not have testcases). Thanks, Jan > --- gdb/auto-load.c~ 2012-08-18 15:47:48.953125000 +0300 > +++ gdb/auto-load.c 2012-08-18 19:44:20.859375000 +0300 > @@ -708,20 +708,6 @@ auto_load_objfile_script (struct objfile > > @@ -735,6 +721,29 @@ auto_load_objfile_script (struct objfile > fprintf_unfiltered (gdb_stdlog, _("auto-load: Attempted file \"%s\" %s.\n"), > debugfile, input ? _("exists") : _("does not exist")); > > +#if defined (__MSDOS__) || defined (__MINGW32__) > + /* For Windows/DOS .exe executables, strip the .exe suffix, so that > + FOO-gdb.gdb could be used for FOO.exe, and try again. */ > + if (!input) > + { > + const size_t lexe = sizeof (".exe") - 1; > + > + if (len > lexe > + && strcasecmp (realname + len - lexe, ".exe") == 0) > + { > + len -= lexe; > + realname[len] = '\0'; > + filename = xrealloc (filename, len + strlen (language->suffix) + 1); Here is a bug, former FILENAME is already registered for xfree in cleanups. > + memcpy (filename, realname, len); > + strcpy (filename + len, language->suffix); > + input = fopen (filename, "r"); > + debugfile = filename; > + if (debug_auto_load) > + fprintf_unfiltered (gdb_stdlog, _("auto-load: Attempted file \"%s\" %s.\n"), > + debugfile, input ? _("exists") : _("does not exist")); > + } > + } > +#endif > if (!input) > { > VEC (char_ptr) *vec; gdb/ 2012-08-20 Eli Zaretskii Jan Kratochvil * auto-load.c (auto_load_objfile_script): Rename to ... (auto_load_objfile_script_1): ... here, change variable realname to parameter realname, document it, add return value, add variable retval. (auto_load_objfile_script): New function. gdb/doc/ 2012-08-20 Jan Kratochvil * gdb.texinfo (objfile-gdb.py file): New paragraph for .exe stripping. diff --git a/gdb/auto-load.c b/gdb/auto-load.c index 03a7539..f1cb5f8 100644 --- a/gdb/auto-load.c +++ b/gdb/auto-load.c @@ -693,27 +693,25 @@ clear_section_scripts (void) } } -/* Look for the auto-load script in LANGUAGE associated with OBJFILE and load - it. */ +/* Look for the auto-load script in LANGUAGE associated with OBJFILE where + OBJFILE's gdb_realpath is REALNAME and load it. Return 1 if we found any + matching script, return 0 otherwise. */ -void -auto_load_objfile_script (struct objfile *objfile, - const struct script_language *language) +static int +auto_load_objfile_script_1 (struct objfile *objfile, const char *realname, + const struct script_language *language) { - char *realname; char *filename, *debugfile; - int len; + int len, retval; FILE *input; struct cleanup *cleanups; - realname = gdb_realpath (objfile->name); len = strlen (realname); filename = xmalloc (len + strlen (language->suffix) + 1); memcpy (filename, realname, len); strcpy (filename + len, language->suffix); cleanups = make_cleanup (xfree, filename); - make_cleanup (xfree, realname); input = fopen (filename, "r"); debugfile = filename; @@ -768,6 +766,44 @@ auto_load_objfile_script (struct objfile *objfile, and these scripts are required to be idempotent under multiple loads anyway. */ language->source_script_for_objfile (objfile, input, debugfile); + + retval = 1; + } + else + retval = 0; + + do_cleanups (cleanups); + return retval; +} + +/* Look for the auto-load script in LANGUAGE associated with OBJFILE and load + it. */ + +void +auto_load_objfile_script (struct objfile *objfile, + const struct script_language *language) +{ + char *realname = gdb_realpath (objfile->name); + struct cleanup *cleanups = make_cleanup (xfree, realname); + + if (!auto_load_objfile_script_1 (objfile, realname, language)) + { + /* For Windows/DOS .exe executables, strip the .exe suffix, so that + FOO-gdb.gdb could be used for FOO.exe, and try again. */ + + size_t len = strlen (realname); + const size_t lexe = sizeof (".exe") - 1; + + if (len > lexe && strcasecmp (realname + len - lexe, ".exe") == 0) + { + len -= lexe; + realname[len] = '\0'; + if (debug_auto_load) + fprintf_unfiltered (gdb_stdlog, _("auto-load: Stripped .exe suffix, " + "retrying with \"%s\".\n"), + realname); + auto_load_objfile_script_1 (objfile, realname, language); + } } do_cleanups (cleanups); diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 08ba92d..66e217e 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -25765,6 +25765,13 @@ If this file does not exist, then @value{GDBN} will look for Note that loading of this script file also requires accordingly configured @code{auto-load safe-path} (@pxref{Auto-loading safe path}). +For object files using @file{.exe} suffix @value{GDBN} tries to load first the +scripts normally according to its @file{.exe} filename. But if no scripts are +found @value{GDBN} also tries script filenames matching the object file without +its @file{.exe} suffix. This @file{.exe} stripping is case insensitive and it +is attempted on any platform. This makes the script filenames compatible +between Unix and MS-Windows hosts. + @table @code @anchor{set auto-load scripts-directory} @kindex set auto-load scripts-directory