a8db42b
commit b19de59d620b3a9e6adf937f322f4281b67fc712
a8db42b
Author: Fangrui Song <maskray@google.com>
a8db42b
Date:   Thu Oct 7 11:55:02 2021 -0700
a8db42b
a8db42b
    elf: Avoid nested functions in the loader [BZ #27220]
a8db42b
    
a8db42b
    dynamic-link.h is included more than once in some elf/ files (rtld.c,
a8db42b
    dl-conflict.c, dl-reloc.c, dl-reloc-static-pie.c) and uses GCC nested
a8db42b
    functions. This harms readability and the nested functions usage
a8db42b
    is the biggest obstacle prevents Clang build (Clang doesn't support GCC
a8db42b
    nested functions).
a8db42b
    
a8db42b
    The key idea for unnesting is to add extra parameters (struct link_map
a8db42b
    *and struct r_scope_elm *[]) to RESOLVE_MAP,
a8db42b
    ELF_MACHINE_BEFORE_RTLD_RELOC, ELF_DYNAMIC_RELOCATE, elf_machine_rel[a],
a8db42b
    elf_machine_lazy_rel, and elf_machine_runtime_setup. (This is inspired
a8db42b
    by Stan Shebs' ppc64/x86-64 implementation in the
a8db42b
    google/grte/v5-2.27/master which uses mixed extra parameters and static
a8db42b
    variables.)
a8db42b
    
a8db42b
    Future simplification:
a8db42b
    * If mips elf_machine_runtime_setup no longer needs RESOLVE_GOTSYM,
a8db42b
      elf_machine_runtime_setup can drop the `scope` parameter.
a8db42b
    * If TLSDESC no longer need to be in elf_machine_lazy_rel,
a8db42b
      elf_machine_lazy_rel can drop the `scope` parameter.
a8db42b
    
a8db42b
    Tested on aarch64, i386, x86-64, powerpc64le, powerpc64, powerpc32,
a8db42b
    sparc64, sparcv9, s390x, s390, hppa, ia64, armhf, alpha, and mips64.
a8db42b
    In addition, tested build-many-glibcs.py with {arc,csky,microblaze,nios2}-linux-gnu
a8db42b
    and riscv64-linux-gnu-rv64imafdc-lp64d.
a8db42b
    
a8db42b
    Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
a8db42b
    (cherry picked from commit 490e6c62aa31a8aa5c4a059f6e646ede121edf0a)
a8db42b
a8db42b
diff --git a/elf/dl-conflict.c b/elf/dl-conflict.c
a8db42b
index 31a2f90770ce2a55..5c8e51d19ae095d6 100644
a8db42b
--- a/elf/dl-conflict.c
a8db42b
+++ b/elf/dl-conflict.c
a8db42b
@@ -27,20 +27,12 @@
a8db42b
 #include <sys/types.h>
a8db42b
 #include "dynamic-link.h"
a8db42b
 
a8db42b
-void
a8db42b
-_dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
a8db42b
-		       ElfW(Rela) *conflictend)
a8db42b
-{
a8db42b
-#if ! ELF_MACHINE_NO_RELA
a8db42b
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_RELOC))
a8db42b
-    _dl_debug_printf ("\nconflict processing: %s\n", DSO_FILENAME (l->l_name));
a8db42b
-
a8db42b
-  {
a8db42b
-    /* Do the conflict relocation of the object and library GOT and other
a8db42b
-       data.  */
a8db42b
+/* Used at loading time solely for prelink executable.  It is not called
a8db42b
+   concurrently so it is be safe to defined as static.  */
a8db42b
+static struct link_map *resolve_conflict_map __attribute__ ((__unused__));
a8db42b
 
a8db42b
     /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
a8db42b
-#define RESOLVE_MAP(ref, version, flags) (*ref = NULL, NULL)
a8db42b
+#define RESOLVE_MAP(map, scope, ref, version, flags) (*ref = NULL, NULL)
a8db42b
 #define RESOLVE(ref, version, flags) (*ref = NULL, 0)
a8db42b
 #define RESOLVE_CONFLICT_FIND_MAP(map, r_offset) \
a8db42b
   do {									      \
a8db42b
@@ -51,12 +43,23 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
a8db42b
     (map) = resolve_conflict_map;					      \
a8db42b
   } while (0)
a8db42b
 
a8db42b
+#include "dynamic-link.h"
a8db42b
+
a8db42b
+void
a8db42b
+_dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
a8db42b
+		       ElfW(Rela) *conflictend)
a8db42b
+{
a8db42b
+#if ! ELF_MACHINE_NO_RELA
a8db42b
+  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_RELOC))
a8db42b
+    _dl_debug_printf ("\nconflict processing: %s\n", DSO_FILENAME (l->l_name));
a8db42b
+
a8db42b
+  {
a8db42b
+    /* Do the conflict relocation of the object and library GOT and other
a8db42b
+       data.  */
a8db42b
+
a8db42b
     /* Prelinking makes no sense for anything but the main namespace.  */
a8db42b
     assert (l->l_ns == LM_ID_BASE);
a8db42b
-    struct link_map *resolve_conflict_map __attribute__ ((__unused__))
a8db42b
-      = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
a8db42b
-
a8db42b
-#include "dynamic-link.h"
a8db42b
+    resolve_conflict_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
a8db42b
 
a8db42b
     /* Override these, defined in dynamic-link.h.  */
a8db42b
 #undef CHECK_STATIC_TLS
a8db42b
@@ -67,8 +70,8 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
a8db42b
     GL(dl_num_cache_relocations) += conflictend - conflict;
a8db42b
 
a8db42b
     for (; conflict < conflictend; ++conflict)
a8db42b
-      elf_machine_rela (l, conflict, NULL, NULL, (void *) conflict->r_offset,
a8db42b
-			0);
a8db42b
+      elf_machine_rela (l, NULL, conflict, NULL, NULL,
a8db42b
+			(void *) conflict->r_offset, 0);
a8db42b
   }
a8db42b
 #endif
a8db42b
 }
a8db42b
diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c
a8db42b
index 2fb02d727654c87d..a52ba8aeb8b573cb 100644
a8db42b
--- a/elf/dl-reloc-static-pie.c
a8db42b
+++ b/elf/dl-reloc-static-pie.c
a8db42b
@@ -19,8 +19,14 @@
a8db42b
 #if ENABLE_STATIC_PIE
a8db42b
 /* Mark symbols hidden in static PIE for early self relocation to work.  */
a8db42b
 # pragma GCC visibility push(hidden)
a8db42b
+#include <assert.h>
a8db42b
 #include <unistd.h>
a8db42b
 #include <ldsodefs.h>
a8db42b
+
a8db42b
+#include <dl-machine.h>
a8db42b
+
a8db42b
+#define STATIC_PIE_BOOTSTRAP
a8db42b
+#define RESOLVE_MAP(map, scope, sym, version, flags) map
a8db42b
 #include "dynamic-link.h"
a8db42b
 
a8db42b
 /* Relocate static executable with PIE.  */
a8db42b
@@ -30,11 +36,6 @@ _dl_relocate_static_pie (void)
a8db42b
 {
a8db42b
   struct link_map *main_map = _dl_get_dl_main_map ();
a8db42b
 
a8db42b
-# define STATIC_PIE_BOOTSTRAP
a8db42b
-# define BOOTSTRAP_MAP (main_map)
a8db42b
-# define RESOLVE_MAP(sym, version, flags) BOOTSTRAP_MAP
a8db42b
-# include "dynamic-link.h"
a8db42b
-
a8db42b
   /* Figure out the run-time load address of static PIE.  */
a8db42b
   main_map->l_addr = elf_machine_load_address ();
a8db42b
 
a8db42b
@@ -53,12 +54,12 @@ _dl_relocate_static_pie (void)
a8db42b
   elf_get_dynamic_info (main_map);
a8db42b
 
a8db42b
 # ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
a8db42b
-  ELF_MACHINE_BEFORE_RTLD_RELOC (main_map->l_info);
a8db42b
+  ELF_MACHINE_BEFORE_RTLD_RELOC (main_map, main_map->l_info);
a8db42b
 # endif
a8db42b
 
a8db42b
   /* Relocate ourselves so we can do normal function calls and
a8db42b
      data access using the global offset table.  */
a8db42b
-  ELF_DYNAMIC_RELOCATE (main_map, 0, 0, 0);
a8db42b
+  ELF_DYNAMIC_RELOCATE (main_map, NULL, 0, 0, 0);
a8db42b
   main_map->l_relocated = 1;
a8db42b
 
a8db42b
   /* Initialize _r_debug.  */
a8db42b
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
a8db42b
index e13a672ade6d7a28..3447de7f3536cd70 100644
a8db42b
--- a/elf/dl-reloc.c
a8db42b
+++ b/elf/dl-reloc.c
a8db42b
@@ -162,6 +162,32 @@ _dl_nothread_init_static_tls (struct link_map *map)
a8db42b
 }
