---
 elf/dl-fptr.c             |   18 +++++++++++++++++-
 sysdeps/generic/dl-fptr.h |    3 +++
 2 files changed, 20 insertions(+), 1 deletion(-)

--- a/elf/dl-fptr.c
+++ b/elf/dl-fptr.c
@@ -55,7 +55,12 @@
   }
 local =
   {
+#ifndef SHARED
     .root = &local.boot_table,
+#else
+    /* Address of .boot_table is not known until runtime.  */
+    .root = 0,
+#endif
     .npages = 2,
     .boot_table =
       {
@@ -92,6 +97,17 @@
   return new_table;
 }
 
+/* Must call _dl_fptr_init before using any other function.  */
+void
+_dl_fptr_init (void)
+{
+  struct local *l;
+
+  ELF_MACHINE_LOAD_ADDRESS (l, local);
+  /* Initialize root once.  */
+  if (__builtin_expect (l->root == 0, 0))
+    l->root = &l->boot_table;
+}
 
 static ElfW(Addr)
 make_fdesc (ElfW(Addr) ip, ElfW(Addr) gp)
--- a/sysdeps/generic/dl-fptr.h
+++ b/sysdeps/generic/dl-fptr.h
@@ -39,6 +39,9 @@
 
 extern ElfW(Addr) _dl_boot_fptr_table [];
 
+/* Must be called before any other function.  */
+extern void _dl_fptr_init (void);
+
 extern ElfW(Addr) _dl_make_fptr (struct link_map *, const ElfW(Sym) *,
 				 ElfW(Addr));
 
