1 /* Test for dependency tracking  added by relocations.
2    Copyright (C) 2000-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #include <dlfcn.h>
20 #include <error.h>
21 #include <errno.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 
25 
26 static void *
load(const char * name)27 load (const char *name)
28 {
29   void *d = dlopen (name, RTLD_LAZY | RTLD_GLOBAL);
30   if (d == NULL)
31     error (EXIT_FAILURE, errno, "cannot load `%s'", name);
32   return d;
33 }
34 
35 
36 #define TEST_FUNCTION do_test ()
37 extern int do_test (void);
38 
39 int
do_test(void)40 do_test (void)
41 {
42   void *d1;
43   void *d2;
44   int (*f) (void);
45 
46   d1 = load ("glreflib1.so");
47   d2 = load ("glreflib2.so");
48 
49   f = dlsym (d2, "ref2");
50   if (f == NULL)
51     error (EXIT_FAILURE, errno, "cannot get pointer to `%s'", "ref2");
52 
53   if (f () != 42)
54     error (EXIT_FAILURE, 0, "wrong result from `%s'", "ref2");
55 
56   puts ("Correct result in first call");
57   fflush (stdout);
58 
59   /* Now unload the first file.  */
60   dlclose (d1);
61 
62   puts ("About to call the second time");
63   fflush (stdout);
64 
65   /* Try calling the function again.  */
66   if (f () != 42)
67     error (EXIT_FAILURE, 0, "wrong result from `%s' (second call)", "ref2");
68 
69   puts ("Second call succeeded!");
70   fflush (stdout);
71 
72   dlclose (d2);
73 
74   puts ("glreflib2 also closed");
75   fflush (stdout);
76 
77   return 0;
78 }
79 
80 #include "../test-skeleton.c"
81