mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	* elf/loadfail.c: Little cosmetic changes to avoid warnings. * elf/loadtest.c: Likewise. * elf/multiload.c: Likewise. * elf/next.c: Likewise. * elf/nodelete.c: Likewise. * elf/noload.c: Likewise. * elf/order.c: Likewise. * elf/origtest.c: Likewise. * elf/preloadtest.c: Likewise. * elf/restest1.c: Likewise.
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <dlfcn.h>
 | |
| #include <errno.h>
 | |
| #include <mcheck.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| int
 | |
| main (void)
 | |
| {
 | |
|   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;
 | |
| }
 | |
| 
 | |
| extern int foo (int a);
 | |
| int
 | |
| foo (int a)
 | |
| {
 | |
|   return a;
 | |
| }
 |