#include <stdio.h> // fprintf(), NULL
#include <stdlib.h> // exit(), EXIT_SUCCESS
#include <string.h>
#include <dlfcn.h>
#include <mach-o/dyld_priv.h>
extern const struct mach_header __dso_handle;
#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL()
typedef char* (*DupProc)(const char*);
char* mystrdup(const char* in)
{
return "hello";
}
static const struct dyld_interpose_tuple sTable[] = { {&mystrdup, &strdup} };
int main()
{
const char* preCall = strdup("123");
DupProc preProc = &strdup;
dyld_dynamic_interpose(&__dso_handle, sTable, 1);
const char* postCall = strdup("123");
DupProc postProc = &strdup;
if ( strcmp(preCall, "123") != 0 ) {
FAIL("interpose-dynamic-basic control strdup failed");
return EXIT_SUCCESS;
}
if ( strcmp(postCall, "hello") != 0 ) {
FAIL("interpose-dynamic-basic interposed lazy strdup failed");
return EXIT_SUCCESS;
}
if ( preProc == postProc ) {
FAIL("interpose-dynamic-basic interposed non-lazy strdup failed");
return EXIT_SUCCESS;
}
PASS("interpose-dynamic-basic");
return EXIT_SUCCESS;
}