(root)/
glibc-2.38/
dlfcn/
default.c
       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
      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  }