#include <stdlib.h> // EXIT_SUCCESS
#include <stdio.h>
#include <dlfcn.h>
#include <mach-o/dyld.h>
#include <mach-o/dyld_images.h>
#include "test.h"
extern struct mach_header __dso_handle;
struct dyld_all_image_infos* getImageInfosFromKernel()
{
task_dyld_info_data_t task_dyld_info;
mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;
if ( task_info(mach_task_self(), TASK_DYLD_INFO, (task_info_t)&task_dyld_info, &count) ) {
FAIL("all_image_infos: task_info() failed");
exit(0);
}
return (struct dyld_all_image_infos*)(uintptr_t)task_dyld_info.all_image_info_addr;
}
int
main()
{
struct dyld_all_image_infos* info = getImageInfosFromKernel();
if ( info->version < 10 ) {
FAIL("image-count: dyld_all_image_infos is < 10");
exit(0);
}
if ( info->infoArrayCount != info->initialImageCount ) {
FAIL("image-count: dyld_all_image_infos.infoArrayCount != dyld_all_image_infos.initialImageCount");
exit(0);
}
void* h = dlopen("libfoo.dylib", RTLD_LAZY);
if ( h == NULL ) {
FAIL("image-count: dyld_all_image_infos is < 10");
exit(0);
}
if ( info->infoArrayCount != (info->initialImageCount+1) ) {
FAIL("image-count: infoArrayCount did not increment when libfoo.dylib was loaded");
exit(0);
}
dlclose(h);
if ( info->infoArrayCount != info->initialImageCount ) {
FAIL("image-count: infoArrayCount did not decrement when libfoo.dylib was unloaded");
exit(0);
}
PASS("image-count");
return EXIT_SUCCESS;
}