a8db42b
 #endif /* !THREAD_GSCOPE_IN_TCB */
a8db42b
 
a8db42b
+/* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
a8db42b
+#define RESOLVE_MAP(l, scope, ref, version, r_type)			      \
a8db42b
+    ((ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL			      \
a8db42b
+      && __glibc_likely (!dl_symbol_visibility_binds_local_p (*ref)))	      \
a8db42b
+     ? ((__glibc_unlikely ((*ref) == l->l_lookup_cache.sym)		      \
a8db42b
+	 && elf_machine_type_class (r_type) == l->l_lookup_cache.type_class)  \
a8db42b
+	? (bump_num_cache_relocations (),				      \
a8db42b
+	   (*ref) = l->l_lookup_cache.ret,				      \
a8db42b
+	   l->l_lookup_cache.value)					      \
a8db42b
+	: ({ lookup_t _lr;						      \
a8db42b
+	     int _tc = elf_machine_type_class (r_type);			      \
a8db42b
+	     l->l_lookup_cache.type_class = _tc;			      \
a8db42b
+	     l->l_lookup_cache.sym = (*ref);				      \
a8db42b
+	     const struct r_found_version *v = NULL;			      \
a8db42b
+	     if ((version) != NULL && (version)->hash != 0)		      \
a8db42b
+	       v = (version);						      \
a8db42b
+	     _lr = _dl_lookup_symbol_x ((const char *) D_PTR (l, l_info[DT_STRTAB]) + (*ref)->st_name, \
a8db42b
+					l, (ref), scope, v, _tc,	      \
a8db42b
+					DL_LOOKUP_ADD_DEPENDENCY	      \
a8db42b
+					| DL_LOOKUP_FOR_RELOCATE, NULL);      \
a8db42b
+	     l->l_lookup_cache.ret = (*ref);				      \
a8db42b
+	     l->l_lookup_cache.value = _lr; }))				      \
a8db42b
+     : l)
a8db42b
+
a8db42b
+#include "dynamic-link.h"
a8db42b
+
a8db42b
 void
a8db42b
 _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
 		     int reloc_mode, int consider_profiling)
a8db42b
@@ -243,36 +269,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
   {
a8db42b
     /* Do the actual relocation of the object's GOT and other data.  */
a8db42b
 
a8db42b
-    /* String table object symbols.  */
a8db42b
-    const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
a8db42b
-
a8db42b
-    /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
a8db42b
-#define RESOLVE_MAP(ref, version, r_type) \
a8db42b
-    ((ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL			      \
a8db42b
-      && __glibc_likely (!dl_symbol_visibility_binds_local_p (*ref)))	      \
a8db42b
-     ? ((__builtin_expect ((*ref) == l->l_lookup_cache.sym, 0)		      \
a8db42b
-	 && elf_machine_type_class (r_type) == l->l_lookup_cache.type_class)  \
a8db42b
-	? (bump_num_cache_relocations (),				      \
a8db42b
-	   (*ref) = l->l_lookup_cache.ret,				      \
a8db42b
-	   l->l_lookup_cache.value)					      \
a8db42b
-	: ({ lookup_t _lr;						      \
a8db42b
-	     int _tc = elf_machine_type_class (r_type);			      \
a8db42b
-	     l->l_lookup_cache.type_class = _tc;			      \
a8db42b
-	     l->l_lookup_cache.sym = (*ref);				      \
a8db42b
-	     const struct r_found_version *v = NULL;			      \
a8db42b
-	     if ((version) != NULL && (version)->hash != 0)		      \
a8db42b
-	       v = (version);						      \
a8db42b
-	     _lr = _dl_lookup_symbol_x (strtab + (*ref)->st_name, l, (ref),   \
a8db42b
-					scope, v, _tc,			      \
a8db42b
-					DL_LOOKUP_ADD_DEPENDENCY	      \
a8db42b
-					| DL_LOOKUP_FOR_RELOCATE, NULL);      \
a8db42b
-	     l->l_lookup_cache.ret = (*ref);				      \
a8db42b
-	     l->l_lookup_cache.value = _lr; }))				      \
a8db42b
-     : l)
a8db42b
-
a8db42b
-#include "dynamic-link.h"
a8db42b
-
a8db42b
-    ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling, skip_ifunc);
a8db42b
+    ELF_DYNAMIC_RELOCATE (l, scope, lazy, consider_profiling, skip_ifunc);
a8db42b
 
a8db42b
 #ifndef PROF
a8db42b
     if (__glibc_unlikely (consider_profiling)
a8db42b
diff --git a/elf/do-rel.h b/elf/do-rel.h
a8db42b
index 321ac2b359c1028c..f441b749190c2641 100644
a8db42b
--- a/elf/do-rel.h
a8db42b
+++ b/elf/do-rel.h
a8db42b
@@ -37,8 +37,8 @@
a8db42b
    relocations; they should be set up to call _dl_runtime_resolve, rather
a8db42b
    than fully resolved now.  */
a8db42b
 
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
-elf_dynamic_do_Rel (struct link_map *map,
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
+elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		    ElfW(Addr) reladdr, ElfW(Addr) relsize,
a8db42b
 		    __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative,
a8db42b
 		    int lazy, int skip_ifunc)
a8db42b
@@ -68,13 +68,13 @@ elf_dynamic_do_Rel (struct link_map *map,
a8db42b
 	  }
a8db42b
 	else
a8db42b
 # endif
a8db42b
-	  elf_machine_lazy_rel (map, l_addr, r, skip_ifunc);
a8db42b
+	  elf_machine_lazy_rel (map, scope, l_addr, r, skip_ifunc);
a8db42b
 
a8db42b
 # ifdef ELF_MACHINE_IRELATIVE
a8db42b
       if (r2 != NULL)
a8db42b
 	for (; r2 <= end2; ++r2)
a8db42b
 	  if (ELFW(R_TYPE) (r2->r_info) == ELF_MACHINE_IRELATIVE)
a8db42b
-	    elf_machine_lazy_rel (map, l_addr, r2, skip_ifunc);
a8db42b
+	    elf_machine_lazy_rel (map, scope, l_addr, r2, skip_ifunc);
a8db42b
 # endif
a8db42b
     }
a8db42b
   else
a8db42b
@@ -134,7 +134,7 @@ elf_dynamic_do_Rel (struct link_map *map,
a8db42b
 #endif
a8db42b
 
a8db42b
 	      ElfW(Half) ndx = version[ELFW(R_SYM) (r->r_info)] & 0x7fff;
a8db42b
-	      elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)],
a8db42b
+	      elf_machine_rel (map, scope, r, &symtab[ELFW(R_SYM) (r->r_info)],
a8db42b
 			       &map->l_versions[ndx],
a8db42b
 			       (void *) (l_addr + r->r_offset), skip_ifunc);
a8db42b
 	    }
