Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 21 Jul 2000 05:07:54 +0000 (05:07 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 21 Jul 2000 05:07:54 +0000 (05:07 +0000)
* elf/dl-load.c (_dl_map_object): Implement handling of
DF_1_NODEFLIB.

ChangeLog
elf/dl-load.c

index 7c13984..ecd6fd7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2000-07-20  Ulrich Drepper  <drepper@redhat.com>
 
+       * elf/dl-load.c (_dl_map_object): Implement handling of
+       DF_1_NODEFLIB.
+
        * elf/Makefile: Add no modules for nodelete test.
        * elf/nodelmod3.c: New file.
        * elf/nodelmod4.c: New file.
index 1e5ad50..5e714af 100644 (file)
@@ -1467,21 +1467,48 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
          const char *cached = _dl_load_cache_lookup (name);
          if (cached)
            {
-             fd = __open (cached, O_RDONLY);
-             if (fd != -1)
+             /* If the loader has the DF_1_NODEFLIB flag set we must not
+                use a cache entry from any of these directories.  */
+             if (__builtin_expect (loader->l_flags_1 & DF_1_NODEFLIB, 0))
+               {
+                 const char *dirp = system_dirs;
+                 int cnt = 0;
+
+                 do
+                   {
+                     if (memcmp (cached, dirp, system_dirs_len[cnt]) == 0)
+                       {
+                         /* The prefix matches.  Don't use the entry.  */
+                         cached = NULL;
+                         break;
+                       }
+
+                     dirp += system_dirs_len[cnt] + 1;
+                     ++cnt;
+                   }
+                 while (cnt < (sizeof (system_dirs_len)
+                               / sizeof (system_dirs_len[0])));
+               }
+
+             if (cached)
                {
-                 realname = local_strdup (cached);
-                 if (realname == NULL)
+                 fd = __open (cached, O_RDONLY);
+                 if (fd != -1)
                    {
-                     __close (fd);
-                     fd = -1;
+                     realname = local_strdup (cached);
+                     if (realname == NULL)
+                       {
+                         __close (fd);
+                         fd = -1;
+                       }
                    }
                }
            }
        }
 
       /* Finally, try the default path.  */
-      if (fd == -1)
+      if (fd == -1
+         && __builtin_expect (!(loader->l_flags_1 & DF_1_NODEFLIB), 1))
        fd = open_path (name, namelen, preloaded, &rtld_search_dirs,
                        &realname);