[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