a8db42b
@@ -146,7 +146,7 @@ elf_dynamic_do_Rel (struct link_map *map,
a8db42b
 		{
a8db42b
 		  ElfW(Half) ndx
a8db42b
 		    = version[ELFW(R_SYM) (r2->r_info)] & 0x7fff;
a8db42b
-		  elf_machine_rel (map, r2,
a8db42b
+		  elf_machine_rel (map, scope, r2,
a8db42b
 				   &symtab[ELFW(R_SYM) (r2->r_info)],
a8db42b
 				   &map->l_versions[ndx],
a8db42b
 				   (void *) (l_addr + r2->r_offset),
a8db42b
@@ -167,14 +167,14 @@ elf_dynamic_do_Rel (struct link_map *map,
a8db42b
 	      }
a8db42b
 	    else
a8db42b
 # endif
a8db42b
-	      elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
a8db42b
+	      elf_machine_rel (map, scope, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
a8db42b
 			       (void *) (l_addr + r->r_offset), skip_ifunc);
a8db42b
 
a8db42b
 # ifdef ELF_MACHINE_IRELATIVE
a8db42b
 	  if (r2 != NULL)
a8db42b
 	    for (; r2 <= end2; ++r2)
a8db42b
 	      if (ELFW(R_TYPE) (r2->r_info) == ELF_MACHINE_IRELATIVE)
a8db42b
-		elf_machine_rel (map, r2, &symtab[ELFW(R_SYM) (r2->r_info)],
a8db42b
+		elf_machine_rel (map, scope, r2, &symtab[ELFW(R_SYM) (r2->r_info)],
a8db42b
 				 NULL, (void *) (l_addr + r2->r_offset),
a8db42b
 				 skip_ifunc);
a8db42b
 # endif
a8db42b
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
a8db42b
index 3eb24ba3a6cee40b..7cc30211649d3820 100644
a8db42b
--- a/elf/dynamic-link.h
a8db42b
+++ b/elf/dynamic-link.h
a8db42b
@@ -59,31 +59,33 @@ int _dl_try_allocate_static_tls (struct link_map *map, bool optional)
a8db42b
    copying memory, breaking the very code written to handle the
a8db42b
    unaligned cases.  */
a8db42b
 # if ! ELF_MACHINE_NO_REL
a8db42b
-auto inline void __attribute__((always_inline))
a8db42b
-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
a8db42b
-		 const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
+elf_machine_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		 const ElfW(Rel) *reloc, const ElfW(Sym) *sym,
a8db42b
+		 const struct r_found_version *version,
a8db42b
 		 void *const reloc_addr, int skip_ifunc);
a8db42b
-auto inline void __attribute__((always_inline))
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
 elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
a8db42b
 			  void *const reloc_addr);
a8db42b
 # endif
a8db42b
 # if ! ELF_MACHINE_NO_RELA
a8db42b
-auto inline void __attribute__((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
-		  const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
-		  void *const reloc_addr, int skip_ifunc);
a8db42b
-auto inline void __attribute__((always_inline))
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
a8db42b
+		  const struct r_found_version *version, void *const reloc_addr,
a8db42b
+		  int skip_ifunc);
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
 elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 			   void *const reloc_addr);
a8db42b
 # endif
a8db42b
 # if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
a8db42b
-auto inline void __attribute__((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
a8db42b
 		      int skip_ifunc);
a8db42b
 # else
a8db42b
-auto inline void __attribute__((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 		      int skip_ifunc);
a8db42b
 # endif
a8db42b
@@ -114,7 +116,7 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
    consumes precisely the very end of the DT_REL*, or DT_JMPREL and DT_REL*
a8db42b
    are completely separate and there is a gap between them.  */
a8db42b
 
a8db42b
-# define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, skip_ifunc, test_rel) \
a8db42b
+# define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, scope, do_lazy, skip_ifunc, test_rel) \
a8db42b
   do {									      \
a8db42b
     struct { ElfW(Addr) start, size;					      \
a8db42b
 	     __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative; int lazy; }  \
a8db42b
@@ -152,18 +154,18 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
       }									      \
a8db42b
 									      \
a8db42b
     if (ELF_DURING_STARTUP)						      \
a8db42b
-      elf_dynamic_do_##reloc ((map), ranges[0].start, ranges[0].size,	      \
a8db42b
-			      ranges[0].nrelative, 0, skip_ifunc);	      \
a8db42b
+      elf_dynamic_do_##reloc ((map), scope, ranges[0].start, ranges[0].size,  \
a8db42b
+			      ranges[0].nrelative, 0, skip_ifunc);  \
a8db42b
     else								      \
a8db42b
       {									      \
a8db42b
 	int ranges_index;						      \
a8db42b
 	for (ranges_index = 0; ranges_index < 2; ++ranges_index)	      \
a8db42b
-	  elf_dynamic_do_##reloc ((map),				      \
a8db42b
+	  elf_dynamic_do_##reloc ((map), scope,				      \
a8db42b
 				  ranges[ranges_index].start,		      \
a8db42b
 				  ranges[ranges_index].size,		      \
a8db42b
 				  ranges[ranges_index].nrelative,	      \
a8db42b
 				  ranges[ranges_index].lazy,		      \
a8db42b
-				  skip_ifunc);				      \
a8db42b
+				  skip_ifunc);		      \
a8db42b
       }									      \
a8db42b
   } while (0)
a8db42b
 
a8db42b
@@ -175,29 +177,29 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
 
a8db42b
 # if ! ELF_MACHINE_NO_REL
a8db42b
 #  include "do-rel.h"
a8db42b
-#  define ELF_DYNAMIC_DO_REL(map, lazy, skip_ifunc) \
a8db42b
-  _ELF_DYNAMIC_DO_RELOC (REL, Rel, map, lazy, skip_ifunc, _ELF_CHECK_REL)
a8db42b
+#  define ELF_DYNAMIC_DO_REL(map, scope, lazy, skip_ifunc)	      \
a8db42b
+  _ELF_DYNAMIC_DO_RELOC (REL, Rel, map, scope, lazy, skip_ifunc, _ELF_CHECK_REL)
a8db42b
 # else
a8db42b
-#  define ELF_DYNAMIC_DO_REL(map, lazy, skip_ifunc) /* Nothing to do.  */
a8db42b
+#  define ELF_DYNAMIC_DO_REL(map, scope, lazy, skip_ifunc) /* Nothing to do.  */
a8db42b
 # endif
a8db42b
 
a8db42b
 # if ! ELF_MACHINE_NO_RELA
a8db42b
 #  define DO_RELA
a8db42b
 #  include "do-rel.h"
a8db42b
-#  define ELF_DYNAMIC_DO_RELA(map, lazy, skip_ifunc) \
a8db42b
-  _ELF_DYNAMIC_DO_RELOC (RELA, Rela, map, lazy, skip_ifunc, _ELF_CHECK_REL)
a8db42b
+#  define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc)	      \
a8db42b
+  _ELF_DYNAMIC_DO_RELOC (RELA, Rela, map, scope, lazy, skip_ifunc, _ELF_CHECK_REL)
a8db42b
 # else
a8db42b
-#  define ELF_DYNAMIC_DO_RELA(map, lazy, skip_ifunc) /* Nothing to do.  */
a8db42b
+#  define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc) /* Nothing to do.  */
a8db42b
 # endif
a8db42b
 
a8db42b
 /* This can't just be an inline function because GCC is too dumb
a8db42b
    to inline functions containing inlines themselves.  */
a8db42b
-# define ELF_DYNAMIC_RELOCATE(map, lazy, consider_profile, skip_ifunc) \
a8db42b
+# define ELF_DYNAMIC_RELOCATE(map, scope, lazy, consider_profile, skip_ifunc) \
a8db42b
   do {									      \
a8db42b
-    int edr_lazy = elf_machine_runtime_setup ((map), (lazy),		      \
a8db42b
+    int edr_lazy = elf_machine_runtime_setup ((map), (scope), (lazy),	      \
a8db42b
 					      (consider_profile));	      \
a8db42b
-    ELF_DYNAMIC_DO_REL ((map), edr_lazy, skip_ifunc);			      \
a8db42b
-    ELF_DYNAMIC_DO_RELA ((map), edr_lazy, skip_ifunc);			      \
a8db42b
+    ELF_DYNAMIC_DO_REL ((map), (scope), edr_lazy, skip_ifunc);		      \
a8db42b
+    ELF_DYNAMIC_DO_RELA ((map), (scope), edr_lazy, skip_ifunc);		      \
a8db42b
   } while (0)
a8db42b
 
a8db42b
 #endif
a8db42b
diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h
a8db42b
index 4aa2058abf6443c9..15c316b38c05a90c 100644
a8db42b
--- a/elf/get-dynamic-info.h
a8db42b
+++ b/elf/get-dynamic-info.h
a8db42b
@@ -16,18 +16,15 @@
a8db42b
    License along with the GNU C Library; if not, see
a8db42b
    <https://www.gnu.org/licenses/>.  */
a8db42b
 
a8db42b
-/* This file is included multiple times and therefore lacks a header
a8db42b
-   file inclusion guard.  */
a8db42b
+/* Populate dynamic tags in l_info.  */
a8db42b
+
a8db42b
+#ifndef _GET_DYNAMIC_INFO_H
a8db42b
+#define _GET_DYNAMIC_INFO_H
a8db42b
 
a8db42b
 #include <assert.h>
a8db42b
 #include <libc-diag.h>
a8db42b
 
a8db42b
-#ifndef RESOLVE_MAP
a8db42b
-static
a8db42b
-#else
a8db42b
-auto
a8db42b
-#endif
a8db42b
-inline void __attribute__ ((unused, always_inline))
a8db42b
+static inline void __attribute__ ((unused, always_inline))
a8db42b
 elf_get_dynamic_info (struct link_map *l)
a8db42b
 {
a8db42b
 #if __ELF_NATIVE_CLASS == 32
a8db42b
@@ -165,3 +162,5 @@ elf_get_dynamic_info (struct link_map *l)
a8db42b
     info[DT_RPATH] = NULL;
a8db42b
 #endif
a8db42b
 }
a8db42b
+
a8db42b
+#endif
a8db42b
diff --git a/elf/rtld.c b/elf/rtld.c
a8db42b
index 84eac9a8df7125a6..ee45657aeac14f3c 100644
a8db42b
--- a/elf/rtld.c
a8db42b
+++ b/elf/rtld.c
a8db42b
@@ -502,13 +502,9 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
a8db42b
   return start_addr;
a8db42b
 }
