#include <stdio.h> // fprintf(), NULL
#include <stdlib.h> // exit(), EXIT_SUCCESS
#include <stdbool.h>
#include <mach-o/dyld.h>
#include <dlfcn.h>
#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL()
static bool sNotified = false;
static void removeNotification2(const struct mach_header *mh, intptr_t vmaddr_slide)
{
}
static void removeNotification(const struct mach_header *mh, intptr_t vmaddr_slide)
{
_dyld_register_func_for_remove_image(removeNotification2);
_dyld_register_func_for_remove_image(removeNotification2);
_dyld_register_func_for_remove_image(removeNotification2);
_dyld_register_func_for_remove_image(removeNotification2);
_dyld_register_func_for_remove_image(removeNotification2);
sNotified = true;
}
int main(int argc, const char* argv[])
{
_dyld_register_func_for_remove_image(removeNotification);
void* handle = dlopen("foo.bundle", RTLD_LAZY);
if ( handle == NULL ) {
FAIL("image-remove-crash: dlopen(foo.bundle) failed: %s", dlerror());
exit(0);
}
int result = dlclose(handle);
if ( result != 0 ) {
FAIL("image-remove-crash: dlclose(handle) returned %d, %s", result, dlerror());
exit(0);
}
if ( sNotified )
PASS("image-remove-crash");
else
FAIL("image-remove-crash");
return EXIT_SUCCESS;
}