Test for __cxa_atexit() in dlopen()ed module.
[kopensolaris-gnu/glibc.git] / dlfcn / tstcxaatexit.c
1 /* Copyright (C) 2001 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 #include <dlfcn.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22
23
24 int
25 main (void)
26 {
27   const char fname[] = "modcxaatexit.so";
28   void *h;
29   void (*fp) (void *);
30   int v = 0;
31
32   h = dlopen (fname, RTLD_LAZY);
33   if (h == NULL)
34     {
35       printf ("cannot open \"%s\": %s\n", fname, dlerror ());
36       exit (1);
37     }
38
39   fp = dlsym (h, "bar");
40   if (fp == NULL)
41     {
42       printf ("cannot find \"bar\": %s\n", dlerror ());
43       exit (1);
44     }
45
46   fp (&v);
47
48   if (dlclose (h) != 0)
49     {
50       printf ("cannot close \"%s\": %s\n", fname, dlerror ());
51       exit (1);
52     }
53
54   if (v != 1)
55     {
56       puts ("module unload didn't change `v'");
57       exit (1);
58     }
59
60   puts ("finishing now");
61
62   return 0;
63 }