(root)/
glibc-2.38/
elf/
multiload.c
       1  #include <dlfcn.h>
       2  #include <errno.h>
       3  #include <mcheck.h>
       4  #include <stdio.h>
       5  #include <stdlib.h>
       6  #include <string.h>
       7  #include <unistd.h>
       8  
       9  int
      10  main (void)
      11  {
      12    void *a;
      13    void *b;
      14    void *c;
      15    void *d;
      16    char *wd;
      17    char *base;
      18    char *buf;
      19  
      20    mtrace ();
      21  
      22    /* Change to the binary directory.  */
      23    if (chdir (OBJDIR) != 0)
      24      {
      25        printf ("cannot change to `%s': %m", OBJDIR);
      26        exit (EXIT_FAILURE);
      27      }
      28  
      29    wd = getcwd (NULL, 0);
      30    base = basename (wd);
      31    buf = alloca (strlen (wd) + strlen (base) + 5 + sizeof "testobj1.so");
      32  
      33    printf ("loading `%s'\n", "./testobj1.so");
      34    a = dlopen ("./testobj1.so", RTLD_NOW);
      35    if (a == NULL)
      36      {
      37        printf ("cannot load `./testobj1.so': %s\n", dlerror ());
      38        exit (EXIT_FAILURE);
      39      }
      40  
      41    stpcpy (stpcpy (stpcpy (buf, "../"), base), "/testobj1.so");
      42    printf ("loading `%s'\n", buf);
      43    b = dlopen (buf, RTLD_NOW);
      44    if (b == NULL)
      45      {
      46        printf ("cannot load `%s': %s\n", buf, dlerror ());
      47        exit (EXIT_FAILURE);
      48      }
      49  
      50    stpcpy (stpcpy (buf, wd), "/testobj1.so");
      51    printf ("loading `%s'\n", buf);
      52    c = dlopen (buf, RTLD_NOW);
      53    if (c == NULL)
      54      {
      55        printf ("cannot load `%s': %s\n", buf, dlerror ());
      56        exit (EXIT_FAILURE);
      57      }
      58  
      59    stpcpy (stpcpy (stpcpy (stpcpy (buf, wd), "/../"), base), "/testobj1.so");
      60    printf ("loading `%s'\n", buf);
      61    d = dlopen (buf, RTLD_NOW);
      62    if (d == NULL)
      63      {
      64        printf ("cannot load `%s': %s\n", buf, dlerror ());
      65        exit (EXIT_FAILURE);
      66      }
      67  
      68    if (a != b || b != c || c != d)
      69      {
      70        puts ("shared object loaded more than once");
      71        exit (EXIT_FAILURE);
      72      }
      73  
      74    if (dlclose (a) != 0)
      75      {
      76        puts ("closing `a' failed");
      77        exit (EXIT_FAILURE);
      78      }
      79    if (dlclose (b) != 0)
      80      {
      81        puts ("closing `a' failed");
      82        exit (EXIT_FAILURE);
      83      }
      84    if (dlclose (c) != 0)
      85      {
      86        puts ("closing `a' failed");
      87        exit (EXIT_FAILURE);
      88      }
      89    if (dlclose (d) != 0)
      90      {
      91        puts ("closing `a' failed");
      92        exit (EXIT_FAILURE);
      93      }
      94  
      95    free (wd);
      96  
      97    return 0;
      98  }
      99  
     100  extern int foo (int a);
     101  int
     102  foo (int a)
     103  {
     104    return a;
     105  }