public inbox for gdb@sourceware.org
 help / color / mirror / Atom feed
From: Florian Weimer <fweimer@redhat.com>
To: "H.J. Lu" <hjl.tools@gmail.com>
Cc: libc-alpha@sourceware.org,  gdb@sourceware.org,
	libc-coord@lists.openwall.com,
	 Daniel Walker <danielwa@cisco.com>
Subject: Re: [PATCH v6 2/2] Extend struct r_debug to support multiple namespaces
Date: Mon, 06 Sep 2021 11:39:08 +0200	[thread overview]
Message-ID: <874kay11s3.fsf@oldenburg.str.redhat.com> (raw)
In-Reply-To: <20210830173844.458727-3-hjl.tools@gmail.com> (H. J. Lu's message of "Mon, 30 Aug 2021 10:38:44 -0700")

* H. J. Lu:

> +* The r_version update in the debugger interface makes the glibc binary
> +  incompatible with GDB binaries built without the following commits:
> +
> +  c0154a4a21a gdb: Don't assume r_ldsomap when r_version > 1 on Linux
> +  4eb629d50d4 gdbserver: Check r_version < 1 for Linux debugger interface

Does this incompatibility happen even if audit modules and dlmopen are
not used?

> +ifeq ($(build-shared),yes)
> +# dl-debug-compat-symbols.os and dl-debug-compat-symbols.o are assembly
> +# codes included in dl-debug-symbols.S.
> +generated += dl-debug-compat-symbols.os dl-debug-compat-symbols.o
> +
> +libof-dl-debug-compat-symbols = rtld
> +
> +$(objpfx)dl-debug-compat-symbols.os: dl-debug-symbols-gen.c
> +	$(compile-command.c) -S
> +
> +$(objpfx)dl-debug-compat-symbols.o: dl-debug-symbols-gen.c
> +	$(compile-command.c) -S
> +
> +$(objpfx)dl-debug-symbols.os: $(objpfx)dl-debug-compat-symbols.os
> +$(objpfx)dl-debug-symbols.o: $(objpfx)dl-debug-compat-symbols.o
> +endif

This puts the assember output from the compiler through the
preprocessor.  That seems to be brittle.  I think you would have to
preprocess the manually written fragment separately.

However, I think we are overdesigning things here.  The following in
dl-debug-symbols-gen.c should work (and the file should have a different
name then):

/* Alias _r_debug to a prefix of _r_debug_extended.  */
asm (".set _r_debug, _r_debug_extended\n\t"
     ".type _r_debug, %object\n\t"
     ".symver _r_debug_extended, _r_debug@@" FIRST_VERSION_ld__r_debug_STRING);
#if __WORDSIZE == 64
_Static_assert (sizeof (struct r_debug) == 40, "sizeof (struct r_debug)");
asm (".size _r_debug, 40");
#else
_Static_assert (sizeof (struct r_debug) == 20, "sizeof (struct r_debug)");
asm (".size _r_debug, 20");
#endif

It's not exactly pretty, but at least it's obvious what is going on.
(Extended asm with input operands is not supported outside of functions.)

And it's not that the size of struct _r_debug is going to change.

> diff --git a/elf/dl-close.c b/elf/dl-close.c
> index f39001cab9..43873d2543 100644
> --- a/elf/dl-close.c
> +++ b/elf/dl-close.c
> @@ -709,6 +709,27 @@ _dl_close_worker (struct link_map *map, bool force)
>  	      assert (nsid != LM_ID_BASE);
>  	      ns->_ns_loaded = imap->l_next;
>  
> +	      if (ns->_ns_loaded == NULL)
> +		{
> +		  /* Remove the empty namespace from the namespace linked
> +		     list.  */
> +		  struct r_debug_extended **pp, *p;
> +
> +		  for (pp = &_r_debug_extended.r_next;
> +		       (p = *pp) != NULL;
> +		       pp = &p->r_next)
> +		    if (p == &ns->_ns_debug)
> +		      {
> +			/* Remove the empty namespace.  */
> +			*pp = p->r_next;
> +
> +			/* Clear r_version to indicate that it is
> +			   unused.  */
> +			p->base.r_version = 0;
> +			break;
> +		      }
> +		}

Is this necessary?  It makes concurrent access to the list harder and
does not save any memory.

> diff --git a/elf/rtld-debugger-interface.txt b/elf/rtld-debugger-interface.txt
> index 61bc99e4b0..f6aaa28706 100644
> --- a/elf/rtld-debugger-interface.txt
> +++ b/elf/rtld-debugger-interface.txt
> @@ -9,6 +9,9 @@ structure can be found.
>  
>  The r_debug structure contains (amongst others) the following fields:
>  
> +  int r_version:
> +    Version number for this protocol.  It should be greater than 0.
> +

It seems to me that r_version starts out as 0 and is initialized later.
Maybe this should be described here, and tested in the test case.

Thanks,
Florian


  reply	other threads:[~2021-09-06  9:39 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-30 17:38 [PATCH v6 0/2] " H.J. Lu
2021-08-30 17:38 ` [PATCH v6 1/2] Add declare_object_symbol_alias for assembly codes [BZ #28128] H.J. Lu
2021-08-30 17:38 ` [PATCH v6 2/2] Extend struct r_debug to support multiple namespaces H.J. Lu
2021-09-06  9:39   ` Florian Weimer [this message]
2021-09-06 13:19     ` H.J. Lu
2021-09-06 14:24       ` Florian Weimer
2021-09-06 14:31         ` H.J. Lu
2021-09-07 15:18           ` H.J. Lu

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=874kay11s3.fsf@oldenburg.str.redhat.com \
    --to=fweimer@redhat.com \
    --cc=danielwa@cisco.com \
    --cc=gdb@sourceware.org \
    --cc=hjl.tools@gmail.com \
    --cc=libc-alpha@sourceware.org \
    --cc=libc-coord@lists.openwall.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).