public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Aaron Merey <amerey@redhat.com>
To: tom@tromey.com
Cc: gdb-patches@sourceware.org, Aaron Merey <amerey@redhat.com>
Subject: Re: [PATCH] gdb: Try searching for auto-load script using .gnu_debuglink
Date: Tue,  8 Mar 2022 17:41:36 -0500	[thread overview]
Message-ID: <20220308224136.173615-1-amerey@redhat.com> (raw)
In-Reply-To: <87o82lu2xy.fsf@tromey.com>

Hi Tom,

On Fri, Mar 4, 2022 at 10:56 AM Tom Tromey <tom@tromey.com> wrote:
> Aaron> +      char *debuglink = bfd_get_debug_link_info (parent->obfd, &crc32);
>
> bfd_get_debug_link_info says it returns a malloc'd pointer, so I think
> this is a memory leak.  Using gdb::unique_xmalloc_ptr<char> would solve
> this.

Fixed, thanks.

Aaron

---
 gdb/auto-load.c | 64 +++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 52 insertions(+), 12 deletions(-)

diff --git a/gdb/auto-load.c b/gdb/auto-load.c
index 9a1ccec87ce..0acf2cee777 100644
--- a/gdb/auto-load.c
+++ b/gdb/auto-load.c
@@ -51,6 +51,9 @@
    followed by the path of a python script to load.  */
 #define AUTO_SECTION_NAME ".debug_gdb_scripts"
 
+/* The section to look in for the name of a separate debug file.  */
+#define DEBUGLINK_SECTION_NAME ".gnu_debuglink"
+
 static void maybe_print_unsupported_script_warning
   (struct auto_load_pspace_info *, struct objfile *objfile,
    const struct extension_language_defn *language,
@@ -823,24 +826,61 @@ auto_load_objfile_script (struct objfile *objfile,
   gdb::unique_xmalloc_ptr<char> realname
     = gdb_realpath (objfile_name (objfile));
 
-  if (!auto_load_objfile_script_1 (objfile, realname.get (), language))
+  if (auto_load_objfile_script_1 (objfile, realname.get (), language))
+    return;
+
+  /* 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.get ());
+  const size_t lexe = sizeof (".exe") - 1;
+
+  if (len > lexe && strcasecmp (realname.get () + len - lexe, ".exe") == 0)
     {
-      /* For Windows/DOS .exe executables, strip the .exe suffix, so that
-	 FOO-gdb.gdb could be used for FOO.exe, and try again.  */
+      len -= lexe;
+      realname.get ()[len] = '\0';
+
+      auto_load_debug_printf
+	("auto-load: Stripped .exe suffix, retrying with \"%s\".",
+	 realname.get ());
+
+      auto_load_objfile_script_1 (objfile, realname.get (), language);
+      return;
+    }
 
-      size_t len = strlen (realname.get ());
-      const size_t lexe = sizeof (".exe") - 1;
+  /* If OBJFILE is a separate debug file and its name does not match
+     the name given in the parent's .gnu_debuglink section, try to
+     find the auto-load script using the parent's path and the
+     debuglink name.  */
+
+  struct objfile *parent = objfile->separate_debug_objfile_backlink;
+  if (parent != nullptr)
+    {
+      unsigned long crc32;
+      gdb::unique_xmalloc_ptr<char> debuglink
+	(bfd_get_debug_link_info (parent->obfd, &crc32));
 
-      if (len > lexe && strcasecmp (realname.get () + len - lexe, ".exe") == 0)
+      if (debuglink.get () != nullptr
+	  && strcmp (debuglink.get (), basename (realname.get ())) != 0)
 	{
-	  len -= lexe;
-	  realname.get ()[len] = '\0';
+	  /* Replace the last component of the parent's path with the
+	     debuglink name.  */
 
-	  auto_load_debug_printf
-	    ("auto-load: Stripped .exe suffix, retrying with \"%s\".",
-	     realname.get ());
+	  std::string p_realname = gdb_realpath (objfile_name (parent)).get ();
+	  size_t last = p_realname.find_last_of ('/');
 
-	  auto_load_objfile_script_1 (objfile, realname.get (), language);
+	  if (last != std::string::npos)
+	    {
+	      p_realname.replace (last + 1, std::string::npos,
+				  debuglink.get ());
+
+	      auto_load_debug_printf
+		("Debug filename mismatch, retrying with \"%s\".",
+		 p_realname.c_str ());
+
+	      auto_load_objfile_script_1 (objfile,
+					  p_realname.c_str (), language);
+	    }
 	}
     }
 }
-- 
2.35.1


  reply	other threads:[~2022-03-08 22:41 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-23  3:35 Aaron Merey
2022-03-04 15:56 ` Tom Tromey
2022-03-08 22:41   ` Aaron Merey [this message]
2022-03-09  0:26     ` Tom Tromey
2022-03-09  1:42       ` Aaron Merey
2022-03-10 17:57     ` Pedro Alves
2022-03-10 20:16       ` Aaron Merey
2022-03-10 20:22         ` Aaron Merey
2022-03-10 20:43           ` Tom Tromey
2022-03-11  9:32           ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220308224136.173615-1-amerey@redhat.com \
    --to=amerey@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).