diff --git a/elf/dl-load.c b/elf/dl-load.c
index 5835506d..ac76257b 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -101,6 +101,7 @@ int __stack_prot attribute_hidden attribute_relro
 
 /* This is the decomposed LD_LIBRARY_PATH search path.  */
 struct r_search_path_struct __rtld_env_path_list attribute_relro;
+struct r_search_path_struct __rtld_env_fallback_path_list attribute_relro;
 
 /* List of the hardware capabilities we might end up using.  */
 #ifdef SHARED
@@ -701,6 +702,7 @@ cache_rpath (struct link_map *l,
 
 void
 _dl_init_paths (const char *llp, const char *source,
+		const char *fallback_llp,
 		const char *glibc_hwcaps_prepend,
 		const char *glibc_hwcaps_mask)
 {
@@ -854,6 +856,34 @@ _dl_init_paths (const char *llp, const char *source,
     }
   else
     __rtld_env_path_list.dirs = (void *) -1;
+
+  if (fallback_llp != NULL && *fallback_llp != '\0')
+    {
+      char *fallback_llp_tmp = strdupa (fallback_llp);
+      size_t nfallback_llp = 1;
+      for (const char *cp = fallback_llp_tmp; *cp != '\0'; ++cp)
+	if (*cp == ':' || *cp == ';')
+	  ++nfallback_llp;
+
+      __rtld_env_path_list.dirs = (struct r_search_path_elem **)
+	malloc ((nfallback_llp + 1) * sizeof (struct r_search_path_elem *));
+      if (__rtld_env_path_list.dirs == NULL)
+	{
+	  errstring = N_("cannot create cache for fallback search path");
+	  goto signal_error;
+	}
+      (void) fillin_rpath (fallback_llp_tmp, __rtld_env_path_list.dirs, ":;",
+			   source, NULL, l);
+      if (__rtld_env_path_list.dirs[0] == NULL)
+	{
+	  free (__rtld_env_path_list.dirs);
+	  __rtld_env_path_list.dirs = (void *) -1;
+	}
+
+      __rtld_env_path_list.malloced = 0;
+    }
+  else
+    __rtld_env_path_list.dirs = (void *) -1;
 }
 
 
@@ -2171,6 +2201,13 @@ _dl_map_object (struct link_map *loader, const char *name,
 	fd = open_path (name, namelen, mode, &__rtld_search_dirs,
 			&realname, &fb, l, LA_SER_DEFAULT, &found_other_class);
 
+      /* Try the LD_FALLBACK_LIBRARY_PATH environment variable.  */
+      if (fd == -1 && __rtld_env_fallback_path_list.dirs != (void *) -1)
+	fd = open_path (name, namelen, mode, &__rtld_env_fallback_path_list,
+			&realname, &fb,
+			loader ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded,
+			LA_SER_FALLBACK, &found_other_class);
+
       /* Add another newline when we are tracing the library loading.  */
       if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
 	_dl_debug_printf ("\n");
diff --git a/elf/dl-main.h b/elf/dl-main.h
index 36816f63..e57bb467 100644
--- a/elf/dl-main.h
+++ b/elf/dl-main.h
@@ -78,6 +78,8 @@ struct dl_main_state
   /* Where library_path comes from.  LD_LIBRARY_PATH or --library-path.  */
   const char *library_path_source;
 
+  const char *fallback_library_path;
+
   /* The list preloaded objects from LD_PRELOAD.  */
   const char *preloadlist;
 
@@ -107,6 +109,7 @@ static inline void
 call_init_paths (const struct dl_main_state *state)
 {
   _dl_init_paths (state->library_path, state->library_path_source,
+                  state->fallback_library_path,
                   state->glibc_hwcaps_prepend, state->glibc_hwcaps_mask);
 }
 
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 451932dd..c173c7c2 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -300,6 +300,7 @@ _dl_non_dynamic_init (void)
   /* Initialize the data structures for the search paths for shared
      objects.  */
   _dl_init_paths (getenv ("LD_LIBRARY_PATH"), "LD_LIBRARY_PATH",
+		  NULL,
 		  /* No glibc-hwcaps selection support in statically
 		     linked binaries.  */
 		  NULL, NULL);
diff --git a/elf/link.h b/elf/link.h
index 367d694d..ec9d1fb0 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -130,6 +130,7 @@ enum
     LA_SER_LIBPATH = 0x02,	/* Directory from LD_LIBRARY_PATH.  */
     LA_SER_RUNPATH = 0x04,	/* Directory from RPATH/RUNPATH.  */
     LA_SER_CONFIG = 0x08,	/* Found through ldconfig.  */
+    LA_SER_FALLBACK = 0x10,	/* Directory from LD_FALLBACK_LIBRARY_PATH.  */
     LA_SER_DEFAULT = 0x40,	/* Default directory.  */
     LA_SER_SECURE = 0x80	/* Unused.  */
   };
diff --git a/elf/rtld.c b/elf/rtld.c
index 3ca9a110..b4404223 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -295,6 +295,7 @@ dl_main_state_init (struct dl_main_state *state)
   audit_list_init (&state->audit_list);
   state->library_path = NULL;
   state->library_path_source = NULL;
+  state->fallback_library_path = NULL;
   state->preloadlist = NULL;
   state->preloadarg = NULL;
   state->glibc_hwcaps_prepend = NULL;
@@ -2720,6 +2721,13 @@ process_envvars_default (struct dl_main_state *state)
 		= _dl_strtoul (&envline[21], NULL) > 1;
 	    }
 	  break;
+
+	case 21:
+	  if (memcmp (envline, "FALLBACK_LIBRARY_PATH", 21) == 0)
+	    {
+	      state->fallback_library_path = &envline[22];
+	      break;
+	    }
 	}
     }
 
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 259ce2e7..c78c39d2 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -1077,6 +1077,7 @@ extern struct r_debug *_dl_debug_update (Lmid_t ns) attribute_hidden;
    search.  GLIBC_HWCAPS_MASK is used to filter the built-in
    subdirectories if not NULL.  */
 extern void _dl_init_paths (const char *library_path, const char *source,
+			    const char *fallback_library_path,
 			    const char *glibc_hwcaps_prepend,
 			    const char *glibc_hwcaps_mask)
   attribute_hidden;
