Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 21 Jul 2000 06:43:05 +0000 (06:43 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 21 Jul 2000 06:43:05 +0000 (06:43 +0000)
* elf/rtld.c: Define _dl_bind_not variable.
(process_envvars): Recognize LD_BIND_NOT and set _dl_bind_not.
* elf/dl-support.c: Likewise.
* sysdeps/generic/ldsodefs.h: Declare _dl_bind_not.
* elf/dl-runtime.c (fixup): Don't remember looked up value if
_dl_bind_not.
(profile_fixup): Likewise.

ChangeLog
elf/dl-runtime.c
elf/dl-support.c
elf/rtld.c
sysdeps/generic/ldsodefs.h

index 47ee8b7..5d9be22 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2000-07-20  Ulrich Drepper  <drepper@redhat.com>
 
+       * elf/rtld.c: Define _dl_bind_not variable.
+       (process_envvars): Recognize LD_BIND_NOT and set _dl_bind_not.
+       * elf/dl-support.c: Likewise.
+       * sysdeps/generic/ldsodefs.h: Declare _dl_bind_not.
+       * elf/dl-runtime.c (fixup): Don't remember looked up value if
+       _dl_bind_not.
+       (profile_fixup): Likewise.
+
        * libio/Makefile (routines): Add fwide.
        * libio/iofwide.c (_IO_fwide): Remove locking.  This is done in
        fwide now.  Internal calls to _IO_fwide must do locking themselves
index bff27e7..5774609 100644 (file)
@@ -117,6 +117,9 @@ fixup (
   value = elf_machine_plt_value (l, reloc, value);
 
   /* Finally, fix up the plt itself.  */
+  if (__builtin_expect (_dl_bind_not, 0))
+    return value;
+
   return elf_machine_fixup_plt (l, result, reloc, rel_addr, value);
 }
 #endif
@@ -205,7 +208,8 @@ profile_fixup (
       value = elf_machine_plt_value (l, reloc, value);
 
       /* Store the result for later runs.  */
-      *resultp = value;
+      if (__builtin_expect (! _dl_bind_not, 1))
+       *resultp = value;
     }
 
   (*mcount_fct) (retaddr, value);
index 8b11039..ec0bbb2 100644 (file)
@@ -67,6 +67,9 @@ void *__libc_stack_end;
 /* Path where the binary is found.  */
 const char *_dl_origin_path;
 
+/* Nonzero if runtime lookup should not update the .got/.plt.  */
+int _dl_bind_not;
+
 /* Initially empty list of loaded objects.  */
 struct link_map *_dl_loaded;
 
@@ -109,6 +112,8 @@ non_dynamic_init (void)
 
   _dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
 
+  _dl_bind_not = *(getenv ("LD_BIND_NOT") ?: "") != '\0';
+
   _dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0';
 
 #ifdef DL_PLATFORM_INIT
index 8276b79..1d144c5 100644 (file)
@@ -96,6 +96,7 @@ int _dl_debug_statistics;
 const char *_dl_inhibit_rpath;         /* RPATH values which should be
                                           ignored.  */
 const char *_dl_origin_path;
+int _dl_bind_not;
 
 /* This is a pointer to the map for the main object and through it to
    all loaded objects.  */
@@ -1363,7 +1364,12 @@ process_envvars (enum mode *modep, int *lazyp)
        case 8:
          /* Do we bind early?  */
          if (memcmp (&envline[3], "BIND_NOW", 8) == 0)
-           bind_now = envline[12] != '\0';
+           {
+             bind_now = envline[12] != '\0';
+             break;
+           }
+         if (memcmp (&envline[3], "BIND_NOT", 8) == 0)
+           _dl_bind_not = envline[12] != '\0';
          break;
 
        case 9:
index 2f81770..b4b01e8 100644 (file)
@@ -195,6 +195,9 @@ extern int _dl_dynamic_weak;
 /* The array with message we print as a last resort.  */
 extern const char _dl_out_of_memory[];
 
+/* Nonzero if runtime lookups should not update the .got/.plt.  */
+extern int _dl_bind_not;
+
 /* OS-dependent function to open the zero-fill device.  */
 extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */