]> sourceware.org Git - glibc.git/commitdiff
* elf/dl-load.c (_dl_map_object_from_fd): Don't check DF_STATIC_TLS.
authorRoland McGrath <roland@gnu.org>
Thu, 17 Oct 2002 12:10:17 +0000 (12:10 +0000)
committerRoland McGrath <roland@gnu.org>
Thu, 17 Oct 2002 12:10:17 +0000 (12:10 +0000)
* elf/dl-reloc.c (_dl_relocate_object: CHECK_STATIC_TLS): New macro
to signal error if an IE-model TLS reloc resolved to a dlopen'd module.
* sysdeps/i386/dl-machine.h (elf_machine_rel, elf_machine_rela):
Call it after performing TPOFF relocs.
* sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise.
* sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise.
* elf/dl-conflict.c (CHECK_STATIC_TLS): New macro (no-op).

* elf/dl-close.c (remove_slotinfo): Change asserts so as not to crash
when closing a partially-initialized object.

* elf/dl-load.c (_dl_map_object_from_fd) [! USE_TLS]: Call lose
instead of _dl_fatal_printf when we see PT_TLS.

ChangeLog
elf/dl-close.c
elf/dl-conflict.c
elf/dl-load.c
elf/dl-reloc.c
linuxthreads/ChangeLog
linuxthreads/Makefile
linuxthreads/unload.c
sysdeps/i386/dl-machine.h
sysdeps/sh/dl-machine.h
sysdeps/x86_64/dl-machine.h

index 8078d0e247564f440a5f9029a8c8910ebc6c2f0f..6ff6beb076ab9fb140d9be3306fb4afdcac58af2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 2002-10-17  Roland McGrath  <roland@redhat.com>
 
+       * elf/dl-load.c (_dl_map_object_from_fd): Don't check DF_STATIC_TLS.
+       * elf/dl-reloc.c (_dl_relocate_object: CHECK_STATIC_TLS): New macro
+       to signal error if an IE-model TLS reloc resolved to a dlopen'd module.
+       * sysdeps/i386/dl-machine.h (elf_machine_rel, elf_machine_rela):
+       Call it after performing TPOFF relocs.
+       * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise.
+       * sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise.
+       * elf/dl-conflict.c (CHECK_STATIC_TLS): New macro (no-op).
+
+       * elf/dl-close.c (remove_slotinfo): Change asserts so as not to crash
+       when closing a partially-initialized object.
+
+       * elf/dl-load.c (_dl_map_object_from_fd) [! USE_TLS]: Call lose
+       instead of _dl_fatal_printf when we see PT_TLS.
+
        * Makeconfig (CPPFLAGS): Fix last change to use $(libof-$(<F))
        instead of $(libof-$<).
 
index b7b267e2bfac211d73e7b42bd80e943d883ebb44..7655ef433eba9a4c7fe71805df6657809f62044a 100644 (file)
@@ -53,18 +53,22 @@ remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp)
   else
     {
       struct link_map *old_map = listp->slotinfo[idx - disp].map;
-      assert (old_map != NULL);
 
-      /* Mark the entry as unused.  */
-      listp->slotinfo[idx - disp].gen = GL(dl_tls_generation) + 1;
-      listp->slotinfo[idx - disp].map = NULL;
+      /* The entry might still be in its unused state if we are closing an
+        object that wasn't fully set up.  */
+      if (__builtin_expect (old_map != NULL, 1))
+       {
+         assert (old_map->l_tls_modid == idx);
+
+         /* Mark the entry as unused. */
+         listp->slotinfo[idx - disp].gen = GL(dl_tls_generation) + 1;
+         listp->slotinfo[idx - disp].map = NULL;
+       }
 
       /* If this is not the last currently used entry no need to look
         further.  */
-      if (old_map->l_tls_modid != GL(dl_tls_max_dtv_idx))
+      if (idx != GL(dl_tls_max_dtv_idx))
        return true;
-
-      assert (old_map->l_tls_modid == GL(dl_tls_max_dtv_idx));
     }
 
   while (idx - disp > disp == 0 ? 1 + GL(dl_tls_static_nelem) : 0)
