1 /* Test for dladdr.
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 <errno.h>
21 #include <error.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 
26 
27 #define TEST_FUNCTION do_test ()
28 extern int do_test (void);
29 
30 int
do_test(void)31 do_test (void)
32 {
33   void *handle;
34   int (*sym) (void); /* We load ref1 from glreflib1.c.  */
35   Dl_info info;
36   int ret;
37 
38 
39   handle = dlopen ("glreflib1.so", RTLD_NOW);
40   if (handle == NULL)
41     error (EXIT_FAILURE, 0, "cannot load: glreflib1.so");
42 
43   sym = dlsym (handle, "ref1");
44   if (sym == NULL)
45     error (EXIT_FAILURE, 0, "dlsym failed");
46 
47   memset (&info, 0, sizeof (info));
48   ret = dladdr (sym, &info);
49 
50   if (ret == 0)
51     error (EXIT_FAILURE, 0, "dladdr failed");
52 
53   printf ("ret = %d\n", ret);
54   printf ("info.dli_fname = %p (\"%s\")\n", info.dli_fname, info.dli_fname);
55   printf ("info.dli_fbase = %p\n", info.dli_fbase);
56   printf ("info.dli_sname = %p (\"%s\")\n", info.dli_sname, info.dli_sname);
57   printf ("info.dli_saddr = %p\n", info.dli_saddr);
58 
59   if (info.dli_fname == NULL)
60     error (EXIT_FAILURE, 0, "dli_fname is NULL");
61   if (info.dli_fbase == NULL)
62     error (EXIT_FAILURE, 0, "dli_fbase is NULL");
63   if (info.dli_sname == NULL)
64     error (EXIT_FAILURE, 0, "dli_sname is NULL");
65   if (info.dli_saddr == NULL)
66     error (EXIT_FAILURE, 0, "dli_saddr is NULL");
67 
68   dlclose (handle);
69 
70   return 0;
71 }
72 
73 
74 #include "../test-skeleton.c"
75