about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2004-10-14 09:57:42 +0000
committerJakub Jelinek <jakub@redhat.com>2004-10-14 09:57:42 +0000
commit82496aab644f7acdce3f3a693f3c78723b175124 (patch)
tree8af7cfab391cc287beb7bab09f472bfd14fd7f07 /elf
parent9869e6ec913e268748f510ab6ec64b8fd62531bc (diff)
downloadglibc-82496aab644f7acdce3f3a693f3c78723b175124.tar.gz
glibc-82496aab644f7acdce3f3a693f3c78723b175124.tar.xz
glibc-82496aab644f7acdce3f3a693f3c78723b175124.zip
2.3.3-68
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-close.c2
-rw-r--r--elf/dl-load.c2
-rw-r--r--elf/rtld.c37
3 files changed, 25 insertions, 16 deletions
diff --git a/elf/dl-close.c b/elf/dl-close.c
index 4f015fd6df..c823b17642 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -237,7 +237,7 @@ _dl_close (void *_map)
 				struct link_map *rl = depmap->l_initfini[k];
 
 				if (rl->l_idx < nopencount
-				    & list[rl->l_idx] == rl)
+				    && list[rl->l_idx] == rl)
 				  {
 				    assert (new_opencount[rl->l_idx] > 0);
 				    if (--new_opencount[rl->l_idx] ==  0)
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 83d46f04ee..27f6e3f641 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -909,7 +909,9 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
   l = _dl_new_object (realname, name, l_type, loader, mode, nsid);
   if (__builtin_expect (l == NULL, 0))
     {
+#ifdef SHARED
     fail_new:
+#endif
       errstring = N_("cannot create shared object descriptor");
       goto call_lose_errno;
     }
diff --git a/elf/rtld.c b/elf/rtld.c
index 2039a77e2e..4adbb437bf 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -537,7 +537,7 @@ _dl_start (void *arg)
 # define ELF_MACHINE_START_ADDRESS(map, start) (start)
 #endif
 
-    return ELF_MACHINE_START_ADDRESS (GL(dl_loaded), entry);
+    return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, entry);
   }
 }
 
@@ -1090,32 +1090,36 @@ of this helper program; chances are you did not intend to run this program.\n\
 #if defined(__i386__)
   /* Force non-TLS libraries for glibc 2.0 binaries
      or if a buggy binary references non-TLS errno or h_errno.  */
-  if (__builtin_expect (GL(dl_loaded)->l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)] == NULL, 0)
-      && GL(dl_loaded)->l_info[DT_DEBUG])
+  if (__builtin_expect (main_map->l_info[DT_NUM + DT_THISPROCNUM
+                                         + DT_VERSIONTAGIDX (DT_VERNEED)]
+                        == NULL, 0)
+      && main_map->l_info[DT_DEBUG])
     GLRO(dl_osversion) = 0x20205;
   else if ((__builtin_expect (mode, normal) != normal
-	    || GL(dl_loaded)->l_info [ADDRIDX (DT_GNU_LIBLIST)] == NULL)
+	    || main_map->l_info[ADDRIDX (DT_GNU_LIBLIST)] == NULL)
 	      /* Only binaries have DT_DEBUG dynamic tags...  */
-	   && GL(dl_loaded)->l_info[DT_DEBUG])
+	   && main_map->l_info[DT_DEBUG])
     {
       /* Workaround for buggy binaries.  This doesn't handle buggy
 	 libraries.  */
       bool buggy = false;
-      const ElfW(Sym) *symtab = (const void *) D_PTR (GL(dl_loaded), l_info[DT_SYMTAB]);
-      const char *strtab = (const void *) D_PTR (GL(dl_loaded), l_info[DT_STRTAB]);
+      const ElfW(Sym) *symtab = (const void *) D_PTR (main_map,
+                                                      l_info[DT_SYMTAB]);
+      const char *strtab = (const void *) D_PTR (main_map,
+                                                 l_info[DT_STRTAB]);
       Elf_Symndx symidx;
-      for (symidx = GL(dl_loaded)->l_buckets[0x6c994f % GL(dl_loaded)->l_nbuckets];
+      for (symidx = main_map->l_buckets[0x6c994f % main_map->l_nbuckets];
 	   symidx != STN_UNDEF;
-	   symidx = GL(dl_loaded)->l_chain[symidx])
+	   symidx = main_map->l_chain[symidx])
 	{
 	  if (__builtin_expect (strcmp (strtab + symtab[symidx].st_name,
 					"errno") == 0, 0)
 	      && ELFW(ST_TYPE) (symtab[symidx].st_info) != STT_TLS)
 	    buggy = true;
 	}
-      for (symidx = GL(dl_loaded)->l_buckets[0xe5c992f % GL(dl_loaded)->l_nbuckets];
+      for (symidx = main_map->l_buckets[0xe5c992f % main_map->l_nbuckets];
 	   symidx != STN_UNDEF;
-	   symidx = GL(dl_loaded)->l_chain[symidx])
+	   symidx = main_map->l_chain[symidx])
 	{
 	  if (__builtin_expect (strcmp (strtab + symtab[symidx].st_name,
 					"h_errno") == 0, 0)
@@ -1315,8 +1319,11 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
    */
 #define LIB_NOVERSION "/lib/libNoVersion.so.1"
 
-  if (__builtin_expect (GL(dl_loaded)->l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)] == NULL, 0)
-      && (GL(dl_loaded)->l_info[DT_DEBUG] || !(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)))
+  if (__builtin_expect (main_map->l_info[DT_NUM + DT_THISPROCNUM
+                                         + DT_VERSIONTAGIDX (DT_VERNEED)]
+                        == NULL, 0)
+      && (main_map->l_info[DT_DEBUG]
+          || !(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)))
     {
       struct stat test_st;
       int test_fd;
@@ -1343,8 +1350,8 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
 
       if (can_load != 0) {
 	  struct link_map *new_map;
-	  new_map = _dl_map_object (GL(dl_loaded), LIB_NOVERSION,
-				    1, lt_library, 0, 0);
+	  new_map = _dl_map_object (main_map, LIB_NOVERSION,
+				    1, lt_library, 0, 0, LM_ID_BASE);
 	  if (++new_map->l_opencount == 1) {
 	      /* It is no duplicate.  */
 	      ++npreloads;