From: Simon Marchi <simark@simark.ca>
To: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>,
gdb-patches@sourceware.org,
Markus Metzger <markus.t.metzger@intel.com>
Subject: Re: [PATCH v3 09/44] gdb, gdbserver, ze: in-memory libraries
Date: Thu, 11 Dec 2025 23:13:51 -0500 [thread overview]
Message-ID: <683efcc8-2a5d-4afe-b44d-8364e6868ecd@simark.ca> (raw)
In-Reply-To: <20250801-upstream-intelgt-mvp-v3-9-59ce0f87075b@intel.com>
On 2025-08-01 05:37, Tankut Baris Aktemur wrote:
> From: Markus Metzger <markus.t.metzger@intel.com>
>
> For Intel GPU devices, device libraries live in the host memory and are
> loaded onto the device from there.
>
> Add support for reporting such in-memory shared libraries via
>
> qXfer:libraries:read
>
> and have GDB read them from target memory.
>
> Reviewed-By: Eli Zaretskii <eliz@gnu.org>
From the ROCm point of view, it seems like this might be useful if we
ever do remote debugging, since we do have these in-memory "shared
libraries".
> @@ -48309,6 +48313,10 @@ depend on the library's link-time base addresses.
> @value{GDBN} must be linked with the Expat library to support XML
> library lists. @xref{Expat}.
>
> +@value{GDBN} indicates support for in-memory library elements by
> +supplying the @code{qXfer:libraries:read:in-memory-library+}
> +@samp{qSupported} feature (@pxref{qSupported}).
> +
> A simple memory map, with one loaded library relocated by a single
> offset, looks like this:
>
Should there be an entry in the "The following values of gdbfeature
(for the packet sent by GDB) are defined:" section of the qSupported
doc? I'm a bit confused, because it seems like some values that GDB
sends along with qSupported are not listed there. Perhaps it's an
oversight and they should?
> diff --git a/gdb/features/library-list.dtd b/gdb/features/library-list.dtd
> index 66945cbe97c13cfac5a4d00e9a752ccd8419252f..baa01485af950c58e9e242229365501c043e2fe1 100644
> --- a/gdb/features/library-list.dtd
> +++ b/gdb/features/library-list.dtd
> @@ -5,12 +5,16 @@
> notice and this notice are preserved. -->
>
> <!-- library-list: Root element with versioning -->
> -<!ELEMENT library-list (library)*>
> -<!ATTLIST library-list version CDATA #FIXED "1.0">
> +<!ELEMENT library-list (library | in-memory-library)*>
> +<!ATTLIST library-list version CDATA #FIXED "1.1">
Hmm, looking at the history of this file and other .dtd files, we added
attributes and elements in the past without bumping this version number.
I guess it's not needed because we do our own checking of what the other
side supports via the qSupported packet and adjust the behavior based on
that. If not useful, I think we could keep 1.0 here for simplicity.
> @@ -246,10 +295,31 @@ target_solib_ops::current_sos () const
> for (lm_info_target_up &info : library_list)
> {
> auto &new_solib = sos.emplace_back (*this);
> + switch (info->location)
> + {
> + case lm_on_disk:
> + /* We don't need a copy of the name in INFO anymore. */
> + new_solib.name = std::move (info->name);
> + new_solib.original_name = new_solib.name;
> + break;
> +
> + case lm_in_memory:
> + if (info->end <= info->begin)
> + warning (_("bad in-memory-library location: begin=%s, end=%s"),
> + core_addr_to_string_nz (info->begin),
> + core_addr_to_string_nz (info->end));
> + else
> + {
> + new_solib.original_name = std::string ("in-memory-")
> + + core_addr_to_string_nz (info->begin)
> + + "-"
> + + core_addr_to_string_nz (info->end);
Align with parenthesis:
new_solib.original_name = (std::string ("in-memory-")
+ core_addr_to_string_nz (info->begin)
+ "-"
+ core_addr_to_string_nz (info->end));
Just a note regarding ROCm. We have a particular syntax for in-memory
objects, like this:
memory://57663#offset=0x55555562b040&size=62488
It is documented here:
https://llvm.org/docs/AMDGPUUsage.html#loaded-code-object-path-uniform-resource-identifier-uri
Currently, solib-rocm.c generates solibs with that kind of name for
in-memory objects. If we add proper support for solibs in memory, like
this patch does, we'll probably want to change solib-rocm to use that.
However, we'll want to make sure that "info shared" still shows the URIs
in the format shown above, at least for ROCm. We can cross this bridge
when we get there, but we'll need to find a way.
> - /* We don't need a copy of the name in INFO anymore. */
> - new_solib.name = std::move (info->name);
> - new_solib.original_name = new_solib.name;
> + new_solib.begin = info->begin;
> + new_solib.end = info->end;
I think I'd like to see two solib constructors, one for on-disk and one
for memory. That would make it clear what information is required in
each case.
> @@ -386,6 +456,14 @@ target_solib_ops::in_dynsym_resolve_code (CORE_ADDR pc) const
> return in_plt_section (pc);
> }
>
> +gdb_bfd_ref_ptr
> +target_solib_ops::bfd_open_from_target_memory (CORE_ADDR addr,
> + CORE_ADDR size,
> + const char *target) const
> +{
> + return gdb_bfd_open_from_target_memory (addr, size, target);
> +}
Would it make sense for this to be the default implementation
(solib_ops::bfd_open_from_target_memory)?
> @@ -488,8 +496,25 @@ solib_ops::bfd_open (const char *pathname) const
> static int
> solib_map_sections (solib &so)
> {
> - gdb::unique_xmalloc_ptr<char> filename (tilde_expand (so.name.c_str ()));
> - gdb_bfd_ref_ptr abfd (so.ops ().bfd_open (filename.get ()));
> + gdb_bfd_ref_ptr abfd;
> + if (!so.name.empty ())
> + {
> + gdb::unique_xmalloc_ptr<char> filename (tilde_expand (so.name.c_str ()));
> + abfd = so.ops ().bfd_open (filename.get ());
> + }
> + else if (so.begin != 0 && so.end != 0)
> + {
> + if (so.end <= so.begin)
> + error (_("Bad address range [%s; %s) for in-memory shared library."),
> + core_addr_to_string_nz (so.begin),
> + core_addr_to_string_nz (so.end));
Sounds like we should never end up with an solib like this, I don't
think we need to handle this case here.
> +
> + abfd = so.ops ().bfd_open_from_target_memory (so.begin,
> + so.end - so.begin,
> + gnutarget);
> + }
> + else
> + internal_error (_("bad so_list"));
This error message could be a bit prettier.
> +/* Print a qXfer:libraries:read entry for DLL. */
> +
> +static std::string
> +print_qxfer_libraries_entry (dll_info &dll)
> +{
> + switch (dll.location)
> + {
> + case dll_info::in_memory:
> + if (get_client_state ().in_memory_library_supported)
> + return string_printf
> + (" <in-memory-library begin=\"0x%s\" end=\"0x%s\">"
> + "<segment address=\"0x%s\"/></in-memory-library>\n",
> + paddress (dll.begin), paddress (dll.end),
> + paddress (dll.base_addr));
> +
> + /* GDB does not support in-memory-library. Fall back to storing it in a
> + temporary file and report that file to GDB. */
Curious, do you actually need this fallback? If not, could GDBserver
just not report these in-memory libraries if GDB is too old? If we can
avoid the complexity...
> @@ -2772,6 +2896,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
> /* We do not have any hook to indicate whether the non-SVR4 target
> backend supports qXfer:libraries:read, so always report it. */
> strcat (own_buf, ";qXfer:libraries:read+");
> + strcat (own_buf, ";qXfer:libraries:read:in-memory-library+");
So, this makes gdbserver reply "I support in memory libraries". Is it
really needed? It seems to me like it's only important for GDB to tell
gdbserver, not the other way around.
Simon
next prev parent reply other threads:[~2025-12-12 4:14 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-01 9:37 [PATCH v3 00/44] A new target to debug Intel GPUs Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 01/44] gdb, intelgt: add intelgt as a basic machine Tankut Baris Aktemur
2025-12-09 20:44 ` Simon Marchi
2025-12-19 11:13 ` Aktemur, Tankut Baris
2025-08-01 9:37 ` [PATCH v3 02/44] bfd: add intelgt target to BFD Tankut Baris Aktemur
2025-08-01 12:20 ` Jan Beulich
2025-08-08 5:03 ` Metzger, Markus T
2025-12-09 21:05 ` Simon Marchi
2025-12-19 12:46 ` Aktemur, Tankut Baris
2025-08-01 9:37 ` [PATCH v3 03/44] ld: add intelgt as a target configuration Tankut Baris Aktemur
2025-08-01 12:06 ` Jan Beulich
2025-08-08 5:03 ` Metzger, Markus T
2025-08-01 9:37 ` [PATCH v3 04/44] opcodes: add intelgt as a configuration Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 05/44] gdb, gdbserver, gdbsupport: add 'device' tag to XML target description Tankut Baris Aktemur
2025-12-09 21:27 ` Simon Marchi
2025-12-15 21:03 ` Simon Marchi
2025-12-18 15:04 ` Aktemur, Tankut Baris
2026-01-09 19:12 ` Aktemur, Tankut Baris
2026-01-09 19:34 ` Simon Marchi
2025-08-01 9:37 ` [PATCH v3 06/44] gdb, arch, intelgt: add intelgt arch definitions Tankut Baris Aktemur
2025-12-09 21:48 ` Simon Marchi
2025-12-16 15:47 ` Metzger, Markus T
2025-08-01 9:37 ` [PATCH v3 07/44] gdb, intelgt: add the target-dependent definitions for the Intel GT architecture Tankut Baris Aktemur
2025-12-11 18:53 ` Simon Marchi
2025-12-19 16:01 ` Aktemur, Tankut Baris
2025-08-01 9:37 ` [PATCH v3 08/44] gdb, intelgt: add disassemble feature " Tankut Baris Aktemur
2025-12-11 19:37 ` Simon Marchi
2025-12-23 11:03 ` Aktemur, Tankut Baris
2025-08-01 9:37 ` [PATCH v3 09/44] gdb, gdbserver, ze: in-memory libraries Tankut Baris Aktemur
2025-12-12 4:13 ` Simon Marchi [this message]
2025-12-12 11:20 ` Metzger, Markus T
2025-12-12 19:34 ` Simon Marchi
2025-12-15 13:07 ` Metzger, Markus T
2025-12-15 21:25 ` Simon Marchi
2025-08-01 9:37 ` [PATCH v3 10/44] gdb, gdbserver, rsp, ze: acknowledge libraries Tankut Baris Aktemur
2025-12-12 4:41 ` Simon Marchi
2025-12-12 14:28 ` Metzger, Markus T
2025-08-01 9:37 ` [PATCH v3 11/44] gdb, solib, ze: update target_solib_ops::bfd_open_from_target_memory Tankut Baris Aktemur
2025-12-12 4:43 ` Simon Marchi
2025-12-12 14:33 ` Metzger, Markus T
2025-08-01 9:37 ` [PATCH v3 12/44] gdb, infrun, ze: allow saving process events Tankut Baris Aktemur
2025-12-12 4:57 ` Simon Marchi
2025-12-15 13:13 ` Metzger, Markus T
2025-12-16 21:10 ` Simon Marchi
2025-12-17 9:30 ` Metzger, Markus T
2025-12-17 20:44 ` Simon Marchi
2025-12-18 7:20 ` Metzger, Markus T
2025-08-01 9:37 ` [PATCH v3 13/44] gdb, ze: add TARGET_WAITKIND_UNAVAILABLE Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 14/44] gdb, infrun, ze: handle stopping unavailable threads Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 15/44] gdb, infrun, ze: allow resuming " Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 16/44] gdb, gdbserver, ze: add U stop reply Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 17/44] gdb, gdbserver, ze: add library notification to " Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 18/44] gdbserver, ze: report TARGET_WAITKIND_UNAVAILABLE events Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 19/44] gdb, ze: handle TARGET_WAITKIND_UNAVAILABLE in stop_all_threads Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 20/44] gdb, remote: handle thread unavailability in print_one_stopped_thread Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 21/44] gdb, remote: do 'remote_add_inferior' in 'remote_notice_new_inferior' earlier Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 22/44] gdb, remote: handle a generic process PID in remote_notice_new_inferior Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 23/44] gdb, remote: handle a generic process PID in process_stop_reply Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 24/44] gdb: use the pid from inferior in setup_inferior Tankut Baris Aktemur
2025-12-12 19:51 ` Simon Marchi
2025-12-13 12:40 ` Aktemur, Tankut Baris
2025-08-01 9:37 ` [PATCH v3 25/44] gdb: revise the pid_to_exec_file target op Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 26/44] gdb: load solibs if the target does not have the notion of an exec file Tankut Baris Aktemur
2025-12-12 20:30 ` Simon Marchi
2026-01-09 19:10 ` Aktemur, Tankut Baris
2025-08-01 9:37 ` [PATCH v3 27/44] gdbserver: import AC_LIB_HAVE_LINKFLAGS macro into the autoconf script Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 28/44] gdbserver: add a pointer to the owner thread in regcache Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 29/44] gdbserver: wait for stopped threads in queue_stop_reply_callback Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 30/44] gdbserver: adjust pid after the target attaches Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 31/44] gdb: do not create a thread after a process event Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 32/44] gdb, ze: on a whole process stop, mark all threads as not_resumed Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 33/44] gdb, dwarf, ze: add DW_OP_INTEL_regval_bits Tankut Baris Aktemur
2025-08-01 12:02 ` Jan Beulich
2025-08-01 12:31 ` Metzger, Markus T
2025-08-01 12:50 ` Jan Beulich
2025-08-08 5:25 ` Metzger, Markus T
2025-08-01 9:37 ` [PATCH v3 34/44] gdbserver: allow configuring for a heterogeneous target Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 35/44] gdbserver, ze, intelgt: introduce ze-low and intel-ze-low targets Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 36/44] testsuite, sycl: add SYCL support Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 37/44] testsuite, sycl: add test for backtracing inside a kernel Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 38/44] testsuite, sycl: add test for 'info locals' and 'info args' Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 39/44] testsuite, sycl: add tests for stepping and accessing data elements Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 40/44] testsuite, sycl: add test for 1-D and 2-D parallel_for kernels Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 41/44] testsuite, sycl: add test for scheduler-locking Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 42/44] testsuite, arch, intelgt: add a disassembly test Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 43/44] testsuite, arch, intelgt: add intelgt-program-bp.exp Tankut Baris Aktemur
2025-08-01 9:37 ` [PATCH v3 44/44] testsuite, sycl: test canceling a stepping flow Tankut Baris Aktemur
2025-09-17 12:43 ` [PATCH v3 00/44] A new target to debug Intel GPUs Aktemur, Tankut Baris
2025-10-14 6:34 ` Aktemur, Tankut Baris
2025-12-08 11:32 ` Aktemur, Tankut Baris
2025-12-09 21:30 ` Simon Marchi
2025-12-19 12:52 ` Aktemur, Tankut Baris
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=683efcc8-2a5d-4afe-b44d-8364e6868ecd@simark.ca \
--to=simark@simark.ca \
--cc=gdb-patches@sourceware.org \
--cc=markus.t.metzger@intel.com \
--cc=tankut.baris.aktemur@intel.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