使用__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排序相关)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM