This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix ppc32 (and probably mips) glibc build


Hi!

Grep found 3 more occurences of GL(dl_loaded), one of them killed ppc32
build.

2004-10-14  Jakub Jelinek  <jakub@redhat.com>

	* dlfcn/dlinfo.c (dlinfo_doit): Replace iteration over GL(dl_loaded)
	chain with iteration over all namespaces' _ns_loaded chains.
	* sysdeps/powerpc/powerpc32/dl-machine.c (__elf_preferred_address):
	Likewise.
	* sysdeps/mips/dl-machine.h (elf_machine_runtime_link_map): Likewise.

--- libc/dlfcn/dlinfo.c.jj	2004-10-14 07:55:31.000000000 +0200
+++ libc/dlfcn/dlinfo.c	2004-10-14 13:48:14.802418655 +0200
@@ -39,13 +39,15 @@ dlinfo_doit (void *argsblock)
 #if 0
   if (args->handle == RTLD_SELF)
     {
+      Lmid_t nsid;
 
       /* Find the highest-addressed object that CALLER is not below.  */
-      for (l = GL(dl_loaded); l != NULL; l = l->l_next)
-	if (caller >= l->l_map_start && caller < l->l_map_end)
-	  /* There must be exactly one DSO for the range of the virtual
-	     memory.  Otherwise something is really broken.  */
-	  break;
+      for (nsid = 0; nsid < DL_NNS; ++nsid)
+	for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next)
+	  if (caller >= l->l_map_start && caller < l->l_map_end)
+	    /* There must be exactly one DSO for the range of the virtual
+	       memory.  Otherwise something is really broken.  */
+	    break;
 
       if (l == NULL)
 	GLRO(dl_signal_error) (0, NULL, NULL, N_("\
--- libc/sysdeps/powerpc/powerpc32/dl-machine.c.jj	2004-03-05 11:23:44.000000000 +0100
+++ libc/sysdeps/powerpc/powerpc32/dl-machine.c	2004-10-14 13:51:26.518237404 +0200
@@ -106,6 +106,7 @@ __elf_preferred_address(struct link_map 
 {
   ElfW(Addr) low, high;
   struct link_map *l;
+  Lmid_t nsid;
 
   /* If the object has a preference, load it there!  */
   if (mapstartpref != 0)
@@ -117,29 +118,30 @@ __elf_preferred_address(struct link_map 
      be superceded by the program's load address).  */
   low =  0x0003FFFF;
   high = 0x70000000;
-  for (l = GL(dl_loaded); l; l = l->l_next)
-    {
-      ElfW(Addr) mapstart, mapend;
-      mapstart = l->l_map_start & ~(GLRO(dl_pagesize) - 1);
-      mapend = l->l_map_end | (GLRO(dl_pagesize) - 1);
-      assert (mapend > mapstart);
-
-      /* Prefer gaps below the main executable, note that l ==
-	 _dl_loaded does not work for static binaries loading
-	 e.g. libnss_*.so.  */
-      if ((mapend >= high || l->l_type == lt_executable)
-	  && high >= mapstart)
-	high = mapstart;
-      else if (mapend >= low && low >= mapstart)
-	low = mapend;
-      else if (high >= mapend && mapstart >= low)
-	{
-	  if (high - mapend >= mapstart - low)
-	    low = mapend;
-	  else
-	    high = mapstart;
-	}
-    }
+  for (nsid = 0; nsid < DL_NNS; ++nsid)
+    for (l = GL(dl_ns)[nsid]._ns_loaded; l; l = l->l_next)
+      {
+	ElfW(Addr) mapstart, mapend;
+	mapstart = l->l_map_start & ~(GLRO(dl_pagesize) - 1);
+	mapend = l->l_map_end | (GLRO(dl_pagesize) - 1);
+	assert (mapend > mapstart);
+
+	/* Prefer gaps below the main executable, note that l ==
+	   _dl_loaded does not work for static binaries loading
+	   e.g. libnss_*.so.  */
+	if ((mapend >= high || l->l_type == lt_executable)
+  	    && high >= mapstart)
+	  high = mapstart;
+	else if (mapend >= low && low >= mapstart)
+	  low = mapend;
+	else if (high >= mapend && mapstart >= low)
+	  {
+	    if (high - mapend >= mapstart - low)
+	      low = mapend;
+	    else
+	      high = mapstart;
+	  }
+      }
 
   high -= 0x10000; /* Allow some room between objects.  */
   maplength = (maplength | (GLRO(dl_pagesize) - 1)) + 1;
--- libc/sysdeps/mips/dl-machine.h.jj	2004-08-25 07:57:35.000000000 +0200
+++ libc/sysdeps/mips/dl-machine.h	2004-10-14 14:00:13.371350396 +0200
@@ -231,10 +231,11 @@ elf_machine_runtime_link_map (ElfW(Addr)
 	}
     }
 
-    {
-      struct link_map *l = GL(dl_loaded);
+    struct link_map *l;
+    Lmid_t nsid;
 
-      while (l)
+    for (nsid = 0; nsid < DL_NNS; ++nsid)
+      for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next)
 	{
 	  ElfW(Addr) base, limit;
 	  const ElfW(Phdr) *p = l->l_phdr;
@@ -250,9 +251,7 @@ elf_machine_runtime_link_map (ElfW(Addr)
 		    return l;
 		}
 	    }
-	  l = l->l_next;
 	}
-    }
 
   _dl_signal_error (0, NULL, NULL, "cannot find runtime link map");
   return NULL;

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]