1 #include <dlfcn.h>
2 #include <stdio.h>
3 #include <string.h>
4
5
6 extern int test_in_mod1 (void *);
7 extern int test_in_mod2 (void *);
8
9
10 int
main(int argc,char * argv[])11 main (int argc, char *argv[])
12 {
13 int (*ifp) (void);
14 void *p;
15 int result = 0;
16 Dl_info info;
17
18 dladdr(main, &info);
19 if (info.dli_fname == NULL)
20 {
21 printf ("%s: dladdr returns NULL dli_fname\n", __FILE__);
22 result = 1;
23 }
24 else if (strcmp (info.dli_fname, argv[0]))
25 {
26 printf ("%s: dladdr returned '%s' as dli_fname\n", __FILE__, info.dli_fname);
27 result = 1;
28 }
29 else
30 printf ("%s: dladdr returned correct dli_fname\n", __FILE__);
31
32 /* Find function `main'. */
33 p = dlsym (RTLD_DEFAULT, "main");
34 if (p == NULL)
35 {
36 printf ("%s: main not found\n", __FILE__);
37 result = 1;
38 }
39 else if ((int (*)(int, char **))p != main)
40 {
41 printf ("%s: wrong address returned for main\n", __FILE__);
42 result = 1;
43 }
44 else
45 printf ("%s: main correctly found\n", __FILE__);
46
47 ifp = dlsym (RTLD_DEFAULT, "found_in_mod1");
48 if ((void *) ifp == NULL)
49 {
50 printf ("%s: found_in_mod1 not found\n", __FILE__);
51 result = 1;
52 }
53 else if (ifp () != 1)
54 {
55 printf ("%s: wrong address returned for found_in_mod1\n", __FILE__);
56 result = 1;
57 }
58 else
59 printf ("%s: found_in_mod1 correctly found\n", __FILE__);
60
61 ifp = dlsym (RTLD_DEFAULT, "found_in_mod2");
62 if ((void *) ifp == NULL)
63 {
64 printf ("%s: found_in_mod2 not found\n", __FILE__);
65 result = 1;
66 }
67 else if (ifp () != 2)
68 {
69 printf ("%s: wrong address returned for found_in_mod2\n", __FILE__);
70 result = 1;
71 }
72 else
73 printf ("%s: found_in_mod2 correctly found\n", __FILE__);
74
75 result |= test_in_mod1 (main);
76
77 result |= test_in_mod2 (main);
78
79 return result;
80 }
81