Back to index

glibc  2.9
Functions
multiload.c File Reference
#include <dlfcn.h>
#include <errno.h>
#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

Go to the source code of this file.

Functions

int main (void)
int foo (int a)

Function Documentation

int foo ( int  a)
int main ( void  )

Definition at line 10 of file multiload.c.

{
  void *a;
  void *b;
  void *c;
  void *d;
  char *wd;
  char *base;
  char *buf;

  mtrace ();

  /* Change to the binary directory.  */
  if (chdir (OBJDIR) != 0)
    {
      printf ("cannot change to `%s': %m", OBJDIR);
      exit (EXIT_FAILURE);
    }

  wd = getcwd (NULL, 0);
  base = basename (wd);
  buf = alloca (strlen (wd) + strlen (base) + 5 + sizeof "testobj1.so");

  printf ("loading `%s'\n", "./testobj1.so");
  a = dlopen ("./testobj1.so", RTLD_NOW);
  if (a == NULL)
    {
      printf ("cannot load `./testobj1.so': %s\n", dlerror ());
      exit (EXIT_FAILURE);
    }

  stpcpy (stpcpy (stpcpy (buf, "../"), base), "/testobj1.so");
  printf ("loading `%s'\n", buf);
  b = dlopen (buf, RTLD_NOW);
  if (b == NULL)
    {
      printf ("cannot load `%s': %s\n", buf, dlerror ());
      exit (EXIT_FAILURE);
    }

  stpcpy (stpcpy (buf, wd), "/testobj1.so");
  printf ("loading `%s'\n", buf);
  c = dlopen (buf, RTLD_NOW);
  if (c == NULL)
    {
      printf ("cannot load `%s': %s\n", buf, dlerror ());
      exit (EXIT_FAILURE);
    }

  stpcpy (stpcpy (stpcpy (stpcpy (buf, wd), "/../"), base), "/testobj1.so");
  printf ("loading `%s'\n", buf);
  d = dlopen (buf, RTLD_NOW);
  if (d == NULL)
    {
      printf ("cannot load `%s': %s\n", buf, dlerror ());
      exit (EXIT_FAILURE);
    }

  if (a != b || b != c || c != d)
    {
      puts ("shared object loaded more than once");
      exit (EXIT_FAILURE);
    }

  if (dlclose (a) != 0)
    {
      puts ("closing `a' failed");
      exit (EXIT_FAILURE);
    }
  if (dlclose (b) != 0)
    {
      puts ("closing `a' failed");
      exit (EXIT_FAILURE);
    }
  if (dlclose (c) != 0)
    {
      puts ("closing `a' failed");
      exit (EXIT_FAILURE);
    }
  if (dlclose (d) != 0)
    {
      puts ("closing `a' failed");
      exit (EXIT_FAILURE);
    }

  free (wd);

  return 0;
}

Here is the call graph for this function: