#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>
#include <stdbool.h>
#include <dlfcn.h>
#include <mach-o/dyld_priv.h>
extern const char* zlibVersion();
int main()
{
uuid_t currentCacheUUID;
if ( !_dyld_get_shared_cache_uuid(currentCacheUUID) ) {
printf("[BEGIN] dyld_shared_cache_some_image_overridden\n");
if (dyld_shared_cache_some_image_overridden())
printf("[FAIL] dyld_shared_cache_some_image_overridden\n");
else
printf("[PASS] dyld_shared_cache_some_image_overridden\n");
return 0;
}
#if NO_LZ
bool expectMyDylib = (getenv("DYLD_LIBRARY_PATH") != NULL);
printf("[BEGIN] dyld_shared_cache_some_image_overridden, %s\n", expectMyDylib ? "my" : "os");
void* handle = dlopen("/usr/lib/libz.1.dylib", RTLD_NOLOAD);
if ( handle != NULL ) {
printf("[FAIL] dyld_shared_cache_some_image_overridden, libz is hard linked now. Update test to use a new dylib\n");
return 0;
}
bool launchedWithOverriddenBinary = dyld_shared_cache_some_image_overridden();
handle = dlopen("/usr/lib/libz.1.dylib", RTLD_LAZY);
if ( handle == NULL ) {
printf("[FAIL] dyld_shared_cache_some_image_overridden: /usr/lib/libz.1.dylib could not be loaded, %s\n", dlerror());
return 0;
}
__typeof(&zlibVersion) versionSymbol = (__typeof(&zlibVersion))dlsym(handle, "zlibVersion");
if ( versionSymbol == NULL ) {
printf("[FAIL] dyld_shared_cache_some_image_overridden: zlibVersion was not found\n");
return 0;
}
bool usingMyDylib = (strcmp(versionSymbol(), "my") == 0);
if ( usingMyDylib != expectMyDylib ) {
printf("[FAIL] dyld_shared_cache_some_image_overridden, %s\n", expectMyDylib ? "my" : "os");
return 0;
}
if (usingMyDylib) {
if (!dyld_shared_cache_some_image_overridden()) {
printf("[FAIL] dyld_shared_cache_some_image_overridden, my dylib but not some dylib overridden\n");
return 0;
}
} else if (!launchedWithOverriddenBinary) {
if (dyld_shared_cache_some_image_overridden()) {
printf("[FAIL] dyld_shared_cache_some_image_overridden, system dylib was overridden\n");
return 0;
}
} else {
dyld_shared_cache_some_image_overridden();
}
printf("[PASS] dyld_shared_cache_some_image_overridden, %s\n", expectMyDylib ? "my" : "os");
#else
bool expectMyDylib = (getenv("DYLD_LIBRARY_PATH") != NULL);
printf("[BEGIN] dyld_shared_cache_some_image_overridden, %s\n", expectMyDylib ? "my" : "os");
bool usingMyDylib = (strcmp(zlibVersion(), "my") == 0);
if ( usingMyDylib != expectMyDylib ) {
printf("[FAIL] dyld_shared_cache_some_image_overridden, %s\n", expectMyDylib ? "my" : "os");
return 0;
}
if (usingMyDylib) {
if (!dyld_shared_cache_some_image_overridden()) {
printf("[FAIL] dyld_shared_cache_some_image_overridden, my dylib but not some dylib overridden\n");
return 0;
}
} else {
dyld_shared_cache_some_image_overridden();
}
printf("[PASS] dyld_shared_cache_some_image_overridden, %s\n", expectMyDylib ? "my" : "os");
#endif
return 0;
}