From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id fs5ICtZC5mm0yiwAWB0awg (envelope-from ) for ; Mon, 20 Apr 2026 11:14:30 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Uro7ZCQC; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 08FED1E093; Mon, 20 Apr 2026 11:14:30 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (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 6C6031E093 for ; Mon, 20 Apr 2026 11:14:28 -0400 (EDT) Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id EB4CB4B7A1C9 for ; Mon, 20 Apr 2026 15:14:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EB4CB4B7A1C9 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Uro7ZCQC Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTP id 2A8884BA23DB for ; Mon, 20 Apr 2026 15:13:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2A8884BA23DB Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 2A8884BA23DB Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776698039; cv=none; b=xtMijCqLBq4bDaNJ/mWfSrvEozcEO1g27aKDDzgHjvBWNyHJjynogKjaD8tijCQvhNN8E0fmDS94YrIDp9Yt48oQi/cv5acHr7gx4aaoYHqChhNxrZWGA3SmLqFYWABWwJSd1MH04u2TVcbIY8p1KOFcpypDHSqCt/wPCYSdTck= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776698039; c=relaxed/simple; bh=UcOQ21j/12IvhVl4pU2tzMdmVWoQFBr4cZggnFwy5HA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=PEgv0jkL3SC1ELY8iAwc3iZUMZE3OpEmb+S+bD9XVpCalg/Q+dWT0fmEmeIVwNXFFmTz1p3nYDcyw0Clbw7ntfSlHDjRSNt1TGyMguQhE93L/dolSYmLZGfOSyE2o5rWpAQoGRrwjRt0+vAVuCNkGTEBKg/+TEYim+kh2+AkSBM= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2A8884BA23DB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776698038; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=UjyTohd2QEEzPFP1BQDKoNvHVMZVgcYJfBNNH0G1nak=; b=Uro7ZCQCC8oCyuXGmm6X6Q3LgeX35yarjLm6nEmmDpM8acChhSPKgebglCE0pCKa0f0kS3 cCGuzVwY2azL0jvybBSA9KV7uCNMwP02SL0W2P7U/q8iLODKtE7eRUwKVK/iri0HUKopEq vrvqA0qmi3AXPVwmmFDaRH6x9l1mL30= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-655-CjdNC8D1M9-4pBzPv6hXXA-1; Mon, 20 Apr 2026 11:13:56 -0400 X-MC-Unique: CjdNC8D1M9-4pBzPv6hXXA-1 X-Mimecast-MFC-AGG-ID: CjdNC8D1M9-4pBzPv6hXXA_1776698032 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-4411a1f9601so958741f8f.0 for ; Mon, 20 Apr 2026 08:13:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776698032; x=1777302832; h=mime-version:message-id:date:references:in-reply-to:subject:cc:to :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=UjyTohd2QEEzPFP1BQDKoNvHVMZVgcYJfBNNH0G1nak=; b=T1hwAdEmpDcmvc3K+S7C8L8F2q5x7gi0nzC4ofDyQjZ1Uc+PKWWX9Ph1WlCigV1XtM z7OYLhoo0EtEqO4kKlVMv0mUGuw0Fovf0VdkjoNZx0BHdLWPde6MWzKT9ZPYrWx2b617 xf0dUHeWd3FYm6F8F2rsOIEP4ugV8/k8vTxQ2yjO+h7WmRbk61X6BoR5af+WeSwJpYiO R4cU9fzDhAZTgcL+pflq4WPAbpxjNypG8c4DBPMZd38PKQ1vCkN/zTbItv/+JTe24evc opHEJRLxwhMJkBdc3hpR+Xq0fW2VurF8THRLV2o7uL65CC6f38iJfilTjaE7YX7sSAvj FekQ== X-Forwarded-Encrypted: i=1; AFNElJ9W2wI92HqqxpC8OTE0MMQHkwzP3mnP3cIaF27WMYTcrOpYd2IWRwEQqMyFsR7T/NEM04ZS9qlFO0KVRQ==@sourceware.org X-Gm-Message-State: AOJu0YxdEPCcFxyK3UcHoVM8S21DHD4vJ8OOYPLjl8BU/J1DhGLGaXrj OMaa7aPNACbHoRgeVlCsBMoAffEECWNnRimsqnCaqFUmuRhCSr1x7bHqSPmLPAMuOT0rstr4kE0 Gac6FsXujKAT0XRM2MnYYxn+YGryS/9NUVrntElMIGehAliqkY7chMKHT0yXTPTzRpkVQAS0= X-Gm-Gg: AeBDies96b6bA6rNo/4/cbEFJ+oTTH4bdvlC9O8OZ/r9F6WURA7fTH8YIQmsFtyPgjg J7WPyqWPm6ojZZN1MWidu2W5OnQJbZODqvzu4V8/aaWc3U/4xT3SeXfWh2yXOclUHmd5W7y9st+ ip2aDye07SPlJTWk0j2MXlNRLmfJKBMRDBiRT/uBTyTyCSuX6QmJNOPhSeCU9Q9Ru5NSApv+EbY YJ//qoz8VqH5kDJp4gOUabFB44a0bfVg7ULTZ0bEHAZ4lypjBfNzARIOqYZajsMwsxjLuSabykL yE25dOMD3KxMKaVu1VhHcg52wYwNHJo86ENSpn3yBLpFDaNTqM+0MyQV9ET68aeEfsrveYV/kAM JlaN2F85Y6bzYzdXcDr/ElfSF6Dk= X-Received: by 2002:a05:6000:1446:b0:43d:73d4:b2f with SMTP id ffacd0b85a97d-43fe3e11634mr22275940f8f.39.1776698031371; Mon, 20 Apr 2026 08:13:51 -0700 (PDT) X-Received: by 2002:a05:6000:1446:b0:43d:73d4:b2f with SMTP id ffacd0b85a97d-43fe3e11634mr22275856f8f.39.1776698030662; Mon, 20 Apr 2026 08:13:50 -0700 (PDT) Received: from localhost ([31.111.84.232]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43fe4e3a174sm33777373f8f.18.2026.04.20.08.13.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Apr 2026 08:13:50 -0700 (PDT) From: Andrew Burgess To: Guinevere Larsen , gdb-patches@sourceware.org Cc: Guinevere Larsen Subject: Re: [PATCH v6 3/3] gdb: extend the [[N]]::foo syntax for files In-Reply-To: <20251029125831.2102647-4-guinevere@redhat.com> References: <20251029125831.2102647-1-guinevere@redhat.com> <20251029125831.2102647-4-guinevere@redhat.com> Date: Mon, 20 Apr 2026 16:13:49 +0100 Message-ID: <87v7dl3brm.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: OQGauOMAQsMnX7I6WH0fjCVvJwZ7uNxX8HyCT0p8szU_1776698032 X-Mimecast-Originator: redhat.com Content-Type: text/plain 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 Guinevere Larsen writes: > This commit implements the missing support for [[N]]::'file.c'::var > syntax that was skipped on the previous commit. > > This is done by adding a new value to the global parser_state, so that > the classify_name function can restrict its search for file names to the > specified linker namespace. It had to be done this way because if the > logic was contained on the newly added "block: block COLONCOLON > FILENAME" rule, we would not have the name to rerun the search. Did you consider adding the filename to the type such that it was available within the rule to allow for the filename to be re-looked up? I'd be interested to know if this was tried, why this was worse than pushing parser state back to the lexer, which I always thought was not a great design. > Because > of that, the new rule only exists to make sure this is only used in the > intended syntax. This commit also adds a link to the solib_ops relevant > to the expression being parsed, as a way to identify if linker > namespaces are supported; this could be achieved by guarding the search > functions instead, but I think that this is more reliable. > > The new rule uses "block" rather than a linker namespace specific token, > because if we allowed that token to also reduce into block, the new rule > would never be triggered as the simple reduction would be preferred. If > we didn't allow the linker namespace to reduce into block, the rest of > the syntaxes for [[N]]::foo would be more involved, so the option in > this commit seemed like the simplest solution. > > The rule "block: block COLONCOLON name" also had to be updated because, > if a user tried to search for a file not present in the linker > namespace, GDB would miscategorize it to 'name' instead of 'filename', > and if no function of the same name was found, the error would only say > "No function \"foo\" (...)" which could confuse a user. The new error > says "Nothing named \"foo\" (...)" instead since it is impossible for us > to disambiguate between filename or function name, and both would be > valid in this code path. > > The parser_state changes were not used for the previous commit because > the lookup_symbol calls would lead to an even more intrusive change for > no real gain, since the search would be rerun any way. There is an > argument to be made that the results could be different if only > namespace had a type and another had a variable, but a situation where > that significantly changes the result is quite unlikely, I think. > --- > gdb/c-exp.y | 18 +++++++++++-- > gdb/linespec.c | 4 +-- > gdb/parse.c | 3 ++- > gdb/parser-defs.h | 32 +++++++++++++++++++++-- > gdb/rust-parse.c | 3 ++- > gdb/symtab.c | 26 +++++++++++++----- > gdb/symtab.h | 7 ++++- > gdb/testsuite/gdb.base/dlmopen-ns-ids.exp | 12 +++++++++ > 8 files changed, 90 insertions(+), 15 deletions(-) > > diff --git a/gdb/c-exp.y b/gdb/c-exp.y > index cb70bf3c863..f59aca327ed 100644 > --- a/gdb/c-exp.y > +++ b/gdb/c-exp.y > @@ -1071,6 +1071,7 @@ block : BLOCKNAME > { > $$.search_namespace = true; > $$.namespace_val = $2.val; > + pstate->set_linker_namespace ($2.val); > } > ; > > @@ -1087,12 +1088,24 @@ block : block COLONCOLON name > SEARCH_FUNCTION_DOMAIN, > nullptr); > > - if (tem.symbol == nullptr) > + if (tem.symbol == nullptr && !$$.search_namespace) > error (_("No function \"%s\" in specified context."), > copy.c_str ()); > + else if (tem.symbol == nullptr && $$.search_namespace) My yacc foo is weak, but isn't '$$' the rule's output? Which is only being set below. Shouldn't this be $1 maybe? If there's not some reason why search_namespace is being set to the correct value (that I'm missing) then this would seem to indicate that there's a gap in the testing here. > + /* COPY can be a function or a file. There is no way > + to identify which the user intended, so emit a > + generic warning instead. */ > + error (_("Nothing named \"%s\" in specified context."), > + copy.c_str ()); > $$.b_val = tem.symbol->value_block (); > $$.search_namespace = false; > } > + | block COLONCOLON FILENAME > + { > + if (!$1.search_namespace) > + error (_("Filename must be the first part of the expression")); > + $$ = $3; > + } > ; > > variable: name_not_typename ENTRY > @@ -3173,7 +3186,8 @@ classify_name (struct parser_state *par_state, const struct block *block, > || is_quoted_name) > { > /* See if it's a file name. */ > - if (auto symtab = lookup_symtab (current_program_space, copy.c_str ()); > + if (auto symtab = lookup_symtab (current_program_space, copy.c_str (), > + par_state->get_linker_namespace ()); > symtab != nullptr) > { > yylval.bval.b_val > diff --git a/gdb/linespec.c b/gdb/linespec.c > index 08f7fdd0daa..ec90ad4826a 100644 > --- a/gdb/linespec.c > +++ b/gdb/linespec.c > @@ -3633,11 +3633,11 @@ collect_symtabs_from_filename (const char *file, > if (pspace->executing_startup) > continue; > > - iterate_over_symtabs (pspace, file, collector); > + iterate_over_symtabs (pspace, file, -1, collector); > } > } > else > - iterate_over_symtabs (search_pspace, file, collector); > + iterate_over_symtabs (search_pspace, file, -1, collector); > > /* It is tempting to use the unordered_dense 'extract' method here, > and remove the separate vector -- but it's unclear if ordering > diff --git a/gdb/parse.c b/gdb/parse.c > index d76768f41d7..7358c369d52 100644 > --- a/gdb/parse.c > +++ b/gdb/parse.c > @@ -420,7 +420,8 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc, > > parser_state ps (lang, get_current_arch (), expression_context_block, > expression_context_pc, flags, *stringptr, > - completer != nullptr, tracker); > + completer != nullptr, tracker, > + current_program_space->solib_ops ()); > > scoped_restore_current_language lang_saver (lang->la_language); > > diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h > index ff4ab6a09de..c0be1083f66 100644 > --- a/gdb/parser-defs.h > +++ b/gdb/parser-defs.h > @@ -26,6 +26,7 @@ > #include "expression.h" > #include "symtab.h" > #include "expop.h" > +#include "solib.h" > > struct block; > struct language_defn; > @@ -147,7 +148,8 @@ struct parser_state : public expr_builder > parser_flags flags, > const char *input, > bool completion, > - innermost_block_tracker *tracker) > + innermost_block_tracker *tracker, > + const solib_ops *ops) > : expr_builder (lang, gdbarch), > expression_context_block (context_block), > expression_context_pc (context_pc), > @@ -157,7 +159,8 @@ struct parser_state : public expr_builder > comma_terminates ((flags & PARSER_COMMA_TERMINATES) != 0), > parse_completion (completion), > void_context_p ((flags & PARSER_VOID_CONTEXT) != 0), > - debug ((flags & PARSER_DEBUG) != 0) > + debug ((flags & PARSER_DEBUG) != 0), > + m_solib_ops (ops) > { > } > > @@ -263,6 +266,21 @@ struct parser_state : public expr_builder > push (expr::make_operation (std::move (lhs), std::move (rhs))); > } > > + void set_linker_namespace (LONGEST ns_id) > + { > + if (m_solib_ops == nullptr) > + error (_("Linker namespaces require an active inferior")); > + if (m_solib_ops->supports_namespaces ()) > + linker_namespace = ns_id; > + else > + error (_("Linker namespaces are not supported")); > + } > + > + LONGEST get_linker_namespace () This can be const. > + { > + return linker_namespace; > + } > + > /* Function called from the various parsers' yyerror functions to throw > an error. The error will include a message identifying the location > of the error within the current expression. */ > @@ -323,6 +341,16 @@ struct parser_state : public expr_builder > > /* Stack of operations. */ > std::vector m_operations; > + > + /* If the expression is being restricted to a specific namespace, this is > + where that information is stored for the block lookup. It should be > + accessed through setter/getters to ensure that the linker namespace is > + only set when the gdbarch supports it. */ > + LONGEST linker_namespace = -1; This should be renamed m_linker_namespace as it is private. Also, I couldn't find anything that would reset the linker namepsace back to -1 when parsing a complex expression. For example, something like: print [[1]]::'foo.c'::var_a + 'bar.c'::var_b After parsing the [[1]] linker_namespace will be set to '1', but is it ever reset? Will we not end up parsing the "'bar.c'::var_b" as if the lookup had to be in namespace 1? Thanks, Andrew > + > + /* Used to figure out if an inferior is capable of handling linker > + namespaces at all. */ > + const solib_ops *m_solib_ops; > }; > > /* A string token, either a char-string or bit-string. Char-strings are > diff --git a/gdb/rust-parse.c b/gdb/rust-parse.c > index b740d5a7b16..27f03b23e6a 100644 > --- a/gdb/rust-parse.c > +++ b/gdb/rust-parse.c > @@ -2315,7 +2315,8 @@ rust_lex_tests (void) > { > /* Set up dummy "parser", so that rust_type works. */ > parser_state ps (language_def (language_rust), current_inferior ()->arch (), > - nullptr, 0, 0, nullptr, 0, nullptr); > + nullptr, 0, 0, nullptr, 0, nullptr, > + current_program_space->solib_ops ()); > rust_parser parser (&ps); > > rust_lex_test_one (&parser, "", 0); > diff --git a/gdb/symtab.c b/gdb/symtab.c > index d237a5cc5d2..bbaf94e51d0 100644 > --- a/gdb/symtab.c > +++ b/gdb/symtab.c > @@ -618,6 +618,7 @@ compare_filenames_for_search (const char *filename, const char *search_name) > > void > iterate_over_symtabs (program_space *pspace, const char *name, > + LONGEST linker_ns, > gdb::function_view callback) > { > gdb::unique_xmalloc_ptr real_path; > @@ -630,20 +631,33 @@ iterate_over_symtabs (program_space *pspace, const char *name, > gdb_assert (IS_ABSOLUTE_PATH (real_path.get ())); > } > > - for (objfile &objfile : pspace->objfiles ()) > - if (objfile.map_symtabs_matching_filename (name, real_path.get (), > - callback)) > + std::vector objfiles_to_search; > + if (linker_ns >= 0) > + { > + gdb_assert (pspace->solib_ops ()->supports_namespaces ()); > + objfiles_to_search > + = get_objfiles_in_linker_namespace (linker_ns, pspace); > + } > + else > + { > + for (objfile &objf : pspace->objfiles ()) > + objfiles_to_search.push_back (&objf); > + } > + > + for (objfile *objfile : objfiles_to_search) > + if (objfile->map_symtabs_matching_filename (name, real_path.get (), > + callback)) > return; > } > > /* See symtab.h. */ > > symtab * > -lookup_symtab (program_space *pspace, const char *name) > +lookup_symtab (program_space *pspace, const char *name, LONGEST linker_ns) > { > struct symtab *result = NULL; > > - iterate_over_symtabs (pspace, name, [&] (symtab *symtab) > + iterate_over_symtabs (pspace, name, linker_ns, [&] (symtab *symtab) > { > result = symtab; > return true; > @@ -6158,7 +6172,7 @@ collect_file_symbol_completion_matches (completion_tracker &tracker, > > /* Go through symtabs for SRCFILE and check the externs and statics > for symbols which match. */ > - iterate_over_symtabs (current_program_space, srcfile, [&] (symtab *s) > + iterate_over_symtabs (current_program_space, srcfile, -1, [&] (symtab *s) > { > add_symtab_completions (s->compunit (), > tracker, mode, lookup_name, > diff --git a/gdb/symtab.h b/gdb/symtab.h > index fe2304acb4f..bda6e82da02 100644 > --- a/gdb/symtab.h > +++ b/gdb/symtab.h > @@ -2079,7 +2079,8 @@ const char *multiple_symbols_select_mode (void); > > /* Lookup a symbol table in PSPACE by source file name. */ > > -extern symtab *lookup_symtab (program_space *pspace, const char *name); > +extern symtab *lookup_symtab (program_space *pspace, const char *name, > + LONGEST linker_ns = -1); > > /* An object of this type is passed as the 'is_a_field_of_this' > argument to lookup_symbol and lookup_symbol_in_language. */ > @@ -2805,10 +2806,14 @@ bool compare_glob_filenames_for_search (const char *filename, > psymtabs. *If* there is no '/' in the name, a match after a '/' in the > symtab filename will also work. > > + If LINKER_NS is 0 or greater, only the objfiles in the provided linker > + namespace will be iterated over. > + > Call CALLBACK with each symtab that is found. If CALLBACK returns > true, the search stops. */ > > void iterate_over_symtabs (program_space *pspace, const char *name, > + LONGEST linker_ns, > gdb::function_view callback); > > std::vector find_linetable_entries_for_symtab_line > diff --git a/gdb/testsuite/gdb.base/dlmopen-ns-ids.exp b/gdb/testsuite/gdb.base/dlmopen-ns-ids.exp > index fec7adb5317..a1e18fc39d3 100644 > --- a/gdb/testsuite/gdb.base/dlmopen-ns-ids.exp > +++ b/gdb/testsuite/gdb.base/dlmopen-ns-ids.exp > @@ -325,9 +325,15 @@ proc_with_prefix test_print_namespace_symbol {} { > clean_restart > gdb_load $::binfile > > + set ns0 [ns_id_for_command 0] > set ns1 [ns_id_for_command 1] > set ns2 [ns_id_for_command 2] > > + # Test printing variables before starting the inferior > + gdb_test "print ${ns1}::gdb_dlmopen_glob" \ > + "Linker namespaces require an active inferior" \ > + "Before starting inferior" > + > if { ![runto_main] } { > return > } > @@ -365,6 +371,12 @@ proc_with_prefix test_print_namespace_symbol {} { > # returning a random one, we just say we didn't find one. > gdb_test "print gdb_dlmopen_glob" \ > "No symbol .gdb_dlmopen_glob. in the current linker namespace." > + > + # Minimal testing for finding files in namespaces. > + gdb_test "print ${ns1}::'${::srcfile_lib}'::gdb_dlmopen_glob" \ > + ".* = 2" > + gdb_test "print ${ns0}::'${::srcfile_lib}'::gdb_dlmopen_glob" \ > + "Nothing named .${::srcfile_lib}. in specified context." > } > > test_info_shared > -- > 2.51.0