zoukankan      html  css  js  c++  java
  • 使用__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排序相关)

  • 相关阅读:
    set-rebgin
    HTML5开发学习:本地存储Web Sql Database
    Sublime text 入门学习资源篇及其基本使用方法
    web前端不可错过的开发工具–Adobe Brackets
    关于WEB前端开发的工具
    WebStorm使用技巧
    五大浏览器兼容性
    IT解惑真经
    win7下一劳永逸地解决触控板禁用的问题
    PHP+Mysql学习笔记
  • 原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/13518968.html
Copyright © 2011-2022 走看看