mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <dlfcn.h>
 | |
| #include <assert.h>
 | |
| 
 | |
| int main(int argc, char* argv[])
 | |
| {
 | |
| #if defined(__FreeBSD__)
 | |
|     // workaround for Bugzilla 14824
 | |
|     void *druntime = dlopen(argv[1], RTLD_LAZY); // load druntime
 | |
|     assert(druntime);
 | |
| #endif
 | |
| 
 | |
|     const size_t pathlen = strrchr(argv[0], '/') - argv[0] + 1;
 | |
|     char *name = malloc(pathlen + sizeof("plugin1.so"));
 | |
|     memcpy(name, argv[0], pathlen);
 | |
|     memcpy(name+pathlen, "plugin1.so", sizeof("plugin1.so"));
 | |
| 
 | |
|     void* plugin1 = dlopen(name, RTLD_LAZY);
 | |
|     name[pathlen + sizeof("plugin1.so") - 5] = '2';
 | |
|     void* plugin2 = dlopen(name, RTLD_LAZY);
 | |
| 
 | |
|     int (*plugin1_init)() = dlsym(plugin1, "plugin_init");
 | |
|     int (*plugin1_term)() = dlsym(plugin1, "plugin_term");
 | |
|     int (*runTests1)() = dlsym(plugin1, "runTests");
 | |
|     int (*plugin2_init)() = dlsym(plugin2, "plugin_init");
 | |
|     int (*plugin2_term)() = dlsym(plugin2, "plugin_term");
 | |
|     int (*runTests2)() = dlsym(plugin2, "runTests");
 | |
|     assert(plugin1_init());
 | |
|     assert(runTests1());
 | |
|     assert(plugin2_init());
 | |
|     assert(runTests2());
 | |
| 
 | |
|     assert(plugin1_term());
 | |
|     assert(dlclose(plugin1) == 0);
 | |
|     assert(runTests2());
 | |
| 
 | |
|     name[pathlen + sizeof("plugin1.so") - 5] = '1';
 | |
|     plugin1 = dlopen(name, RTLD_LAZY);
 | |
|     plugin1_init = dlsym(plugin1, "plugin_init");
 | |
|     plugin1_term = dlsym(plugin1, "plugin_term");
 | |
|     runTests1 = dlsym(plugin1, "runTests");
 | |
|     assert(plugin1_init());
 | |
|     assert(runTests1());
 | |
|     assert(runTests2());
 | |
| 
 | |
|     assert(plugin2_term());
 | |
|     assert(dlclose(plugin2) == 0);
 | |
|     assert(runTests1());
 | |
| 
 | |
|     assert(plugin1_term());
 | |
|     assert(dlclose(plugin1) == 0);
 | |
| 
 | |
|     free(name);
 | |
| 
 | |
| #if defined(__FreeBSD__)
 | |
|     dlclose(druntime);
 | |
| #endif
 | |
|     return EXIT_SUCCESS;
 | |
| }
 |