From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 8IizJCvxB2a7ExwAWB0awg (envelope-from ) for ; Sat, 30 Mar 2024 07:02:03 -0400 Received: by simark.ca (Postfix, from userid 112) id 80CED1E0C0; Sat, 30 Mar 2024 07:02:03 -0400 (EDT) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 5BEED1E030 for ; Sat, 30 Mar 2024 07:02:01 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E36BC3858C3A for ; Sat, 30 Mar 2024 11:02:00 +0000 (GMT) Received: from lndn.lancelotsix.com (lndn.lancelotsix.com [51.195.220.111]) by sourceware.org (Postfix) with ESMTPS id 37E223858D20 for ; Sat, 30 Mar 2024 11:01:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 37E223858D20 Authentication-Results: sourceware.org; dmarc=fail (p=quarantine dis=none) header.from=amd.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=amd.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 37E223858D20 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=51.195.220.111 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711796502; cv=none; b=ryG2GlVXWlI8/59RNQGZ7fQ1SX09kawGGERS/K/LlPi4mprSu6d3Hcl1jQdu/B9Oy0XMoyc2Hevd4cge2BWkW3pbdlVjzHB78W9+MwCEFU5HTBkDh1oqs05wrlkiNvaNz5oJkknZXuT7PryyfM8EfhhrTf7Ch4iU8E/eWMnlyjk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711796502; c=relaxed/simple; bh=3VpI/VA07xwDeDSj+MAfqjtsDuHFhYr1j4J6NWeZgN8=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=R5QEDBto79g0Tr5DMqzdWmWJ4atgqTEUXj1JzbW3kywgRRIVokA9W1NX3Kwv6MMgUxYxf2r40x3lzK5FJlD8pSWvm0gI/HgzSXj5xMkvWeKoSiFy1Wac+HSUy2gKmbchsb0x4LMZa4ncaLX1UrYhvfReqoicEISmCbrBkWlclcQ= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from octopus.lan (cust120-dsl54.idnet.net [212.69.54.120]) by lndn.lancelotsix.com (Postfix) with ESMTPSA id 995B780B16; Sat, 30 Mar 2024 11:01:37 +0000 (UTC) From: Lancelot SIX To: gdb-patches@sourceware.org Cc: Lancelot SIX Subject: [PATCH] gdb: ensure has dwarf info before reading DWZ file Date: Sat, 30 Mar 2024 11:01:21 +0000 Message-Id: <20240330110121.2292510-1-lancelot.six@amd.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.6.2 (lndn.lancelotsix.com [0.0.0.0]); Sat, 30 Mar 2024 11:01:37 +0000 (UTC) X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_QUARANTINE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org I recent change (e9b738dfbdc "Avoid race when reading dwz file") moved the call to dwarf2_read_dwz_file from dwarf2_initialize_objfile to dwarf2_has_info. Before that patch, dwarf2_initialize_objfile was only called when dwarf2_has_info returned true, and since that patch it is always called. When reading a file that has no debug info (.debug_info/.debug_abbrev sections), but has a .gnu_debugaltlink section, GDB’s behavior is different. I can observe this when loading /lib/x86_64-linux-gnu/libtinfo.so on Ubuntu 22.04 (or while debugging any program dynamically loading this library). Before e9b738dfbdc, we had: $ ./gdb/gdb -data-directory ./gdb/data-directory -q /lib/x86_64-linux-gnu/libtinfo.so Reading symbols from /lib/x86_64-linux-gnu/libtinfo.so... (No debugging symbols found in /lib/x86_64-linux-gnu/libtinfo.so) (gdb) while after we have: $ ./gdb/gdb -data-directory ./gdb/data-directory -q /lib/x86_64-linux-gnu/libtinfo.so Reading symbols from /lib/x86_64-linux-gnu/libtinfo.so... warning: could not find '.gnu_debugaltlink' file for /usr/lib/x86_64-linux-gnu/libtinfo.so.6.3 (No debugging symbols found in /lib/x86_64-linux-gnu/libtinfo.so) (gdb) This patch restores the previous behavior of only trying to load the DWZ file for objfiles when the main part of the debuginfo is present (i.e. when dwarf2_has_info returns true). We still make sure that dwarf2_read_dwz_file is called at most once per objfile. A consequence of this change is that the per_bfd->dwz_file optional object can now remain empty (instead of containing a nullptr), so also this patch also adjusts dwarf2_get_dwz_file to account for this possibility. This effectively reverts the changes to dwarf2_get_dwz_file done by e9b738dfbdc. Regression tested on x86_64-linux-gnu Ubuntu 22.04. --- gdb/dwarf2/dwz.c | 13 +++++++++---- gdb/dwarf2/read.c | 36 +++++++++++++++++++----------------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/gdb/dwarf2/dwz.c b/gdb/dwarf2/dwz.c index 1eb4816fb47..c7cdba24076 100644 --- a/gdb/dwarf2/dwz.c +++ b/gdb/dwarf2/dwz.c @@ -282,9 +282,14 @@ dwarf2_read_dwz_file (dwarf2_per_objfile *per_objfile) struct dwz_file * dwarf2_get_dwz_file (dwarf2_per_bfd *per_bfd, bool require) { - gdb_assert (per_bfd->dwz_file.has_value ()); - dwz_file *result = per_bfd->dwz_file->get (); - if (require && result == nullptr) - error (_("could not read '.gnu_debugaltlink' section")); + gdb_assert (!require || per_bfd->dwz_file.has_value ()); + + dwz_file *result = nullptr; + if (per_bfd->dwz_file.has_value ()) + { + result = per_bfd->dwz_file->get (); + if (require && result == nullptr) + error (_("could not read '.gnu_debugaltlink' section")); + } return result; } diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 31313bc88b3..9e37011ddf0 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -1362,11 +1362,11 @@ dwarf2_has_info (struct objfile *objfile, return false; dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile); + bool just_created = false; if (per_objfile == NULL) { dwarf2_per_bfd *per_bfd; - bool just_created = false; /* We can share a "dwarf2_per_bfd" with other objfiles if the BFD doesn't require relocations. @@ -1398,27 +1398,29 @@ dwarf2_has_info (struct objfile *objfile, } per_objfile = dwarf2_objfile_data_key.emplace (objfile, objfile, per_bfd); + } + + const bool has_info = (!per_objfile->per_bfd->info.is_virtual + && per_objfile->per_bfd->info.s.section != nullptr + && !per_objfile->per_bfd->abbrev.is_virtual + && per_objfile->per_bfd->abbrev.s.section != nullptr); - if (just_created) + if (just_created && has_info) + { + /* Try to fetch any potential dwz file early, while still on + the main thread. Also, be sure to do it just once per + BFD, to avoid races. */ + try { - /* Try to fetch any potential dwz file early, while still on - the main thread. Also, be sure to do it just once per - BFD, to avoid races. */ - try - { - dwarf2_read_dwz_file (per_objfile); - } - catch (const gdb_exception_error &err) - { - warning (_("%s"), err.what ()); - } + dwarf2_read_dwz_file (per_objfile); + } + catch (const gdb_exception_error &err) + { + warning (_("%s"), err.what ()); } } - return (!per_objfile->per_bfd->info.is_virtual - && per_objfile->per_bfd->info.s.section != NULL - && !per_objfile->per_bfd->abbrev.is_virtual - && per_objfile->per_bfd->abbrev.s.section != NULL); + return has_info; } /* See declaration. */ base-commit: 13ed3225004896142dcb0fbe24411b66f17dfc8e -- 2.34.1