1

SIMBL を使用してフックする外部アプリの一部の機能をオーバーライドする際に、大きな問題が発生します。

このアプリには、「AppClass」というクラスがあります。このクラスには関数があり、

-(void)doSomething;

これは、バイナリのクラスダンプから取得しました。インターフェイス全体は次のように定義されます。

@interface AppClass : NSObject
{
}

この関数を jr_swizzleMethod:withMethod:error: でオーバーライドしようとしています:

ドキュメントが不足しているため、これが私が思いついたものです。

    #import "JRSwizzle.h"
    #import "AppClass.h"

@interface AppClass (MyPlugin)
- (void)myPlugin_doSomething;
@end

@implementation AppClass (MyPlugin)

- (void)myPlugin_doSomething {
 NSLog(@"lol?");
}

@end

@implementation MyPlugin

+ (void) load {
 Mylugin* plugin = [MyPlugin sharedInstance];

 NSError *err = nil;
 BOOL result = [NSClassFromString(@"AppClass") jr_swizzleMethod:@selector(doSomething) withMethod:@selector(myPlugin_doSomething) error:&err];

 if(!result)
  NSLog(@"<Plugin> Could not install events filter (error: %@)", err);

 NSLog(@"Plugin installed");
}



+ (MyPlugin *)sharedInstance {
 static MyPlugin* plugin = nil;

 if(plugin == nil)
  plugin = [[MyPlugin alloc] init];

 return plugin;
}

@end

それで十分ですよね?しかし、コンパイル時に次のエラーが発生します。

Undefined symbols:
  "_OBJC_CLASS_$_AppClass", referenced from:
      l_OBJC_$_CATEGORY_AppClass_$_MyPlugin in MyPlugin.o
      objc-class-ref-to-AppClass in MyPlugin.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

これを解決するにはどうすればよいですか?

4

1 に答える 1

2

バイナリ (拡張しようとしているアプリ) 内のシンボルを参照するプラグインを作成しています。したがって、これらのシンボルを探す場所をリンカに伝える必要があります (あなたの場合、それは_OBJC_CLASS_$_AppClass、つまりAppClass、バイナリで定義されています)。

-bundle_loader executable_nameこれは、オプションをリンカーに渡すことによって行われます。ld のマニュアル ページを参照してください。

于 2010-11-14T09:46:45.453 に答える