public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Szabolcs Nagy <nsz@sourceware.org>
To: glibc-cvs@sourceware.org
Subject: [glibc/nsz/bug23293] elf: Move post-relocation code of _dl_start into _dl_start_final
Date: Wed,  4 May 2022 06:00:47 +0000 (GMT)	[thread overview]
Message-ID: <20220504060047.3F32E3857815@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=1305edd42c44fee6f8660734d2dfa4911ec755d6

commit 1305edd42c44fee6f8660734d2dfa4911ec755d6
Author: Fangrui Song <maskray@google.com>
Date:   Mon Apr 25 10:30:26 2022 -0700

    elf: Move post-relocation code of _dl_start into _dl_start_final
    
    On non-PI_STATIC_AND_HIDDEN architectures, getting the address of
    _rtld_local_ro (for GLRO (dl_final_object)) goes through a GOT entry.
    The GOT load may be reordered before self relocation, leading to an
    unrelocated/incorrect _rtld_local_ro address.
    
    84e02af1ebc9988126eebe60bf19226cea835623 tickled GCC powerpc32 to
    reorder the GOT load before relative relocations, leading to ld.so
    crash. This is similar to the m68k jump table reordering issue fixed by
    a8e9b5b8079d18116ca69c9797e77804ecf2ee7e.
    
    Move code after self relocation into _dl_start_final to avoid the
    reordering. This fixes powerpc32 and may help other architectures when
    ELF_DYNAMIC_RELOCATE is simplified in the future.

Diff:
---
 elf/rtld.c | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/elf/rtld.c b/elf/rtld.c
index 19e328f89e..93180466d6 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -468,6 +468,10 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
 {
   ElfW(Addr) start_addr;
 
+  /* Do not use an initializer for these members because it would
+     intefere with __rtld_static_init.  */
+  GLRO (dl_find_object) = &_dl_find_object;
+
   /* If it hasn't happen yet record the startup time.  */
   rtld_timer_start (&start_time);
 #if !defined DONT_USE_BOOTSTRAP_MAP
@@ -512,7 +516,10 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
       print_statistics (RTLD_TIMING_REF(rtld_total_time));
     }
 
-  return start_addr;
+#ifndef ELF_MACHINE_START_ADDRESS
+# define ELF_MACHINE_START_ADDRESS(map, start) (start)
+#endif
+  return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, start_addr);
 }
 
 #ifdef DONT_USE_BOOTSTRAP_MAP
@@ -586,23 +593,11 @@ _dl_start (void *arg)
 
   __rtld_malloc_init_stubs ();
 
-  /* Do not use an initializer for these members because it would
-     intefere with __rtld_static_init.  */
-  GLRO (dl_find_object) = &_dl_find_object;
-
-  {
 #ifdef DONT_USE_BOOTSTRAP_MAP
-    ElfW(Addr) entry = _dl_start_final (arg);
+  return _dl_start_final (arg);
 #else
-    ElfW(Addr) entry = _dl_start_final (arg, &info);
+  return _dl_start_final (arg, &info);
 #endif
-
-#ifndef ELF_MACHINE_START_ADDRESS
-# define ELF_MACHINE_START_ADDRESS(map, start) (start)
-#endif
-
-    return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, entry);
-  }
 }


                 reply	other threads:[~2022-05-04  6:00 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=20220504060047.3F32E3857815@sourceware.org \
    --to=nsz@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).