public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Fangrui Song <maskray@sourceware.org>
To: glibc-cvs@sourceware.org
Subject: [glibc] x86-64: Handle fewer relocation types for RTLD_BOOTSTRAP
Date: Thu, 16 Jun 2022 18:48:16 +0000 (GMT)	[thread overview]
Message-ID: <20220616184816.E45063850429@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=4ef05df5ef70ed8e71c3b9236645b8c601a0b4b4

commit 4ef05df5ef70ed8e71c3b9236645b8c601a0b4b4
Author: Fangrui Song <maskray@google.com>
Date:   Thu Jun 16 11:48:15 2022 -0700

    x86-64: Handle fewer relocation types for RTLD_BOOTSTRAP
    
    The RTLD_BOOTSTRAP branch is used to relocate ld.so itself.  It only
    needs to handle RELATIVE, GLOB_DAT, and JUMP_SLOT.  RELATIVE has been
    handled (by _ELF_DYNAMIC_DO_RELOC due to DT_RELACOUNT, or RELR), so the
    switch statement only needs to handle GLOB_DAT and JUMP_SLOT.
    
    We can drop these `#if[n]def RTLD_BOOTSTRAP` and add a large
    `# ifndef RTLD_BOOTSTRAP` instead.

Diff:
---
 sysdeps/x86_64/dl-machine.h | 32 ++++++--------------------------
 1 file changed, 6 insertions(+), 26 deletions(-)

diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
index 06c9a932b0..34766325ae 100644
--- a/sysdeps/x86_64/dl-machine.h
+++ b/sysdeps/x86_64/dl-machine.h
@@ -298,6 +298,11 @@ and creates an unsatisfiable circular dependency.\n",
 
       switch (r_type)
 	{
+	case R_X86_64_GLOB_DAT:
+	case R_X86_64_JUMP_SLOT:
+	  *reloc_addr = value;
+	  break;
+
 # ifndef RTLD_BOOTSTRAP
 #  ifdef __ILP32__
 	case R_X86_64_SIZE64:
@@ -314,29 +319,14 @@ and creates an unsatisfiable circular dependency.\n",
 	  value = sym->st_size;
 	  *reloc_addr = value + reloc->r_addend;
 	  break;
-# endif
-
-	case R_X86_64_GLOB_DAT:
-	case R_X86_64_JUMP_SLOT:
-	  *reloc_addr = value;
-	  break;
 
 	case R_X86_64_DTPMOD64:
-# ifdef RTLD_BOOTSTRAP
-	  /* During startup the dynamic linker is always the module
-	     with index 1.
-	     XXX If this relocation is necessary move before RESOLVE
-	     call.  */
-	  *reloc_addr = 1;
-# else
 	  /* Get the information from the link map returned by the
 	     resolve function.  */
 	  if (sym_map != NULL)
 	    *reloc_addr = sym_map->l_tls_modid;
-# endif
 	  break;
 	case R_X86_64_DTPOFF64:
-# ifndef RTLD_BOOTSTRAP
 	  /* During relocation all TLS symbols are defined and used.
 	     Therefore the offset is already correct.  */
 	  if (sym != NULL)
@@ -353,23 +343,19 @@ and creates an unsatisfiable circular dependency.\n",
 	      *reloc_addr = value;
 #  endif
 	    }
-# endif
 	  break;
 	case R_X86_64_TLSDESC:
 	  {
 	    struct tlsdesc volatile *td =
 	      (struct tlsdesc volatile *)reloc_addr;
 
-# ifndef RTLD_BOOTSTRAP
 	    if (! sym)
 	      {
 		td->arg = (void*)reloc->r_addend;
 		td->entry = _dl_tlsdesc_undefweak;
 	      }
 	    else
-# endif
 	      {
-# ifndef RTLD_BOOTSTRAP
 #  ifndef SHARED
 		CHECK_STATIC_TLS (map, sym_map);
 #  else
@@ -381,7 +367,6 @@ and creates an unsatisfiable circular dependency.\n",
 		  }
 		else
 #  endif
-# endif
 		  {
 		    td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
 				      + reloc->r_addend);
@@ -392,13 +377,9 @@ and creates an unsatisfiable circular dependency.\n",
 	  }
 	case R_X86_64_TPOFF64:
 	  /* The offset is negative, forward from the thread pointer.  */
-# ifndef RTLD_BOOTSTRAP
 	  if (sym != NULL)
-# endif
 	    {
-# ifndef RTLD_BOOTSTRAP
 	      CHECK_STATIC_TLS (map, sym_map);
-# endif
 	      /* We know the offset of the object the symbol is contained in.
 		 It is a negative value which will be added to the
 		 thread pointer.  */
@@ -416,7 +397,6 @@ and creates an unsatisfiable circular dependency.\n",
 	    }
 	  break;
 
-# ifndef RTLD_BOOTSTRAP
 	case R_X86_64_64:
 	  /* value + r_addend may be > 0xffffffff and R_X86_64_64
 	     relocation updates the whole 64-bit entry.  */
@@ -481,7 +461,7 @@ and creates an unsatisfiable circular dependency.\n",
 	default:
 	  _dl_reloc_bad_type (map, r_type, 0);
 	  break;
-# endif
+# endif /* !RTLD_BOOTSTRAP */
 	}
     }
 }


                 reply	other threads:[~2022-06-16 18:48 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20220616184816.E45063850429@sourceware.org \
    --to=maskray@sourceware.org \
    --cc=glibc-cvs@sourceware.org \
    /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).