不用dladdr,还有其他办法吗
时间: 2023-11-04 17:46:20 浏览: 129
定位当前可执行文件和当前模块/库在文件系统- gpakosz/whereami
如果您不想使用 `dladdr` 函数,还有其他一些办法来获取调用者的 IMP。
一种常见的方法是使用 Objective-C 的运行时库来获取调用者的 IMP。您可以使用 `objc_msgSendSuper2` 函数来调用父类的方法,并获取调用者的 IMP。这个函数会返回调用者的 IMP,但需要注意的是,它只适用于调用父类方法的情况。
以下是一个示例代码,展示了如何使用 `objc_msgSendSuper2` 函数来获取调用者的 IMP:
```objc
#import <objc/runtime.h>
#import <objc/message.h>
void calleeMethod() {
// 获取调用者的 IMP
void (*callerIMP)(id, SEL) = (void (*)(id, SEL))objc_msgSendSuper2((struct objc_super){self, [self superclass]}, _cmd);
NSLog(@"Caller IMP: %p", callerIMP);
}
void callerMethod() {
calleeMethod();
}
int main() {
callerMethod();
return 0;
}
```
在上述示例代码中,我们定义了两个方法 `callerMethod` 和 `calleeMethod`。在 `calleeMethod` 中,我们使用 `objc_msgSendSuper2` 函数调用父类的方法,并将其转换为函数指针类型以获取调用者的 IMP。最后,我们通过打印输出来显示调用者的 IMP。
请注意,上述示例代码中的调用者类是一个简单的示例,您需要将其替换为实际的调用者类。
另外,如果您只关注特定函数的调用者,还可以在调用者中传递一个参数,用于标识自身的 IMP。通过这种方式,被调用的函数可以获取调用者的 IMP,并进行相应的处理。
总结而言,除了使用 `dladdr` 函数之外,您还可以使用 Objective-C 运行时库中的方法来获取调用者的 IMP。具体使用哪种方法取决于您的需求和代码结构。
阅读全文