使用__attribute__((used, section()))储存函数和变量值

// eventType 入参表示函数对应触发的条件
// 定义一个全局函数,声明不被优化,存储到mach-o的section信息中
// 如下存储的参数名为(eventType连接Func),后期根据此名称取值
#define HF_Init_Func_For(eventType) \
static void HF_Func_##eventType(void); \
__attribute__((used, section("__DATA," ""#eventType "Func"))) \
static const void * __Func__##eventType = HF_Func_##eventType; \
static void HF_Func_##eventType(void)

定义一个待执行函数

HF_Init_Func_For(setup) {
    NSLog(@"这个是自定义的函数");
}

执行标记为setup条件下执行的函数

HF_Call_Func_For_([NSString stringWithFormat:@"%@Func",@"setup"]);

int HF_Call_Func_For_(NSString *eventType) {
    
    Dl_info info;
    dladdr((const void *)&HF_Call_Func_For_, &info);
    struct mach_header_64 * machOHeader = (DTBaseMachHeader *)info.dli_fbase;
    uint64_t mach_header = (DTBaseType)info.dli_fbase;
    const struct section_64 * section = getsectbynamefromheader_64(machOHeader, "__DATA", eventType.UTF8String);
    if (section == NULL) { return -1; }
    size_t size = sizeof(void*);
    for (uint64_t add = mach_header + section->offset; add < mach_header + section->offset + section->size ; add += size) {
    // 注意此处返回为指向函数指针(结构体、基本数据结构等)的指针值
void (**function)(void) = (void (**)(void))add; (*function)(); } return 0; }

以上该方式一个.m文件中只能有一个该类型函数,否则就是重复定义。执行顺序和编译相关(compile sources排序相关)

posted @ 2020-08-17 17:46  雨筱逸悠  阅读(3314)  评论(0编辑  收藏  举报