mach_error_t mach_override( char *originalFunctionSymbolName, const char *originalFunctionLibraryNameHint, const void *overrideFunctionAddress, void **originalFunctionReentryIsland ) { assert( originalFunctionSymbolName ); assert( strlen( originalFunctionSymbolName ) ); assert( overrideFunctionAddress ); // Lookup the original function's code pointer. long *originalFunctionPtr; if( originalFunctionLibraryNameHint ) _dyld_lookup_and_bind_with_hint( originalFunctionSymbolName, originalFunctionLibraryNameHint, (void*) &originalFunctionPtr, NULL ); else _dyld_lookup_and_bind( originalFunctionSymbolName, (void*) &originalFunctionPtr, NULL ); //printf ("In mach_override\n"); return mach_override_ptr( originalFunctionPtr, overrideFunctionAddress, originalFunctionReentryIsland ); }
static int SetupForObjcLookup( void ) { if ( !LinkedObjcRuntime ) { // see if libobjc is loaded if ( NSIsSymbolNameDefined( "_objc_getClass" ) ) { _dyld_lookup_and_bind_with_hint( "_objc_getClass", "libobjc", (void **) &my_objc_getClass, NULL ); _dyld_lookup_and_bind_with_hint( "_class_getInstanceMethod", "libobjc", (void **) &my_class_getInstanceMethod, NULL ); _dyld_lookup_and_bind_with_hint( "_class_getClassMethod", "libobjc", (void **) &my_class_getClassMethod, NULL ); _dyld_lookup_and_bind_with_hint( "_sel_getUid", "libobjc", (void **) &my_sel_getUid, NULL ); if ( my_objc_getClass != NULL ) LinkedObjcRuntime = 1; } } return ( LinkedObjcRuntime ); }