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

  • 相关阅读:
    【转载】C++汇编器、连接器
    【转载】vi的使用命令
    JDK,SDK,JRE概念
    iOS 使用xmpp做聊天客户端
    cocopods安装
    用XMPP实现完整Android聊天项目
    xmpp发送文件
    ember.js学习笔记
    html5 drag and drop
    jquery 数组深拷贝
  • 原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/13518968.html
Copyright © 2011-2022 走看看