a8db42b
 
a8db42b
-static ElfW(Addr) __attribute_used__
a8db42b
-_dl_start (void *arg)
a8db42b
-{
a8db42b
 #ifdef DONT_USE_BOOTSTRAP_MAP
a8db42b
 # define bootstrap_map GL(dl_rtld_map)
a8db42b
 #else
a8db42b
-  struct dl_start_final_info info;
a8db42b
 # define bootstrap_map info.l
a8db42b
 #endif
a8db42b
 
a8db42b
@@ -517,13 +513,16 @@ _dl_start (void *arg)
a8db42b
      Since ld.so must not have any undefined symbols the result
a8db42b
      is trivial: always the map of ld.so itself.  */
a8db42b
 #define RTLD_BOOTSTRAP
a8db42b
-#define BOOTSTRAP_MAP (&bootstrap_map)
a8db42b
-#define RESOLVE_MAP(sym, version, flags) BOOTSTRAP_MAP
a8db42b
+#define RESOLVE_MAP(map, scope, sym, version, flags) map
a8db42b
 #include "dynamic-link.h"
a8db42b
 
a8db42b
+static ElfW(Addr) __attribute_used__
a8db42b
+_dl_start (void *arg)
a8db42b
+{
a8db42b
 #ifdef DONT_USE_BOOTSTRAP_MAP
a8db42b
   rtld_timer_start (&start_time);
a8db42b
 #else
a8db42b
+  struct dl_start_final_info info;
a8db42b
   rtld_timer_start (&info.start_time);
a8db42b
 #endif
a8db42b
 
a8db42b
@@ -557,7 +556,7 @@ _dl_start (void *arg)
a8db42b
 #endif
a8db42b
 
a8db42b
 #ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
a8db42b
-  ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info);
a8db42b
+  ELF_MACHINE_BEFORE_RTLD_RELOC (&bootstrap_map, bootstrap_map.l_info);
a8db42b
 #endif
a8db42b
 
a8db42b
   if (bootstrap_map.l_addr || ! bootstrap_map.l_info[VALIDX(DT_GNU_PRELINKED)])
a8db42b
@@ -565,7 +564,7 @@ _dl_start (void *arg)
a8db42b
       /* Relocate ourselves so we can do normal function calls and
a8db42b
 	 data access using the global offset table.  */
a8db42b
 
a8db42b
-      ELF_DYNAMIC_RELOCATE (&bootstrap_map, 0, 0, 0);
a8db42b
+      ELF_DYNAMIC_RELOCATE (&bootstrap_map, NULL, 0, 0, 0);
a8db42b
     }
a8db42b
   bootstrap_map.l_relocated = 1;
a8db42b
 
