[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/libc/glibc/glibc-2.22/elf/unload.c b/ap/libc/glibc/glibc-2.22/elf/unload.c
new file mode 100644
index 0000000..4566f22
--- /dev/null
+++ b/ap/libc/glibc/glibc-2.22/elf/unload.c
@@ -0,0 +1,91 @@
+/* Test for unloading (really unmapping) of objects.  By Franz Sirl.
+   This test does not have to passed in all dlopen() et.al. implementation
+   since it is not required the unloading actually happens.  But we
+   require it for glibc.  */
+
+#include <dlfcn.h>
+#include <link.h>
+#include <mcheck.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAPS ((struct link_map *) _r_debug.r_map)
+
+#define OUT \
+  for (map = MAPS; map != NULL; map = map->l_next)			      \
+    if (map->l_type == lt_loaded)					      \
+      printf ("name = \"%s\", direct_opencount = %d\n",			      \
+	      map->l_name, (int) map->l_direct_opencount);		      \
+  fflush (stdout)
+
+typedef struct
+{
+  void *next;
+} strct;
+
+int
+main (void)
+{
+   void *sohandle;
+   strct *testdat;
+   int ret;
+   int result = 0;
+   struct link_map *map;
+
+   mtrace ();
+
+   puts ("\nBefore");
+   OUT;
+
+   sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
+   if (sohandle == NULL)
+     {
+       printf ("*** first dlopen failed: %s\n", dlerror ());
+       exit (1);
+     }
+
+   puts ("\nAfter loading unloadmod.so");
+   OUT;
+
+   testdat = dlsym (sohandle, "testdat");
+   testdat->next = (void *) -1;
+
+   ret = dlclose (sohandle);
+   if (ret != 0)
+     {
+       puts ("*** first dlclose failed");
+       result = 1;
+     }
+
+   puts ("\nAfter closing unloadmod.so");
+   OUT;
+
+   sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
+   if (sohandle == NULL)
+     {
+       printf ("*** second dlopen failed: %s\n", dlerror ());
+       exit (1);
+     }
+
+   puts ("\nAfter loading unloadmod.so the second time");
+   OUT;
+
+   testdat = dlsym (sohandle, "testdat");
+   if (testdat->next == (void *) -1)
+     {
+       puts ("*** testdat->next == (void *) -1");
+       result = 1;
+     }
+
+   ret = dlclose (sohandle);
+   if (ret != 0)
+     {
+       puts ("*** second dlclose failed");
+       result = 1;
+     }
+
+   puts ("\nAfter closing unloadmod.so again");
+   OUT;
+
+   return result;
+}