#include <stdio.h>
#include <stdbool.h>
#include <dlfcn.h>
#include <mach-o/dyld.h>
#include "test.h" // PASS(), FAIL()
typedef bool (*CheckFunc)();
int main()
{
#if __MAC_OS_X_VERSION_MIN_REQUIRED
const char* path = "test.bundle";
NSObjectFileImage ofi;
if ( NSCreateObjectFileImageFromFile(path, &ofi) != NSObjectFileImageSuccess ) {
FAIL("NSCreateObjectFileImageFromFile failed");
return 0;
}
NSModule mod = NSLinkModule(ofi, path, NSLINKMODULE_OPTION_NONE);
if ( mod == NULL ) {
FAIL("NSLinkModule failed");
return 0;
}
NSSymbol sym = NSLookupSymbolInModule(mod, "_checkdata");
if ( sym == NULL ) {
FAIL("NSLookupSymbolInModule failed");
return 0;
}
CheckFunc func = NSAddressOfSymbol(sym);
if ( !func() ) {
FAIL("NSAddressOfSymbol failed");
return 0;
}
Dl_info info;
if ( dladdr(func, &info) == 0 ) {
FAIL("dladdr(func, &info) failed");
return 0;
}
if ( info.dli_fname == path ) {
FAIL("NSLinkModule() did not make a copy of the path");
return 0;
}
if ( !NSUnLinkModule(mod, NSUNLINKMODULE_OPTION_NONE) ) {
FAIL("NSUnLinkModule failed");
return 0;
}
if ( !NSDestroyObjectFileImage(ofi) ) {
FAIL("NSDestroyObjectFileImage failed");
return 0;
}
#endif
PASS("bundle-name-ownership");
return 0;
}