a8db42b
diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
a8db42b
index d29d827ab32a78ee..34c0790b893a529b 100644
a8db42b
--- a/sysdeps/aarch64/dl-machine.h
a8db42b
+++ b/sysdeps/aarch64/dl-machine.h
a8db42b
@@ -65,7 +65,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((unused))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   if (l->l_info[DT_JMPREL] && lazy)
a8db42b
     {
a8db42b
@@ -243,10 +244,11 @@ elf_machine_plt_value (struct link_map *map,
a8db42b
 
a8db42b
 #ifdef RESOLVE_MAP
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
-		  const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   ElfW(Addr) *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -259,7 +261,8 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
   else
a8db42b
     {
a8db42b
       const ElfW(Sym) *const refsym = sym;
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       if (sym != NULL
a8db42b
@@ -383,9 +386,9 @@ elf_machine_rela_relative (ElfW(Addr) l_addr,
a8db42b
   *reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      ElfW(Addr) l_addr,
a8db42b
 		      const ElfW(Rela) *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
@@ -412,7 +415,7 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
 		    (const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
a8db42b
 		  version = &map->l_versions[vernum[symndx] & 0x7fff];
a8db42b
 		}
a8db42b
-	      elf_machine_rela (map, reloc, sym, version, reloc_addr,
a8db42b
+	      elf_machine_rela (map, scope, reloc, sym, version, reloc_addr,
a8db42b
 				skip_ifunc);
a8db42b
 	      return;
a8db42b
 	    }
a8db42b
@@ -439,7 +442,8 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
 
a8db42b
       /* Always initialize TLS descriptors completely, because lazy
a8db42b
 	 initialization requires synchronization at every TLS access.  */
a8db42b
-      elf_machine_rela (map, reloc, sym, version, reloc_addr, skip_ifunc);
a8db42b
+      elf_machine_rela (map, scope, reloc, sym, version, reloc_addr,
a8db42b
+			skip_ifunc);
a8db42b
     }
a8db42b
   else if (__glibc_unlikely (r_type == AARCH64_R(IRELATIVE)))
a8db42b
     {
a8db42b
diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h
a8db42b
index 2cd2213d9ab25287..66e1db524bb378f6 100644
a8db42b
--- a/sysdeps/alpha/dl-machine.h
a8db42b
+++ b/sysdeps/alpha/dl-machine.h
a8db42b
@@ -70,7 +70,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int
a8db42b
-elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   extern char _dl_runtime_resolve_new[] attribute_hidden;
a8db42b
   extern char _dl_runtime_profile_new[] attribute_hidden;
a8db42b
@@ -361,9 +362,9 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
 
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		  const Elf64_Rela *reloc,
a8db42b
 		  const Elf64_Sym *sym,
a8db42b
 		  const struct r_found_version *version,
a8db42b
@@ -411,7 +412,8 @@ elf_machine_rela (struct link_map *map,
a8db42b
       return;
a8db42b
   else
a8db42b
     {
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf64_Addr sym_value;
a8db42b
       Elf64_Addr sym_raw_value;
a8db42b
 
a8db42b
@@ -489,7 +491,7 @@ elf_machine_rela (struct link_map *map,
a8db42b
    can be skipped.  */
a8db42b
 #define ELF_MACHINE_REL_RELATIVE 1
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -506,9 +508,9 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
   memcpy (reloc_addr_arg, &reloc_addr_val, 8);
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/arc/dl-machine.h b/sysdeps/arc/dl-machine.h
a8db42b
index e6ce7f0ff6d9ac34..4b64ffec256b7f3b 100644
a8db42b
--- a/sysdeps/arc/dl-machine.h
a8db42b
+++ b/sysdeps/arc/dl-machine.h
a8db42b
@@ -122,7 +122,8 @@ elf_machine_load_address (void)
a8db42b
 
a8db42b
 static inline int
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   extern void _dl_runtime_resolve (void);
a8db42b
 
a8db42b
@@ -228,10 +229,11 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t t,
a8db42b
 
a8db42b
 #ifdef RESOLVE_MAP
a8db42b
 
a8db42b
-inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
-                  const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
                   void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   ElfW(Addr) r_info = reloc->r_info;
a8db42b
@@ -245,7 +247,8 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
   else
a8db42b
     {
a8db42b
       const ElfW(Sym) *const refsym = sym;
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       switch (r_type)
a8db42b
@@ -326,8 +329,9 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 
a8db42b
 inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map, ElfW(Addr) l_addr,
a8db42b
-                      const ElfW(Rela) *reloc, int skip_ifunc)
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
+		      int skip_ifunc)
a8db42b
 {
a8db42b
   ElfW(Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset);
a8db42b
   const unsigned int r_type = ELFW (R_TYPE) (reloc->r_info);
a8db42b
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
a8db42b
index ff5e09e207f7986b..7e6761bbe87540d5 100644
a8db42b
--- a/sysdeps/arm/dl-machine.h
a8db42b
+++ b/sysdeps/arm/dl-machine.h
a8db42b
@@ -84,7 +84,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((unused))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   Elf32_Addr *got;
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word);
a8db42b
@@ -303,7 +304,7 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc,
a8db42b
 
a8db42b
 #ifdef RESOLVE_MAP
a8db42b
 /* Handle a PC24 reloc, including the out-of-range case.  */
a8db42b
-auto void
a8db42b
+static void
a8db42b
 relocate_pc24 (struct link_map *map, Elf32_Addr value,
a8db42b
                Elf32_Addr *const reloc_addr, Elf32_Sword addend)
a8db42b
 {
a8db42b
@@ -357,10 +358,11 @@ relocate_pc24 (struct link_map *map, Elf32_Addr value,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
a8db42b
-		 const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+                 const Elf32_Rel *reloc, const Elf32_Sym *sym,
a8db42b
+                 const struct r_found_version *version,
a8db42b
 		 void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -391,7 +393,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
a8db42b
 #endif
a8db42b
     {
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       if (sym != NULL
a8db42b
@@ -535,10 +538,11 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
a8db42b
 }
a8db42b
 
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+                  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+                  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -553,7 +557,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 # ifndef RESOLVE_CONFLICT_FIND_MAP
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
 # endif
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
       Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       if (sym != NULL
a8db42b
@@ -628,7 +632,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 }
a8db42b
 # endif
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
a8db42b
 			  void *const reloc_addr_arg)
a8db42b
@@ -638,7 +642,7 @@ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
a8db42b
 }
a8db42b
 
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -648,9 +652,9 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 }
a8db42b
 # endif
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rel *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
@@ -680,7 +684,7 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
 
a8db42b
       /* Always initialize TLS descriptors completely, because lazy
a8db42b
 	 initialization requires synchronization at every TLS access.  */
a8db42b
-      elf_machine_rel (map, reloc, sym, version, reloc_addr, skip_ifunc);
a8db42b
+      elf_machine_rel (map, scope, reloc, sym, version, reloc_addr, skip_ifunc);
a8db42b
     }
a8db42b
   else
a8db42b
     _dl_reloc_bad_type (map, r_type, 1);
a8db42b
diff --git a/sysdeps/csky/dl-machine.h b/sysdeps/csky/dl-machine.h
a8db42b
index b08f06d74ca6f8d1..ec22f875772b1291 100644
a8db42b
--- a/sysdeps/csky/dl-machine.h
a8db42b
+++ b/sysdeps/csky/dl-machine.h
a8db42b
@@ -58,7 +58,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   Elf32_Addr *got;
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word);
a8db42b
@@ -215,9 +216,10 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void __attribute__ ((unused, always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+static inline void __attribute__ ((unused, always_inline))
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -230,7 +232,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
   else
a8db42b
     {
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
       opcode16_addr = (unsigned short *)reloc_addr;
a8db42b
 
a8db42b
@@ -331,7 +334,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__ ((unused, always_inline))
a8db42b
+static inline void __attribute__ ((unused, always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
 {
a8db42b
@@ -339,8 +342,8 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
   *reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__ ((unused, always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static inline void __attribute__ ((unused, always_inline))
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/hppa/dl-machine.h b/sysdeps/hppa/dl-machine.h
a8db42b
index 24f0f47d8f1e25cd..088931f67065250c 100644
a8db42b
--- a/sysdeps/hppa/dl-machine.h
a8db42b
+++ b/sysdeps/hppa/dl-machine.h
a8db42b
@@ -70,8 +70,8 @@ __hppa_init_bootstrap_fdesc_table (struct link_map *map)
a8db42b
   map->l_mach.fptr_table = boot_table;
a8db42b
 }
a8db42b
 
a8db42b
-#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info)		\
a8db42b
-	__hppa_init_bootstrap_fdesc_table (BOOTSTRAP_MAP);	\
a8db42b
+#define ELF_MACHINE_BEFORE_RTLD_RELOC(map, dynamic_info)	\
a8db42b
+	__hppa_init_bootstrap_fdesc_table (map);		\
a8db42b
 	_dl_fptr_init();
a8db42b
 
a8db42b
 /* Return nonzero iff ELF header is compatible with the running host.  */
a8db42b
@@ -182,7 +182,8 @@ elf_machine_main_map (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   Elf32_Addr *got = NULL;
a8db42b
   Elf32_Addr l_addr, iplt, jmprel, end_jmprel, r_type, r_sym;
a8db42b
@@ -564,8 +565,8 @@ dl_platform_init (void)
a8db42b
   (  (((as14) & 0x1fff) << 1) \
a8db42b
    | (((as14) & 0x2000) >> 13))
a8db42b
 
a8db42b
-auto void __attribute__((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map,
a8db42b
+static void __attribute__((always_inline))
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		  const Elf32_Rela *reloc,
a8db42b
 		  const Elf32_Sym *sym,
a8db42b
 		  const struct r_found_version *version,
a8db42b
@@ -594,11 +595,9 @@ elf_machine_rela (struct link_map *map,
a8db42b
      zeros, and an all zero Elf32_Sym has a binding of STB_LOCAL.)
a8db42b
      See RESOLVE_MAP definition in elf/dl-reloc.c  */
a8db42b
 # ifdef RTLD_BOOTSTRAP
a8db42b
-  /* RESOLVE_MAP in rtld.c doesn't have the local sym test.  */
a8db42b
-  sym_map = (ELF32_ST_BIND (sym->st_info) != STB_LOCAL
a8db42b
-	     ? RESOLVE_MAP (&sym, version, r_type) : map);
a8db42b
+  sym_map = map;
a8db42b
 # else
a8db42b
-  sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+  sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
 # endif
a8db42b
 
a8db42b
   if (sym_map)
a8db42b
@@ -756,7 +755,7 @@ elf_machine_rela (struct link_map *map,
a8db42b
 
a8db42b
 /* hppa doesn't have an R_PARISC_RELATIVE reloc, but uses relocs with
a8db42b
    ELF32_R_SYM (info) == 0 for a similar purpose.  */
a8db42b
-auto void __attribute__((always_inline))
a8db42b
+static void __attribute__((always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr,
a8db42b
 			   const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -809,8 +808,8 @@ elf_machine_rela_relative (Elf32_Addr l_addr,
a8db42b
   *reloc_addr = value;
a8db42b
 }
a8db42b
 
a8db42b
-auto void __attribute__((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static void __attribute__((always_inline))
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
a8db42b
index 590b41d8d7e35005..78ce890c0ff333ca 100644
a8db42b
--- a/sysdeps/i386/dl-machine.h
a8db42b
+++ b/sysdeps/i386/dl-machine.h
a8db42b
@@ -61,7 +61,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((unused, always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   Elf32_Addr *got;
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word) attribute_hidden;
a8db42b
@@ -291,9 +292,10 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute ((always_inline))
a8db42b
-elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
a8db42b
+elf_machine_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		 const Elf32_Rel *reloc,
a8db42b
 		 const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
 		 void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
@@ -327,7 +329,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
 # endif
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       if (sym != NULL
a8db42b
@@ -498,10 +501,11 @@ and creates an unsatisfiable circular dependency.\n",
a8db42b
 }
a8db42b
 
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -514,7 +518,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 #  ifndef RESOLVE_CONFLICT_FIND_MAP
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
 #  endif
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       if (sym != NULL
a8db42b
@@ -647,7 +652,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 }
a8db42b
 # endif	/* !RTLD_BOOTSTRAP */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute ((always_inline))
a8db42b
 elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
a8db42b
 			  void *const reloc_addr_arg)
a8db42b
@@ -658,7 +663,7 @@ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
a8db42b
 }
a8db42b
 
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -668,9 +673,9 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 }
a8db42b
 # endif	/* !RTLD_BOOTSTRAP */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rel *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
@@ -705,13 +710,13 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
 	  const ElfW(Half) *const version =
a8db42b
 	    (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
a8db42b
 	  ElfW(Half) ndx = version[ELFW(R_SYM) (r->r_info)] & 0x7fff;
a8db42b
-	  elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)],
a8db42b
+	  elf_machine_rel (map, scope, r, &symtab[ELFW(R_SYM) (r->r_info)],
a8db42b
 			   &map->l_versions[ndx],
a8db42b
 			   (void *) (l_addr + r->r_offset), skip_ifunc);
a8db42b
 	}
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
       else
a8db42b
-	elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
a8db42b
+	elf_machine_rel (map, scope, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
a8db42b
 			 (void *) (l_addr + r->r_offset), skip_ifunc);
a8db42b
 # endif
a8db42b
     }
a8db42b
@@ -728,9 +733,9 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
 
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rela (struct link_map *map,
a8db42b
+elf_machine_lazy_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		       Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		       int skip_ifunc)
a8db42b
 {
a8db42b
@@ -754,7 +759,8 @@ elf_machine_lazy_rela (struct link_map *map,
a8db42b
 
a8db42b
       /* Always initialize TLS descriptors completely at load time, in
a8db42b
 	 case static TLS is allocated for it that requires locking.  */
a8db42b
-      elf_machine_rela (map, reloc, sym, version, reloc_addr, skip_ifunc);
a8db42b
+      elf_machine_rela (map, scope, reloc, sym, version, reloc_addr,
a8db42b
+			skip_ifunc);
a8db42b
     }
a8db42b
   else if (__glibc_unlikely (r_type == R_386_IRELATIVE))
a8db42b
     {
a8db42b
diff --git a/sysdeps/ia64/dl-machine.h b/sysdeps/ia64/dl-machine.h
a8db42b
index 4403e7767af83546..2217d0b556c17683 100644
a8db42b
--- a/sysdeps/ia64/dl-machine.h
a8db42b
+++ b/sysdeps/ia64/dl-machine.h
a8db42b
@@ -44,8 +44,8 @@ __ia64_init_bootstrap_fdesc_table (struct link_map *map)
a8db42b
   map->l_mach.fptr_table = boot_table;
a8db42b
 }
a8db42b
 
a8db42b
-#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info)		\
a8db42b
-	__ia64_init_bootstrap_fdesc_table (BOOTSTRAP_MAP);
a8db42b
+#define ELF_MACHINE_BEFORE_RTLD_RELOC(map, dynamic_info)		\
a8db42b
+	__ia64_init_bootstrap_fdesc_table (map);
a8db42b
 
a8db42b
 /* Return nonzero iff ELF header is compatible with the running host.  */
a8db42b
 static inline int __attribute__ ((unused))
a8db42b
@@ -98,7 +98,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((unused, always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   extern void _dl_runtime_resolve (void);
a8db42b
   extern void _dl_runtime_profile (void);
a8db42b
@@ -371,9 +372,9 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
 
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully
a8db42b
    resolved).  MAP is the object containing the reloc.  */
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		  const Elf64_Rela *reloc,
a8db42b
 		  const Elf64_Sym *sym,
a8db42b
 		  const struct r_found_version *version,
a8db42b
@@ -414,10 +415,11 @@ elf_machine_rela (struct link_map *map,
a8db42b
       return;
a8db42b
   else
a8db42b
     {
a8db42b
-      struct link_map *sym_map;
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
 
a8db42b
       /* RESOLVE_MAP() will return NULL if it fail to locate the symbol.  */
a8db42b
-      if ((sym_map = RESOLVE_MAP (&sym, version, r_type)))
a8db42b
+      if (sym_map != NULL)
a8db42b
 	{
a8db42b
 	  value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
a8db42b
 
a8db42b
@@ -476,7 +478,7 @@ elf_machine_rela (struct link_map *map,
a8db42b
    can be skipped.  */
a8db42b
 #define ELF_MACHINE_REL_RELATIVE 1
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -489,9 +491,9 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 }
a8db42b
 
a8db42b
 /* Perform a RELATIVE reloc on the .got entry that transfers to the .plt.  */
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h
a8db42b
index 86a8c67e2a1b9f77..5e34c4784e348b19 100644
a8db42b
--- a/sysdeps/m68k/dl-machine.h
a8db42b
+++ b/sysdeps/m68k/dl-machine.h
a8db42b
@@ -68,7 +68,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   Elf32_Addr *got;
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word);
a8db42b
@@ -215,9 +216,10 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void __attribute__ ((unused, always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+static inline void __attribute__ ((unused, always_inline))
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -228,7 +230,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
   else
a8db42b
     {
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       switch (r_type)
a8db42b
@@ -303,7 +306,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__ ((unused, always_inline))
a8db42b
+static inline void __attribute__ ((unused, always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
 {
a8db42b
@@ -311,8 +314,8 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
   *reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__ ((unused, always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static inline void __attribute__ ((unused, always_inline))
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/microblaze/dl-machine.h b/sysdeps/microblaze/dl-machine.h
a8db42b
index e460f6f195561da1..3fd4988e6093be1c 100644
a8db42b
--- a/sysdeps/microblaze/dl-machine.h
a8db42b
+++ b/sysdeps/microblaze/dl-machine.h
a8db42b
@@ -69,7 +69,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word);
a8db42b
   extern void _dl_runtime_profile (Elf32_Word);
a8db42b
@@ -207,9 +208,10 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     ((unsigned short *)(rel_addr))[3] = (val) & 0xffff; \
a8db42b
   } while (0)
a8db42b
 
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -222,7 +224,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
   else
a8db42b
     {
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       value += reloc->r_addend;
a8db42b
@@ -277,7 +280,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
 {
a8db42b
@@ -285,8 +288,8 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
   PUT_REL_64 (reloc_addr, l_addr + reloc->r_addend);
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static inline void
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h
a8db42b
index d9c6d33d0cbf1f50..7a821ceb8e518cef 100644
a8db42b
--- a/sysdeps/mips/dl-machine.h
a8db42b
+++ b/sysdeps/mips/dl-machine.h
a8db42b
@@ -188,9 +188,9 @@ elf_machine_load_address (void)
a8db42b
 
a8db42b
 /* We can't rely on elf_machine_got_rel because _dl_object_relocation_scope
a8db42b
    fiddles with global data.  */
a8db42b
-#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info)			\
a8db42b
+#define ELF_MACHINE_BEFORE_RTLD_RELOC(bootstrap_map, dynamic_info)	\
a8db42b
 do {									\
a8db42b
-  struct link_map *map = BOOTSTRAP_MAP;					\
a8db42b
+  struct link_map *map = bootstrap_map;					\
a8db42b
   ElfW(Sym) *sym;							\
a8db42b
   ElfW(Addr) *got;							\
a8db42b
   int i, n;								\
a8db42b
@@ -475,11 +475,12 @@ elf_machine_plt_value (struct link_map *map, const ElfW(Rel) *reloc,
a8db42b
    by RELOC_ADDR.  SYM is the relocation symbol specified by R_INFO and
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_reloc (struct link_map *map, ElfW(Addr) r_info,
a8db42b
-		   const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
-		   void *reloc_addr, ElfW(Addr) r_addend, int inplace_p)
a8db42b
+elf_machine_reloc (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		   ElfW(Addr) r_info, const ElfW(Sym) *sym,
a8db42b
+		   const struct r_found_version *version, void *reloc_addr,
a8db42b
+		   ElfW(Addr) r_addend, int inplace_p)
a8db42b
 {
a8db42b
   const unsigned long int r_type = ELFW(R_TYPE) (r_info);
a8db42b
   ElfW(Addr) *addr_field = (ElfW(Addr) *) reloc_addr;
a8db42b
@@ -507,7 +508,8 @@ elf_machine_reloc (struct link_map *map, ElfW(Addr) r_info,
a8db42b
     case R_MIPS_TLS_TPREL32:
a8db42b
 # endif
a8db42b
       {
a8db42b
-	struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+	struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+						r_type);
a8db42b
 
a8db42b
 	switch (r_type)
a8db42b
 	  {
a8db42b
@@ -647,7 +649,7 @@ elf_machine_reloc (struct link_map *map, ElfW(Addr) r_info,
a8db42b
 	  _dl_signal_error (0, map->l_name, NULL,
a8db42b
 			    "found jump slot relocation with non-zero addend");
a8db42b
 
a8db42b
-	sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+	sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
 	value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 	*addr_field = value;
a8db42b
 
a8db42b
@@ -661,7 +663,7 @@ elf_machine_reloc (struct link_map *map, ElfW(Addr) r_info,
a8db42b
 	ElfW(Addr) value;
a8db42b
 
a8db42b
 	/* Calculate the address of the symbol.  */
a8db42b
-	sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+	sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
 	value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
 	if (__builtin_expect (sym == NULL, 0))
a8db42b
@@ -708,16 +710,17 @@ elf_machine_reloc (struct link_map *map, ElfW(Addr) r_info,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
a8db42b
-		 const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
-		 void *const reloc_addr, int skip_ifunc)
a8db42b
+elf_machine_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		 const ElfW(Rel) *reloc, const ElfW(Sym) *sym,
a8db42b
+		 const struct r_found_version *version, void *const reloc_addr,
a8db42b
+		 int skip_ifunc)
a8db42b
 {
a8db42b
-  elf_machine_reloc (map, reloc->r_info, sym, version, reloc_addr, 0, 1);
a8db42b
+  elf_machine_reloc (map, scope, reloc->r_info, sym, version, reloc_addr, 0, 1);
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__((always_inline))
a8db42b
 elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
a8db42b
 			  void *const reloc_addr)
a8db42b
@@ -725,9 +728,9 @@ elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
a8db42b
   /* XXX Nothing to do.  There is no relative relocation, right?  */
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
@@ -748,17 +751,17 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
     _dl_reloc_bad_type (map, r_type, 1);
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], const ElfW(Rela) *reloc,
a8db42b
 		  const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr, int skip_ifunc)
a8db42b
 {
a8db42b
-  elf_machine_reloc (map, reloc->r_info, sym, version, reloc_addr,
a8db42b
+  elf_machine_reloc (map, scope, reloc->r_info, sym, version, reloc_addr,
a8db42b
 		     reloc->r_addend, 0);
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__((always_inline))
a8db42b
 elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 			   void *const reloc_addr)
a8db42b
@@ -767,9 +770,9 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 
a8db42b
 #ifndef RTLD_BOOTSTRAP
a8db42b
 /* Relocate GOT. */
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__((always_inline))
a8db42b
-elf_machine_got_rel (struct link_map *map, int lazy)
a8db42b
+elf_machine_got_rel (struct link_map *map, struct r_scope_elem *scope[], int lazy)
a8db42b
 {
a8db42b
   ElfW(Addr) *got;
a8db42b
   ElfW(Sym) *sym;
a8db42b
@@ -782,7 +785,7 @@ elf_machine_got_rel (struct link_map *map, int lazy)
a8db42b
       const struct r_found_version *version __attribute__ ((unused))	  \
a8db42b
 	= vernum ? &map->l_versions[vernum[sym_index] & 0x7fff] : NULL;	  \
a8db42b
       struct link_map *sym_map;						  \
a8db42b
-      sym_map = RESOLVE_MAP (&ref, version, reloc);			  \
a8db42b
+      sym_map = RESOLVE_MAP (map, scope, &ref, version, reloc);		  \
a8db42b
       SYMBOL_ADDRESS (sym_map, ref, true);				  \
a8db42b
     })
a8db42b
 
a8db42b
@@ -868,9 +871,10 @@ elf_machine_got_rel (struct link_map *map, int lazy)
a8db42b
 /* Set up the loaded object described by L so its stub function
a8db42b
    will jump to the on-demand fixup code __dl_runtime_resolve.  */
a8db42b
 
a8db42b
-auto inline int
a8db42b
+static inline int
a8db42b
 __attribute__((always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
   ElfW(Addr) *got;
a8db42b
@@ -900,7 +904,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
     }
a8db42b
 
a8db42b
   /* Relocate global offset table.  */
a8db42b
-  elf_machine_got_rel (l, lazy);
a8db42b
+  elf_machine_got_rel (l, scope, lazy);
a8db42b
 
a8db42b
   /* If using PLTs, fill in the first two entries of .got.plt.  */
a8db42b
   if (l->l_info[DT_JMPREL] && lazy)
a8db42b
diff --git a/sysdeps/nios2/dl-machine.h b/sysdeps/nios2/dl-machine.h
a8db42b
index e000cd081f18a12b..4de602b13d5500f6 100644
a8db42b
--- a/sysdeps/nios2/dl-machine.h
a8db42b
+++ b/sysdeps/nios2/dl-machine.h
a8db42b
@@ -67,7 +67,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word);
a8db42b
 
a8db42b
@@ -234,10 +235,11 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
    LOADADDR is the load address of the object; INFO is an array indexed
a8db42b
    by DT_* of the .dynamic section info.  */
a8db42b
 
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
-                  const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
-                  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
+		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
a8db42b
@@ -249,7 +251,8 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
   else
a8db42b
     {
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       switch (r_type)
a8db42b
@@ -314,7 +317,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__((always_inline))
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
 elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
 {
a8db42b
@@ -322,8 +325,8 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
   *reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/powerpc/powerpc32/dl-machine.h b/sysdeps/powerpc/powerpc32/dl-machine.h
a8db42b
index b93cf486b6cda5fd..cda012dc1b822254 100644
a8db42b
--- a/sysdeps/powerpc/powerpc32/dl-machine.h
a8db42b
+++ b/sysdeps/powerpc/powerpc32/dl-machine.h
a8db42b
@@ -170,7 +170,7 @@ extern int __elf_machine_runtime_setup (struct link_map *map,
a8db42b
 					int lazy, int profile);
a8db42b
 
a8db42b
 static inline int
a8db42b
-elf_machine_runtime_setup (struct link_map *map,
a8db42b
+elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 			   int lazy, int profile)
a8db42b
 {
a8db42b
   if (map->l_info[DT_JMPREL] == 0)
a8db42b
@@ -284,9 +284,10 @@ extern void _dl_reloc_overflow (struct link_map *map,
a8db42b
    LOADADDR is the load address of the object; INFO is an array indexed
a8db42b
    by DT_* of the .dynamic section info.  */
a8db42b
 
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -315,7 +316,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
   else
a8db42b
     {
a8db42b
-      sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
       value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
     }
a8db42b
   value += reloc->r_addend;
a8db42b
@@ -439,7 +440,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
 {
a8db42b
@@ -447,8 +448,8 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
   *reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
a8db42b
index b3f3352bcf5a52b0..3f92fbb369eb5023 100644
a8db42b
--- a/sysdeps/powerpc/powerpc64/dl-machine.h
a8db42b
+++ b/sysdeps/powerpc/powerpc64/dl-machine.h
a8db42b
@@ -343,7 +343,8 @@ dl_platform_init (void)
a8db42b
 /* Set up the loaded object described by MAP so its unrelocated PLT
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 static inline int __attribute__ ((always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   if (map->l_info[DT_JMPREL])
a8db42b
     {
a8db42b
@@ -618,7 +619,7 @@ extern void attribute_hidden _dl_reloc_overflow (struct link_map *map,
a8db42b
 						 Elf64_Addr *const reloc_addr,
a8db42b
 						 const Elf64_Sym *refsym);
a8db42b
 
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
 {
a8db42b
@@ -627,7 +628,7 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 }
a8db42b
 
a8db42b
 /* This computes the value used by TPREL* relocs.  */
a8db42b
-auto inline Elf64_Addr __attribute__ ((always_inline, const))
a8db42b
+static inline Elf64_Addr __attribute__ ((always_inline, const))
a8db42b
 elf_machine_tprel (struct link_map *map,
a8db42b
 		   struct link_map *sym_map,
a8db42b
 		   const Elf64_Sym *sym,
a8db42b
@@ -646,7 +647,7 @@ elf_machine_tprel (struct link_map *map,
a8db42b
 }
a8db42b
 
a8db42b
 /* Call function at address VALUE (an OPD entry) to resolve ifunc relocs.  */
a8db42b
-auto inline Elf64_Addr __attribute__ ((always_inline))
a8db42b
+static inline Elf64_Addr __attribute__ ((always_inline))
a8db42b
 resolve_ifunc (Elf64_Addr value,
a8db42b
 	       const struct link_map *map, const struct link_map *sym_map)
a8db42b
 {
a8db42b
@@ -676,8 +677,8 @@ resolve_ifunc (Elf64_Addr value,
a8db42b
 
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully
a8db42b
    resolved).  MAP is the object containing the reloc.  */
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map,
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		  const Elf64_Rela *reloc,
a8db42b
 		  const Elf64_Sym *sym,
a8db42b
 		  const struct r_found_version *version,
a8db42b
@@ -705,7 +706,7 @@ elf_machine_rela (struct link_map *map,
a8db42b
 
a8db42b
   /* We need SYM_MAP even in the absence of TLS, for elf_machine_fixup_plt
a8db42b
      and STT_GNU_IFUNC.  */
a8db42b
-  struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+  struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
   Elf64_Addr value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
a8db42b
 
a8db42b
   if (sym != NULL
a8db42b
@@ -1035,8 +1036,8 @@ elf_machine_rela (struct link_map *map,
a8db42b
   MODIFIED_CODE_NOQUEUE (reloc_addr);
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+static inline void __attribute__ ((always_inline))
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
a8db42b
index 951268923da26a37..343c0feb6b437001 100644
a8db42b
--- a/sysdeps/riscv/dl-machine.h
a8db42b
+++ b/sysdeps/riscv/dl-machine.h
a8db42b
@@ -168,17 +168,18 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t t,
a8db42b
    by RELOC_ADDR.  SYM is the relocation symbol specified by R_INFO and
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
-		  const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr, int skip_ifunc)
a8db42b
 {
a8db42b
   ElfW(Addr) r_info = reloc->r_info;
a8db42b
   const unsigned long int r_type = ELFW (R_TYPE) (r_info);
a8db42b
   ElfW(Addr) *addr_field = (ElfW(Addr) *) reloc_addr;
a8db42b
   const ElfW(Sym) *const __attribute__ ((unused)) refsym = sym;
a8db42b
-  struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+  struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
   ElfW(Addr) value = 0;
a8db42b
   if (sym_map != NULL)
a8db42b
     value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
a8db42b
@@ -286,7 +287,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 			  void *const reloc_addr)
a8db42b
@@ -294,10 +295,11 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
   *(ElfW(Addr) *) reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map, ElfW(Addr) l_addr,
a8db42b
-		      const ElfW(Rela) *reloc, int skip_ifunc)
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
+		      int skip_ifunc)
a8db42b
 {
a8db42b
   ElfW(Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset);
a8db42b
   const unsigned int r_type = ELFW (R_TYPE) (reloc->r_info);
a8db42b
@@ -327,9 +329,10 @@ elf_machine_lazy_rel (struct link_map *map, ElfW(Addr) l_addr,
a8db42b
 /* Set up the loaded object described by L so its stub function
a8db42b
    will jump to the on-demand fixup code __dl_runtime_resolve.  */
a8db42b
 
a8db42b
-auto inline int
a8db42b
+static inline int
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
 #ifndef RTLD_BOOTSTRAP
a8db42b
   /* If using PLTs, fill in the first two entries of .got.plt.  */
a8db42b
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
a8db42b
index d0ccd69261c8f55b..96a5e80c846c816a 100644
a8db42b
--- a/sysdeps/s390/s390-32/dl-machine.h
a8db42b
+++ b/sysdeps/s390/s390-32/dl-machine.h
a8db42b
@@ -85,7 +85,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((unused))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word);
a8db42b
   extern void _dl_runtime_profile (Elf32_Word);
a8db42b
@@ -321,10 +322,11 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -357,7 +359,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
       /* Only needed for R_390_COPY below.  */
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
 #endif
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       if (sym != NULL
a8db42b
@@ -484,7 +487,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -493,9 +496,9 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
   *reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
a8db42b
index 543361c83637c071..c94d09b9c8512738 100644
a8db42b
--- a/sysdeps/s390/s390-64/dl-machine.h
a8db42b
+++ b/sysdeps/s390/s390-64/dl-machine.h
a8db42b
@@ -75,7 +75,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((unused))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   extern void _dl_runtime_resolve (Elf64_Word);
a8db42b
   extern void _dl_runtime_profile (Elf64_Word);
a8db42b
@@ -268,10 +269,11 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
-		  const Elf64_Sym *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf64_Rela *reloc, const Elf64_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf64_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -304,7 +306,8 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
       /* Only needed for R_390_COPY below.  */
a8db42b
       const Elf64_Sym *const refsym = sym;
a8db42b
 #endif
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       Elf64_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       if (sym != NULL
a8db42b
@@ -438,7 +441,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -447,9 +450,9 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
   *reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h
a8db42b
index 122b417a17e2ef9b..0c22dfd8487a516e 100644
a8db42b
--- a/sysdeps/sh/dl-machine.h
a8db42b
+++ b/sysdeps/sh/dl-machine.h
a8db42b
@@ -69,7 +69,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((unused, always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   Elf32_Addr *got;
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word);
a8db42b
@@ -259,10 +260,11 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -318,7 +320,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
   else
a8db42b
     {
a8db42b
       const Elf32_Sym *const refsym = sym;
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
 
a8db42b
       value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
       value += reloc->r_addend;
a8db42b
@@ -424,7 +427,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -443,9 +446,9 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 #undef COPY_UNALIGNED_WORD
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h
a8db42b
index 0269e458ea2b3bca..6361cfae9eb8fa58 100644
a8db42b
--- a/sysdeps/sparc/sparc32/dl-machine.h
a8db42b
+++ b/sysdeps/sparc/sparc32/dl-machine.h
a8db42b
@@ -97,7 +97,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   Elf32_Addr *plt;
a8db42b
   extern void _dl_runtime_resolve (Elf32_Word);
a8db42b
@@ -327,10 +328,11 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
-		  const Elf32_Sym *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf32_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -381,7 +383,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
   else
a8db42b
     {
a8db42b
-      sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
       value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
     }
a8db42b
 #else
a8db42b
@@ -536,7 +538,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -545,9 +547,9 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
   *reloc_addr += l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h
a8db42b
index bbd4566d8a595f93..3fd18c6e5ef21e38 100644
a8db42b
--- a/sysdeps/sparc/sparc64/dl-machine.h
a8db42b
+++ b/sysdeps/sparc/sparc64/dl-machine.h
a8db42b
@@ -126,7 +126,8 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   if (l->l_info[DT_JMPREL] && lazy)
a8db42b
     {
a8db42b
@@ -354,10 +355,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
-		  const Elf64_Sym *sym, const struct r_found_version *version,
a8db42b
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		  const Elf64_Rela *reloc, const Elf64_Sym *sym,
a8db42b
+		  const struct r_found_version *version,
a8db42b
 		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
 {
a8db42b
   Elf64_Addr *const reloc_addr = reloc_addr_arg;
a8db42b
@@ -408,7 +410,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
     }
a8db42b
   else
a8db42b
     {
a8db42b
-      sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
a8db42b
       value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
     }
a8db42b
 #else
a8db42b
@@ -646,7 +648,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -655,9 +657,9 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
   *reloc_addr = l_addr + reloc->r_addend;
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute__ ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      Elf64_Addr l_addr, const Elf64_Rela *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
a8db42b
index a8596aa3fa489eff..d3fcbb37bf1f4f7c 100644
a8db42b
--- a/sysdeps/x86_64/dl-machine.h
a8db42b
+++ b/sysdeps/x86_64/dl-machine.h
a8db42b
@@ -62,7 +62,8 @@ elf_machine_load_address (void)
a8db42b
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
a8db42b
 
a8db42b
 static inline int __attribute__ ((unused, always_inline))
a8db42b
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
a8db42b
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
a8db42b
+			   int lazy, int profile)
a8db42b
 {
a8db42b
   Elf64_Addr *got;
a8db42b
   extern void _dl_runtime_resolve_fxsave (ElfW(Word)) attribute_hidden;
a8db42b
@@ -258,12 +259,11 @@ elf_machine_plt_value (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
a8db42b
    MAP is the object containing the reloc.  */
a8db42b
 
a8db42b
-auto inline void
a8db42b
-__attribute__ ((always_inline))
a8db42b
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
-		  const ElfW(Sym) *sym, const struct r_found_version *version,
a8db42b
-		  void *const reloc_addr_arg, int skip_ifunc)
a8db42b
-{
a8db42b
+static inline void __attribute__((always_inline))
a8db42b
+elf_machine_rela(struct link_map *map, struct r_scope_elem *scope[],
a8db42b
+		 const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
a8db42b
+		 const struct r_found_version *version,
a8db42b
+		 void *const reloc_addr_arg, int skip_ifunc) {
a8db42b
   ElfW(Addr) *const reloc_addr = reloc_addr_arg;
a8db42b
   const unsigned long int r_type = ELFW(R_TYPE) (reloc->r_info);
a8db42b
 
a8db42b
@@ -300,7 +300,8 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
a8db42b
 # ifndef RTLD_BOOTSTRAP
a8db42b
       const ElfW(Sym) *const refsym = sym;
a8db42b
 # endif
a8db42b
-      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
a8db42b
+      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
a8db42b
+					      r_type);
a8db42b
       ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true);
a8db42b
 
a8db42b
       if (sym != NULL
a8db42b
@@ -525,7 +526,7 @@ and creates an unsatisfiable circular dependency.\n",
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute ((always_inline))
a8db42b
 elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 			   void *const reloc_addr_arg)
a8db42b
@@ -544,9 +545,9 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
     }
a8db42b
 }
a8db42b
 
a8db42b
-auto inline void
a8db42b
+static inline void
a8db42b
 __attribute ((always_inline))
a8db42b
-elf_machine_lazy_rel (struct link_map *map,
a8db42b
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
a8db42b
 		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
a8db42b
 		      int skip_ifunc)
a8db42b
 {
a8db42b
@@ -580,7 +581,7 @@ elf_machine_lazy_rel (struct link_map *map,
a8db42b
 
a8db42b
       /* Always initialize TLS descriptors completely at load time, in
a8db42b
 	 case static TLS is allocated for it that requires locking.  */
a8db42b
-      elf_machine_rela (map, reloc, sym, version, reloc_addr, skip_ifunc);
a8db42b
+      elf_machine_rela (map, scope, reloc, sym, version, reloc_addr, skip_ifunc);
a8db42b
     }
a8db42b
   else if (__glibc_unlikely (r_type == R_X86_64_IRELATIVE))
a8db42b
     {