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 );
}
Esempio n. 2
0
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 );
}