(root)/
glibc-2.38/
elf/
noload.c
       1  #include <dlfcn.h>
       2  #include <stdio.h>
       3  #include <mcheck.h>
       4  
       5  int
       6  main (void)
       7  {
       8    int result = 0;
       9    void *p;
      10  
      11    mtrace ();
      12  
      13    /* First try to load an object which is a dependency.  This should
      14       succeed.  */
      15    p = dlopen ("testobj1.so", RTLD_LAZY | RTLD_NOLOAD);
      16    if (p == NULL)
      17      {
      18        printf ("cannot open \"testobj1.so\": %s\n", dlerror ());
      19        result = 1;
      20      }
      21    else
      22      {
      23        puts ("loading \"testobj1.so\" succeeded, OK");
      24        dlclose (p);
      25      }
      26  
      27    /* Now try loading an object which is not already loaded.  */
      28    if (dlopen ("testobj5.so", RTLD_LAZY | RTLD_NOLOAD) != NULL)
      29      {
      30        puts ("succeeded in loading \"testobj5.so\"");
      31        result = 1;
      32      }
      33    else
      34      {
      35        /* Load the object and run the same test again.  */
      36        puts ("\"testobj5.so\" wasn't loaded and RTLD_NOLOAD prevented it, OK");
      37  
      38        p = dlopen ("testobj5.so", RTLD_LAZY);
      39  
      40        if (p == NULL)
      41  	{
      42  	  printf ("cannot open \"testobj5.so\" without RTLD_NOLOAD: %s\n",
      43  		  dlerror ());
      44  	  result = 1;
      45  	}
      46        else
      47  	{
      48  	  puts ("loading \"testobj5.so\" succeeded, OK");
      49  
      50  	  void *q = dlopen ("testobj5.so", RTLD_LAZY | RTLD_NOLOAD);
      51  	  if (q == NULL)
      52  	    {
      53  	      printf ("cannot open \"testobj5.so\": %s\n", dlerror ());
      54  	      result = 1;
      55  	    }
      56  	  else
      57  	    {
      58  	      puts ("loading \"testobj5.so\" with RTLD_NOLOAD succeeded, OK");
      59  	      dlclose (q);
      60  	    }
      61  
      62  	  if (dlclose (p) != 0)
      63  	    {
      64  	      printf ("cannot close \"testobj5.so\": %s\n", dlerror ());
      65  	      result = 1;
      66  	    }
      67  	  else
      68  	    puts ("closing \"testobj5.so\" succeeded, OK");
      69  	}
      70      }
      71  
      72    return result;
      73  }
      74  
      75  
      76  extern int foo (int a);
      77  int
      78  foo (int a)
      79  {
      80    return 42 + a;
      81  }