[patch] Reduce ridiculous stack use in _dl_map_object_deps

Paul Pluzhnikov ppluzhnikov@google.com
Sat Oct 29 22:21:00 GMT 2011


On Sat, Oct 29, 2011 at 2:17 PM, Paul Pluzhnikov <ppluzhnikov@google.com> wrote:

> +  struct link_map *needed_space;

Oops. Should be 'struct link_map **needed_space;'
Sorry about that.

Corrected patch attached.
-- 
Paul Pluzhnikov
-------------- next part --------------
2011-10-29  Paul Pluzhnikov  <ppluzhnikov@google.com>

	* elf/dl-deps.c (_dl_map_object_deps): Reuse alloca space to reduce
	stack usage.


diff --git a/elf/dl-deps.c b/elf/dl-deps.c
index 95b1088..ece2f1d 100644
--- a/elf/dl-deps.c
+++ b/elf/dl-deps.c
@@ -156,6 +156,8 @@ _dl_map_object_deps (struct link_map *map,
   int errno_reason;
   const char *errstring;
   const char *objname;
+  struct link_map **needed_space;
+  unsigned int n_needed_space;
 
   auto inline void preload (struct link_map *map);
 
@@ -175,6 +177,10 @@ _dl_map_object_deps (struct link_map *map,
   /* No loaded object so far.  */
   nlist = 0;
 
+  /* No alloca'd space yet.  */
+  needed_space = NULL;
+  n_needed_space = 0;
+
   /* First load MAP itself.  */
   preload (map);
 
@@ -216,8 +222,16 @@ _dl_map_object_deps (struct link_map *map,
 	 dependencies of this object.  */
       if (l->l_searchlist.r_list == NULL && l->l_initfini == NULL
 	  && l != map && l->l_ldnum > 0)
-	needed = (struct link_map **) alloca (l->l_ldnum
-					      * sizeof (struct link_map *));
+	{
+	  if (l->l_ldnum > n_needed_space)
+	    {
+	      n_needed_space = l->l_ldnum;
+	      needed_space
+		= (struct link_map **) alloca (n_needed_space
+					       * sizeof (struct link_map *));
+	    }
+	  needed = needed_space;
+	}
 
       if (l->l_info[DT_NEEDED] || l->l_info[AUXTAG] || l->l_info[FILTERTAG])
 	{


More information about the Libc-alpha mailing list