#include <stdbool.h> // fprintf(), NULL
#include <stdio.h> // fprintf(), NULL
#include <stdlib.h> // exit(), EXIT_SUCCESS
#include <stdbool.h>
#include <string.h>
#include <mach-o/dyld.h>
#include <mach-o/dyld_priv.h>
#include <dlfcn.h>
#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL()
int main(int argc, const char* argv[])
{
#if __MAC_OS_X_VERSION_MIN_REQUIRED
NSObjectFileImage ofi;
if ( NSCreateObjectFileImageFromFile("foo.bundle", &ofi) != NSObjectFileImageSuccess ) {
FAIL("bundle-dont-gc: NSCreateObjectFileImageFromFile failed");
return 1;
}
NSModule mod = NSLinkModule(ofi, "foo.bundle", NSLINKMODULE_OPTION_NONE);
if ( mod == NULL ) {
FAIL("bundle-dont-gc: NSLinkModule failed");
return 1;
}
NSSymbol sym = NSLookupSymbolInModule(mod, "_foo");
if ( sym == NULL ) {
FAIL("bundle-dont-gc: NSLookupSymbolInModule failed");
return 1;
}
void* fooAddr = NSAddressOfSymbol(sym);
if ( fooAddr == NULL ) {
FAIL("bundle-dont-gc: NSAddressOfSymbol failed");
return 1;
}
if ( !NSDestroyObjectFileImage(ofi) ) {
FAIL("bundle-dont-gc: NSDestroyObjectFileImage failed");
return 1;
}
void* h1 = dlopen("bar.bundle", RTLD_LAZY);
if ( h1 == NULL ) {
FAIL("bundle-dont-gc: can't dlopen bar.bundle: %s", dlerror());
return EXIT_SUCCESS;
}
dlclose(h1);
Dl_info info;
if ( dladdr(fooAddr, &info) == 0 ) {
FAIL("bundle-dont-gc: dladdr() failed");
exit(0);
}
if ( !NSUnLinkModule(mod, NSUNLINKMODULE_OPTION_NONE) ) {
FAIL("NSUnLinkModule failed");
return 1;
}
#endif
PASS("bundle-dont-gc");
return EXIT_SUCCESS;
}