#include <stdio.h> // fprintf(), NULL
#include <stdlib.h> // exit(), EXIT_SUCCESS
#include <string.h>
#include <dlfcn.h>
#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL()
int A[] = { 10, 11, 12, 13 };
typedef int* (*getproc)(void);
int main(int argc, const char* argv[])
{
void* fooHandle = dlopen("libfoo.dylib", RTLD_LOCAL);
if ( fooHandle == NULL ) {
FAIL("dlopen-RTLD_LOCAL-weak: dlopen(\"libfoo.dylib\", RTLD_LOCAL) failed: %s", dlerror());
return EXIT_SUCCESS;
}
void* barHandle = dlopen("libbar.dylib", RTLD_LOCAL);
if ( barHandle == NULL ) {
FAIL("dlopen-RTLD_LOCAL-weak: dlopen(\"libbar.dylib\", RTLD_LOCAL) failed: %s", dlerror());
return EXIT_SUCCESS;
}
getproc fooproc = (getproc)dlsym(fooHandle, "getA");
if ( fooproc == NULL ) {
FAIL("dlopen-RTLD_LOCAL-weak: dlsym(getA) failed: %s", dlerror());
return EXIT_SUCCESS;
}
getproc barproc = (getproc)dlsym(barHandle, "getA");
if ( barproc == NULL ) {
FAIL("dlopen-RTLD_LOCAL-weak: dlsym(getA) failed: %s", dlerror());
return EXIT_SUCCESS;
}
int* fooA = (*fooproc)();
int* barA = (*barproc)();
if ( fooA == A )
FAIL("dlopen-RTLD_LOCAL-weak: fooA == A");
else if ( barA == A )
FAIL("dlopen-RTLD_LOCAL-weak: barA == A");
else if ( fooA == barA )
FAIL("dlopen-RTLD_LOCAL-weak: fooA == barA");
else
PASS("dlopen-RTLD_LOCAL-weak");
return EXIT_SUCCESS;
}