Move large structure off the stack.

The struct unw_addr_space is very large (at least 13624 bytes on arm),
but is on the stack in the function map_create_list.

Allocate this function when needed instead of putting it on the stack.

Bug: 33293182

Test: Built and ran backtrace_test on an angler. Stepped through the
Test: modified code and verified it is called and allocated properly.
Test: Ran valgrind on the backtrace_test.local_trace to verify that
Test: the memory is not leaked.
Change-Id: I298e72d6b87d2701111c4659c46246b308f275e9
(cherry picked from commit 50270d3ef2127372c0ae6aefd9be255ab901f573)
diff --git a/src/os-linux.c b/src/os-linux.c
index 7062a1b..8dc1ebf 100644
--- a/src/os-linux.c
+++ b/src/os-linux.c
@@ -40,7 +40,7 @@
   struct map_info *map_list = NULL;
   struct map_info *cur_map;
   unw_addr_space_t as = NULL;
-  struct unw_addr_space local_as;
+  struct unw_addr_space* local_as = NULL;
   void* as_arg = NULL;
 
   if (maps_init (&mi, pid) < 0)
@@ -100,8 +100,14 @@
                 {
                   if (map_create_type == UNW_MAP_CREATE_LOCAL)
                     {
-                      as = &local_as;
-                      unw_local_access_addr_space_init (as);
+                      // This is a very large structure, so allocate it.
+                      if (local_as == NULL)
+                        local_as = (struct unw_addr_space*) malloc(sizeof(*local_as));
+                      if (local_as != NULL)
+                        {
+                          as = local_as;
+                          unw_local_access_addr_space_init (as);
+                        }
                     }
                   else
                     {
@@ -147,6 +153,8 @@
       _UPT_destroy (as_arg);
     }
 
+  free(local_as);
+
   return map_list;
 }
 /* End of ANDROID update. */