index e38deee9def73f796e9731022aaf57b9c18b0bd1..ae091abd27001de61a5ce631a422e239ed2d6e2e 100644 (file)
@@ -44,6 +44,7 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
     /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
 #define RESOLVE_MAP(ref, version, flags) (*ref = NULL, NULL)
 #define RESOLVE(ref, version, flags) (*ref = NULL, 0)
+#define CHECK_STATIC_TLS(ref_map, sym_map) ((void) 0)
 #define RESOLVE_CONFLICT_FIND_MAP(map, r_offset) \
   do {                                                                       \
     while ((resolve_conflict_map->l_map_end < (ElfW(Addr)) (r_offset))       \
index db9391ea66152bfaf70fcbd34850b0991be9ae75..2f2a9be56650fa21711a7aa4a938bef11d095d81 100644 (file)
@@ -957,7 +957,9 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
 #else
          /* Uh-oh, the binary expects TLS support but we cannot
             provide it.  */
-         _dl_fatal_printf ("cannot handle file '%s' with TLS data\n", name);
+         errval = 0;
+         errstring = N_("cannot handle TLS data");
+         goto call_lose;
 #endif
          break;
        }
@@ -1173,11 +1175,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
 
   /* Make sure we are not dlopen'ing an object
      that has the DF_1_NOOPEN flag set.  */
-  if ((__builtin_expect (l->l_flags_1 & DF_1_NOOPEN, 0)
-#ifdef USE_TLS
-       || __builtin_expect (l->l_flags & DF_STATIC_TLS, 0)
-#endif
-       )
+  if (__builtin_expect (l->l_flags_1 & DF_1_NOOPEN, 0)
       && (mode & __RTLD_DLOPEN))
     {
       /* We are not supposed to load this object.  Free all resources.  */
index 37d1ee019f75cc39a3d9cc46e7d7a963d65a919c..d6db62b11e52397a4ba9d7f615c0630258200bde 100644 (file)
@@ -159,6 +159,15 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
             l->l_lookup_cache.value = _lr; }))                               \
      : l->l_addr)
 
+#define CHECK_STATIC_TLS(map, sym_map)                                       \
+    do {                                                                     \
+      if (__builtin_expect ((sym_map)->l_tls_offset == 0, 0))                \
+       {                                                                     \
+         errstring = N_("shared object cannot be dlopen()ed");               \
+         INTUSE(_dl_signal_error) (0, (map)->l_name, NULL, errstring);       \
+       }                                                                     \
+    } while (0)
+
 #include "dynamic-link.h"
 
     ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
index 71b00fa253ef126d13a97c4b74832c3388128dfb..6b185a02e8581d9df15d3b828477f5efb411bf18 100644 (file)
@@ -1,3 +1,9 @@
+2002-10-17  Roland McGrath  <roland@redhat.com>
+
+       * Makefile (unload): Don't link in libpthread.so.
+       ($(objpfx)unload.out): Do depend on it.
+       * unload.c (main): Improve error reporting.
+
 2002-10-09  Roland McGrath  <roland@redhat.com>
 
        * sysdeps/pthread/bits/libc-lock.h (__libc_maybe_call): New macro.
