2789abd5bb00fe884420508f3b5be52e6adb1936
[kopensolaris-gnu/glibc.git] / elf / unload.c
1 /* Test for unloading (really unmapping) of objects.  By Franz Sirl.
2    This test does not have to passed in all dlopen() et.al. implementation
3    since it is not required the unloading actually happens.  But we
4    require it for glibc.  */
5
6 #include <dlfcn.h>
7 #include <mcheck.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 typedef struct
12 {
13   void *next;
14 } strct;
15
16 int
17 main (void)
18 {
19    void *sohandle;
20    strct *testdat;
21    int ret;
22    int result = 0;
23
24    mtrace ();
25
26    sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
27    if (sohandle == NULL)
28      {
29        printf ("first dlopen failed: %s\n", dlerror ());
30        exit (1);
31      }
32
33    testdat = dlsym (sohandle, "testdat");
34    testdat->next = (void *) -1;
35
36    ret = dlclose (sohandle);
37    if (ret != 0)
38      {
39        puts ("first dlclose failed");
40        result = 1;
41      }
42
43    sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
44    if (sohandle == NULL)
45      {
46        printf ("second dlopen failed: %s\n", dlerror ());
47        exit (1);
48      }
49
50    testdat = dlsym (sohandle, "testdat");
51    if (testdat->next == (void *) -1)
52      {
53        puts ("testdat->next == (void *) -1");
54        result = 1;
55      }
56
57    ret = dlclose (sohandle);
58    if (ret != 0)
59      {
60        puts ("second dlclose failed");
61        result = 1;
62      }
63
64    return result;
65 }