index 230c75f4f67d39478fe46d8eaf72928712f51e42..772c6914754625ab3295ea604e81083651175ed0 100644 (file)
@@ -98,10 +98,11 @@ $(objpfx)libpthread.so: $(common-objpfx)libc.so \
 # Make sure we link with the thread library.
 ifeq ($(build-shared),yes)
 $(addprefix $(objpfx), \
-  $(filter-out $(tests-static), \
+  $(filter-out $(tests-static) unload, \
     $(tests) $(test-srcs))): $(objpfx)libpthread.so
 $(addprefix $(objpfx),$(librt-tests)): $(common-objpfx)rt/librt.so
 $(objpfx)unload: $(common-objpfx)dlfcn/libdl.so
+$(objpfx)unload.out: $(objpfx)libpthread.so
 else
 $(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a
 $(addprefix $(objpfx),$(librt-tests)): $(common-objpfx)rt/librt.a
index ca949196b439101034a3437a695ba42418229dac..234d27f904352d56ded2e7baec4d0bc7d93805f1 100644 (file)
@@ -1,5 +1,5 @@
 /* Tests for non-unloading of libpthread.
-   Copyright (C) 2000 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2002 Free Software Foundation, Inc.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2000.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -29,13 +29,13 @@ main (void)
 
   if (p == NULL)
     {
-      puts ("failed to load " LIBPTHREAD_SO);
+      printf ("failed to load %s: %s\n", LIBPTHREAD_SO, dlerror ());
       exit (1);
     }
 
   if (dlclose (p) != 0)
     {
-      puts ("dlclose (" LIBPTHREAD_SO ") failed");
+      printf ("dlclose (%s) failed: %s\n", LIBPTHREAD_SO, dlerror ());
       exit (1);
     }
 
index 6f60cf3af0358189614a90544db8d141d6a56907..60122c53242f6e0dbf1ef792a0be2a56089ad4ed 100644 (file)
@@ -432,6 +432,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
             Therefore the offset is already correct.  */
          if (sym != NULL)
            *reloc_addr = sym->st_value;
+         CHECK_STATIC_TLS (map, sym_map);
 # endif
          break;
        case R_386_TLS_TPOFF32:
@@ -445,6 +446,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
             block we subtract the offset from that of the TLS block.  */
          if (sym != NULL)
            *reloc_addr += sym_map->l_tls_offset - sym->st_value;
+         CHECK_STATIC_TLS (map, sym_map);
 # endif
          break;
        case R_386_TLS_TPOFF:
@@ -457,6 +459,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
             thread pointer.  */
          if (sym != NULL)
            *reloc_addr += sym->st_value - sym_map->l_tls_offset;
+         CHECK_STATIC_TLS (map, sym_map);
 # endif
          break;
 #endif /* use TLS */
@@ -549,6 +552,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
          *reloc_addr
            = (sym == NULL ? 0 : sym_map->l_tls_offset - sym->st_value)
              + reloc->r_addend;
+         CHECK_STATIC_TLS (map, sym_map);
          break;
        case R_386_TLS_TPOFF:
          /* The offset is negative, forward from the thread pointer.  */
@@ -558,6 +562,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
          *reloc_addr
            = (sym == NULL ? 0 : sym->st_value - sym_map->l_tls_offset)
              + reloc->r_addend;
+         CHECK_STATIC_TLS (map, sym_map);
          break;
 #endif /* use TLS */
        default:
index 5e264d3cdd44ba194c9912f3a97c0868824c099f..c6d094d26a95f6340a31e41e4d61028230ed06b8 100644 (file)
@@ -582,6 +582,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
          *reloc_addr
            = ((sym == NULL ? 0 : sym_map->l_tls_offset + sym->st_value)
               + reloc->r_addend);
+         CHECK_STATIC_TLS (map, sym_map);
 # endif
          break;
 #endif /* use TLS */
index 740d6b7feb36a8c88cb25cb734011a81318cd486..118a4b75b5c6948137a95a833f78cd6eefc96cfa 100644 (file)
@@ -428,11 +428,16 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
 # ifndef RTLD_BOOTSTRAP
          if (sym != NULL)
 # endif
-           /* We know the offset of the object the symbol is contained in.
-              It is a negative value which will be added to the
-              thread pointer.  */
-           *reloc_addr = (sym->st_value + reloc->r_addend
-                          - sym_map->l_tls_offset);
+           {
+             /* We know the offset of the object the symbol is contained in.
+                It is a negative value which will be added to the
+                thread pointer.  */
+             *reloc_addr = (sym->st_value + reloc->r_addend
+                            - sym_map->l_tls_offset);
+# ifndef RTLD_BOOTSTRAP
+             CHECK_STATIC_TLS (map, sym_map);
+# endif
+           }
          break;
 #endif /* use TLS */
 
This page took 0.055014 seconds and 5 git commands to generate.